Wir haben eine Schicht namens Hydrography, die die Wasserfläche für eine bestimmte Aufgabe ist. Ich habe einen Stationspunkt und einen Zielpunkt. Ich muss den Abstand zwischen diesen beiden Punkten berechnen, aber innerhalb der Hydrographie. (Boote können nicht über Land fahren)
Die DefenseService-Entfernungsberechnung sieht passabel aus, scheint jedoch geradlinig zu sein, da kein Raster als Eingabe verwendet wird. Der Euklidische scheint fast da zu sein, aber ich kann nichts finden, was direkt ist.
Ich verwende ArcGIS Explorer 2500, ArcGIS für Server 10.1 SP1 Enterprise, und wir schreiben unsere Dienste und Tools in C #.
Ich habe das Laden der Hydrographie, das Erstellen der IPoints, aber keine Ahnung, was als nächstes zu tun ist!
Jede Hilfe bitte geschätzt.
quelle
Antworten:
Verwenden Sie die Tools für Kostenentfernung und Kostenpfad in der Spatial Analyst-Erweiterung.
Sie können ein Raster aus Ihren Hydrographie-Polygonen erstellen. Stellen Sie dann sicher, dass die Rasterzellen, die Wasser darstellen, einen niedrigen Wert (z. B. 1) und die anderen Rasterzellen einen hohen Wert (z. B. 1000) erhalten. Sie können dieses Raster dann als Kostenentfernungsraster im Kostenpfad-Tool verwenden .
quelle
Ähnliches habe ich für Mittellinien über Kanälen und natürlichen Wasserläufen getan. Der Ansatz, den ich verwendet habe, bestand darin, die Punkte zu TINEN, die TIN zu halbieren und dann eine zweite TIN aus den ursprünglichen Eckpunkten zu erstellen. Die Bisektoren werden dann mit einem modifizierten Dijkstra-Algorithmus durchlaufen, wobei Optionen verworfen werden, sobald klar ist, dass sie nicht die einfachste Lösung bilden . Die Änderung bestand darin, dass die Linie am Lösungspunkt oder an einem vorherigen Pfad enden konnte, falls bereits einer vorhanden war. Hierfür gibt es keine sofort einsatzbereite Lösung. Wenn Sie kein Programmierer sind oder zumindest in der Lage sind, sich auf die gute Seite zu stellen, können Sie nur mit einem Versatz in eine Geodatabase verfolgen und diese ansehen das Feld shape_length.
TIN = Triangular Irregular Network, ein Gitter aus Punkten und Verbindungslinien, sodass jeder Punkt mit seinen nächsten Nachbarn verbunden ist und sich keine Linien schneiden. Siehe hierzu http://en.wikipedia.org/wiki/Delaunay_triangulation . Ich habe die ESRI-TIN-Objekte nicht verwendet, sondern Code für die Triangulation gefunden und im Speicher behalten, beispielsweise http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation .
Für den Algorithmus mit dem kürzesten Pfad siehe http://en.wikipedia.org/wiki/Dijkstra 's_algorithm. Er hat ein schönes Bild. trotz des komplizierten Namens ist es wirklich ganz einfach.
Aus den Punkten, die die Linien bilden, habe ich eine Delaunay-Triangulation durchgeführt, dann den Mittelpunkt jeder Kante des Dreiecks gefunden (Grundgeometrie ... Durchschnitt X, Durchschnitt Y) und dann die Punkte, die in die Polygone fielen, in das Netz eingefügt, das a ergibt Mittelpfad und Links zu allen Eckpunkten an der Grenze. Wenn Sie dann Facetten ausschließen, die den Ufern des Wasserlaufs folgen, verfolgen Sie das Netzwerk mithilfe des Dijkstra-Algorithmus, und Sie finden schließlich einen Pfad von Punkt A zu Punkt B, der ungefähr in der Mitte des Wasserlaufs verläuft. Es wird viele mögliche Pfade geben, daher habe ich jeden Scheitelpunkt gewichtet und einen Pfad angehalten, wenn die kumulative Länge die bereits aufgezeichnete Länge überschritten hat. Wenn sie geringer war, aktualisieren Sie den Scheitelpunkt mit der kürzeren kumulativen Länge - dies reduziert die Menge von Wege, die verfolgt werden, und es kann ziemlich viel geben;
Alternativ können Sie nach dem Triangulieren die Kanten der Dreiecke als Feature-Class in zwei Punktlinien umwandeln, ein Netzwerk erstellen und dann eine Ablaufverfolgung durchführen. Ich bin sicher, dass die ESRI-Ablaufverfolgungsroutinen viel schneller sind als meine, aber ich hatte einen bestimmten Bedarf und konnte ihn nicht mithilfe geometrischer Netzwerke lösen.
quelle
Ich füge dies für jeden in der Zukunft hinzu, der diesen Thread liest.
Hier ist alles, was ich gelernt habe, um mich mit diesem Thema auseinanderzusetzen und einen vollständigen Abstand zwischen den Punkten zu erhalten.
Unsere erste Ausgabe ergab sich aus der statischen Natur von RasterCatalog. Durch Ändern der Raster, auf denen dies basiert, wird das Raster im RasterCatalog NICHT geändert. Es stellte sich heraus, dass unsere eine alte Version hatte, die sich nicht in der Nähe einer Küstenkarte befand. Gelernte Lektion: Erstellen Sie den RasterCatalog jedes Mal neu, wenn Sie die Raster ändern, auf denen er basiert.
Das Distanz-Raster mit hinzugefügten Gewichten wird zu einer ziemlich umständlichen Sache. Sehen Sie sich das folgende Szenario an: Der ursprüngliche Wert des Rasters beträgt 1 Gesamtentfernung, die ich betrachten möchte, beträgt 117 km. Die Zellengröße beträgt 1 Meter. Wenn das Raster jetzt einen gewichteten Wert von 48 hat, beträgt die Gesamtentfernung, die ich sehen möchte, 117 km * 48 !!! Die Entfernung in der CostDistance-Methode ist also nicht die Zellenentfernung, sondern die gewichtete Entfernung, wobei anscheinend der Wert in jeder Zelle addiert wird, bis die Summe jeder Zelle = der Wert, der für die Gesamtentfernung übergeben wurde. Auch wenn die Zellengröße selbst 1 Meter beträgt !!!
Das Distanzraster konzentriert sich alle auf einen Ursprungspunkt. Wenn Sie also die CostDistance-Routine aufrufen, möchten Sie den Ursprungspunkt nicht in diese Liste aufnehmen. Wenn Sie dies tun, erhalten Sie einen Punkt mit einem Abstand von 0. (diese sogar verblüffte ESRI-Unterstützung)
Während viele Methoden den Umschlag verwenden, um ihren Prozess einzuschränken, ignorieren die beiden teuersten Methoden, bei denen ein Wert für das Raster festgelegt und ein Raster ohne einen Bereich innerhalb eines Polygons extrahiert wird, alle Umschlageinstellungen und wenden diesen automatisch automatisch auf das gesamte Raster an. Leider können wir dies nur verkürzen, indem wir massive überlappende Segmente erstellen und ein Segment einem bestimmten umrahmten Bereich zuweisen. Dabei müssen wir jedoch darauf achten (was schwierig ist), dass ein primärer Betriebsbereich nicht im falsch überlappenden Bereich vorhanden ist. (Mit anderen Worten, alle unsere Überlappungen müssen sorgfältig ausgewählt werden, um keine primären Punkte von Interesse zu enthalten!) Der Grund dafür ist, dass wir im RasterCatalog navigieren und das richtige Raster auswählen, basierend darauf, wo sich die ausgewählte Küstenwache befindet. Um unseren Prozess weiter zu verkomplizieren, Die Überlappung muss es uns ermöglichen, bis zu 120 km von unserem Ursprungspunkt entfernt zu navigieren, ohne vom Rand der Karte abzulaufen und nicht mit anderen primären Sonderzielen zu überlappen. Meine Güte.
Das einzige andere, was ich gelernt habe, ist, dass es einfach ist, das Raster zu berechnen, aber wenn Sie entweder ein Loch in das Raster stechen möchten (Blockaden) oder einen Donut mit einem Wert setzen möchten und das Innere des Donuts ein Bei einem Wert von 1 (Verzögerungen wie bei einer Sperre) erhalten Sie eine komplexe Kombination aus Werkzeugen und ArcObject-Aufrufen. Was zur letzten Lektion führt: ArcObjects kann nicht alles. Daher bin ich gelegentlich gezwungen, Dinge in den langsamen, umständlichen Werkzeugen zu tun, die alle in Python geschrieben wurden. Ich habe auch erfahren, dass die Entwickler von ESRI-Tools nichts über die Aufrechterhaltung der Konsistenz wissen. Manchmal nahmen sie eine Rasterdatenbank, manchmal brauchten sie ein Raster und gelegentlich brauchten sie ein Feature-Set. Und sie geben die Daten nicht in demselben Format zurück, das sie als Eingabe benötigen!
Verwirrt? Keine Sorge, es ist ESRI.
quelle