Ich habe eine Punktedatei, stündliche Umzüge eines Tieres, und ich möchte in der Lage sein, einen Puffer um jeden Punkt zu legen und die Anzahl der nachfolgenden Punkte zu berechnen, die sich innerhalb der Pufferzone befinden. Ich suche nach einer Methode, die entlang der Punktdatei funktioniert, wie ein sich bewegendes Fenster, das nur die nachfolgenden Punkte zählt, die sich innerhalb der Pufferzone befinden.
Zum Beispiel platziere ich an Punkt 10 einen Puffer von 1500 m und möchte wissen, ob Punkt 11 innerhalb des Puffers liegt und wenn ja, ob Punkt 12 innerhalb des Puffers liegt und so weiter. Ich möchte nicht wissen, ob sich Punkt 52 innerhalb der Pufferzone befindet, es sei denn, alle vorherigen Punkte befanden sich innerhalb des Puffers. Ich möchte auch nicht wissen, ob sich die Punkte 9 oder 8 usw. im Puffer befinden.
Ich habe eine zusätzliche Toolbox namens "Moving Window Point Analysis" gefunden und ausprobiert, die als Moving Window für die Punktdatei fungiert. Dies funktioniert gut, aber sehr langsam und schließt alle Punkte ein, die sich innerhalb der Pufferzone befinden, auch wenn es sich nicht um aufeinanderfolgende Punkte handelt. Ich kann keinen Weg finden, um nur aufeinanderfolgende Punkte zu betrachten.
Ich möchte eine Methode, die eine Ausgabetabelle bereitstellt, da ich viele Datenpunkte auf diese Weise betrachten kann.
Ich verwende ArcGIS 10. Jede Hilfe, die jemand leisten kann, wäre sehr dankbar.
quelle
R
, lassen Sie uns dann R-basierte Lösungen untersuchen.Antworten:
Bei einer Liste von Punktpositionen (vorzugsweise in projizierten Koordinaten, damit Entfernungen leicht berechnet werden können) kann dieses Problem mit fünf einfacheren Operationen gelöst werden :
Berechnen Sie Punkt-Punkt-Abstände.
Identifizieren Sie für jeden Punkt i, i = 1, 2, ... die Indizes dieser Punkte in Abständen, die kleiner als der Pufferradius sind (z. B. 1500).
Beschränken Sie diese Indizes auf i oder höher.
Behalten Sie nur die erste aufeinanderfolgende Gruppe von Indizes bei, die keine Unterbrechung aufweisen.
Geben Sie die Anzahl dieser Gruppe aus.
In entspricht
R
jede dieser Operationen einer Operation. Um gelten für jeden Punkt dieser Sequenz ist es bequem, die meisten der Arbeit innerhalb einer Funktion kapseln wir definieren , also:(Eine effizientere Version dieser Funktion finden Sie weiter unten.)
Ich habe diese Funktion flexibel genug gemacht, um verschiedene Punktlisten (
xy
) und Pufferabstände (r
) als Parameter zu akzeptieren .Normalerweise lesen Sie eine Datei mit Punktpositionen (und sortieren Sie sie gegebenenfalls nach Zeit). Um dies in Aktion zu zeigen, werden wir nur einige Beispieldaten zufällig generieren :
Ihr typischer Abstand beträgt 300 * Sqrt (2) = ungefähr 500. Wir führen die Berechnung durch, indem wir diese Funktion auf die Punkte im Array anwenden
xy
(und dann die Ergebnisse wieder anheftenxy
, da dies ein praktisches Format für den Export in ein GIS wäre ):Anschließend analysieren Sie das
result
Array weiter,R
indem Sie es entweder in eine Datei schreiben oder in eine andere Software importieren. Hier ist das Ergebnis für die Beispieldaten :(Denken Sie daran , dass die Zählungen sind die Punkte , an denen sie basieren, so dass jede Zählung 1 oder größer sein müssen.)
Wenn Sie viele tausend Punkte haben, ist diese Methode zu ineffizient : Sie berechnet viel zu viele unnötige Punkt-zu-Punkt-Abstände. Da wir jedoch die Arbeit in die
forward
Funktion eingekapselt haben , lässt sich die Ineffizienz leicht beheben. Hier ist eine Version, die besser funktioniert, wenn mehr als ein paar hundert Punkte beteiligt sind:Um dies zu testen, habe ich wie zuvor zufällige Punkte erstellt, aber zwei Parameter variiert:
n
(die Anzahl der Punkte) und ihre Standardabweichung (oben als 300 fest codiert). Die Standardabweichung bestimmt die durchschnittliche Anzahl von Punkten in jedem Puffer ("Durchschnitt" in der folgenden Tabelle): Je mehr Punkte vorhanden sind, desto länger dauert die Ausführung dieses Algorithmus. (Bei komplexeren Algorithmen hängt die Laufzeit nicht so stark davon ab, wie viele Punkte sich in jedem Puffer befinden.) Hier einige Zeitpunkte:quelle
Ich denke, Ihre beste Wette ist es, eine kleine Routine mit ArcPy zu schreiben. Ich würde so etwas wie diesen Pseudocode erstellen:
Ich bin nicht sicher, was Sie mit den Informationen tun möchten, aber ich nehme an, Sie könnten ein Feld in Ihrer Tabelle erstellen und es mit der Anzahl aufeinanderfolgender Punkte aktualisieren (wenn ja, fügen Sie das Feld zuerst hinzu).
Ich würde empfehlen, Feature-Layer zu erstellen (wie eine Datenbanktabellenansicht, jedoch für Features in Arc). Machen Sie zwei aus den Originaldaten und öffnen Sie einen Aktualisierungscursor auf dem ersten Satz, der Ihre Gesamtsortierung angibt (da ESRI keine vollständigen SQL-Abfragen berücksichtigt). Verwenden Sie den zweiten, um nach Position auszuwählen, und öffnen Sie einen Suchcursor auf dem resultierenden Auswahlsatz.
[BEARBEITEN NACH James ANFRAGE] Mit Model Builder ausarbeiten. Wenn Sie Model Builder noch nicht verwendet haben, müssen Sie nur mit der rechten Maustaste in arcToolbox klicken. Wählen Sie 'Toolbox hinzufügen'. Klicken Sie mit der rechten Maustaste auf die neue Toolbox und klicken Sie auf "Neu-> Modell". Wenn Sie ein neues Modellfenster haben, ziehen Sie die benötigten Werkzeuge und Daten per Drag & Drop in das Fenster und verknüpfen Sie sie visuell (mit dem kleinen Pfeilwerkzeug). Wenn Sie so weit wie möglich gekommen sind (Sie können Ihre Cursor hier nicht hinzufügen), verwenden Sie die Option im Dateimenü des Model Builder, um nach Python zu exportieren. Das bringt Sie den größten Teil des Weges dorthin. Es ist automatisch generierter Code, wird also ein bisschen böse, aber funktional sein. Verwenden Sie dann die Links in meiner Antwort oben, um die Cursor zu verstehen und hinzuzufügen.
Wenn Sie Python noch nicht kennen, haben Sie keine Angst davor, Code zu schreiben! Python ist eine sehr einfache Skriptsprache, mit der Sie schnell Ergebnisse erzielen können. Esri hat auch eine Anleitung dazu.
Wenn Sie mit Ihrem Code nicht weiterkommen, veröffentlichen Sie ihn in diesem Forum und bitten Sie um Hilfe. Es gibt viele Leute hier, die helfen können. Eine Warnung: Stellen Sie sicher, dass Sie die richtige Hilfe von ESRI verwenden. Sie haben die Python-API zwischen den Versionen 9.x und 10 (arcgisscripting bzw. arcpy) massiv geändert. Wenn Sie also ArcGIS 9.x verwenden, finden Sie die entsprechenden Links zu meinen!
quelle
Sie können den Modellbauer in ArcGIS verwenden, um aufeinanderfolgende ID-Werte zu finden. Ich habe mein Modell als Python-Skript exportiert. Der Code generiert einen neuen shp mit aufeinanderfolgenden ID-Werten. !ICH WÜRDE! ist das Basis-ID-Feld. Sie müssen den Pfad, den Namen und den ID-Feldnamen von point2.shp entsprechend Ihrem Fall aktualisieren.
quelle