Auf der Suche nach einer schnellen Open-Source-Raster-Kosten-Distanz-Funktion zur Verwendung im Code

9

Ich habe das Internet nach einer schnellen Open-Source-Funktion zur Kostenentfernung durchsucht, die ich in meinen Code einbetten kann. Die Funktionalität sollte grundsätzlich wie die ArcGIS-Implementierung funktionieren , bei der ich ein Quell- und ein Kostenraster angeben und ein Kostenentfernungsraster ausgeben kann. Die Implementierung muss jedoch nicht so ausgefeilt sein wie ArcGIS, da ich nicht unbedingt "Raster" mit eingebetteten Geometadaten eingeben muss. Eine Signatur mit einfachen numerischen Arrays reicht aus, da ich überprüfen kann, ob sich die Daten korrekt überschneiden Zur Zeit rufe ich die Funktion auf.

Meine spezielle Absicht ist es, die Kostenentfernung zu einem einzelnen Punkt in der Mitte eines 1000 x 1000-Kostenrasters basierend auf einem Benutzerklick zu berechnen. Daher ist eine schnelle Ausführung sehr wichtig.

Die Implementierung von AC # wäre ideal, aber ich werde mir alles ansehen, was da draußen ist.

Kennt jemand eine Open-Source-Bibliothek, die dies unterstützt? Danke für Ihre Hilfe!

atogle
quelle

Antworten:

5

GRASS GIS hat eine C-Implementierung in r.cost( Quelle , Dokumentation ), die einen Min-Heap verwendet . Alternativ können Sie ein Grafikpaket wie QuickGraph und Floyd-Warshall verwenden , um die Kosten zu berechnen.

Die jüngsten Änderungen in GRASS 6.4 haben die Kosten erheblich erhöht , sodass die Leistung möglicherweise gut genug ist: Auf meinem Laptop dauert es ungefähr 3 Sekunden für eine 1- Millionen-Zellenregion oder 5 Sekunden bei aktiviertem Ritterzug . GRASS ist eine C-Anwendung, keine Drop-In-Lösung für eine C # -Codebasis. Wenn Sie in Ordnung sind, Ihrem Stapel hinzuzufügen, können Sie mit PyWPS GRASS aufrufen und das Ergebnis dann an einer anderen Stelle in Ihrer Anwendung verwenden.

scw
quelle
Ich werde dies in einer Webanwendung verwenden, daher ist es mein Ziel, den Vorgang in nur wenigen Sekunden abzuschließen. Ich werde immer nur eine einzelne Zielzelle und einen relativ engen maximalen Kostenabstand haben (der Abstand von der mittleren Zielzelle zum Rand des Kostenrasters, unter der Annahme einer geraden Linie bei minimalen Kosten). Meine Tests mit ArcMap unter diesen Bedingungen lassen mich denken, dass dies möglich ist. Irgendwelche Tipps oder Erfahrungen mit GRASS in C #?
Google
Ich habe meine Frage aktualisiert, um Ihre Fragen zu beantworten. Sie begann als Kommentar, wurde aber zu lang. Ich hoffe, das hilft!
Scw
Danke scw! Dies sind alles großartige Informationen, aber sie bringen mich nicht wirklich dahin, wo ich sein muss, es sei denn, ich portiere GRASS-Code (was ich nicht unbedingt tun möchte). Vielleicht gibt es da draußen noch ein paar andere Rasterfreaks mit ein paar Tipps. Ich werde mich weiter damit befassen und die Lösung veröffentlichen, auf die ich mich festgelegt habe.
Google
Vielleicht können Sie sich an Ihren Kollegen wenden: azavea.com/research/staff-research-projects/map-algebra ;-) Ich habe den GRASS-Code vorgeschlagen, da es sich um eine robuste und schnelle Implementierung handelt. C # ist relativ neu im Geoverarbeitungsbereich und existiert bereits Implementierungen können schwierig zu bekommen sein.
Scw
scw - dort begann eigentlich meine Reise. Mein Problem ist, dass seine Implementierung Verarbeitungszeit für qualitativ hochwertige Berechnungen einbüßt. Wir arbeiten jetzt an einem Algorithmus, um das Gegenteil zu erreichen. GRASS ist ein großartiger Vorschlag, ich habe einfach keine Möglichkeit, ihn tatsächlich zu nutzen. =)
atogle
3

Ich habe die r.costFunktion in GRASS oft benutzt. 1000 * 1000 Gitter waren auf einem normalen Laptop kein Problem. Es befindet sich auch ein R-Paket (gdistance, http://r-forge.r-project.org/projects/gdistance/ ) in der Entwicklung. Ich fand GRASS viel schneller.

johannes
quelle