Erstellen Sie ein Voronoi-Diagramm aus Liniensegmenten


14

Ich suche nach einer Möglichkeit, ein Voronoi-Diagramm zu erstellen, das auf Liniensegmenten anstelle von Punkten basiert. Siehe folgendes Beispiel (entnommen aus dieser Präsentation ).

Idealerweise hätte ich gerne etwas, das ich mit Python schreiben kann, aber eine Lösung mit ArcGIS oder ähnlichem wäre auch akzeptabel.

Voronoi-Diagramm aus Liniensegmenten

Die einzige Bibliothek, die ich bisher gefunden habe, ist openvoronoi , was vielversprechend aussieht. Gibt es noch andere?


1
Dies wird wahrscheinlich helfen: gis.stackexchange.com/questions/53414/…
Dan C

Vielen Dank. Ich bin mir nicht sicher, warum diese Frage bei meinen Suchen nicht auftauchte.
Snorfalorpagus

Antworten:


5

Wir (ein Universitäts-Team) haben hierfür eine Implementierung mit einem ArcGIS 10.0-Add-In und ArcObjects entworfen. Die Anwendung ist völlig kostenlos. Die Implementierung verwendet eine Rastermethode, die als Eingabepunkte Linien oder Polygone verwendet, um gewöhnliche oder mehrfach gewichtete Voronoi-Diagramme zu erstellen (oder eine Kombination der oben genannten Methoden, dh Sie können einen von jedem Formtyp verwenden und ein einzelnes Diagrammset von bis erstellen drei verschiedene Feature-Classes). Es ist noch in der Entwicklung, sollte aber ziemlich stabil sein, besonders wenn Sie nur Linien machen wollen. Für das Add-In ist die Spatial Analyst-Lizenz erforderlich. Der Code selbst ist Open Source. Sie können ihn also nach Belieben verwenden.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Es verwendet eine ähnliche Methode wie die in @ radouxjus Antwort beschriebene "Euklidische Allokation" und verwendet das Raster "Fließrichtung / Becken", um aus dem resultierenden Raster Vektorpolygone zu erstellen.



3

Voronoï ist ursprünglich für Punkte konzipiert. Hier sind die beiden Methoden, die ich mir für Ihr Problem vorstellen kann (unter Berufung auf ArcGIS-Tools, aber wahrscheinlich mit Shapely möglich):

1)

a) Punkte entlang der Linien erzeugen (z. B. verdichten, dann Eckpunkte zur Linie setzen)

b) Erstellen Sie Thiessen-Polygone

c) Lösen Sie die Thiessen-Polygone anhand der Linien auf, die sie schneiden

2)

a) Berechnen Sie mit dem räumlichen Analytiker die euklidische Zuordnung zu den Linien

b) Wandle jede Zone in ein Polygon um


3

Für einige Kunden haben ein paar Kollegen und ich daran gearbeitet, zwei Geoverarbeitungswerkzeuge zu erstellen, die dies tun. Während die Geoverarbeitungswerkzeuge nicht öffentlich verfügbar sind, haben wir folgende Python- und C # -Varianten verwendet:

Sowohl der C # - als auch der Python-Wrapper basieren auf der C ++ Boost Voronoi-API: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Beachten Sie, dass die API viel Speicher belegt. Dies ist kein Problem, wenn Sie Geoverarbeitung für 64-Bit, ArcGIS Pro oder QGIS verwenden. Dies ist eine Einschränkung, wenn Sie ArcGIS Desktop als 32-Bit-Version verwenden. (Ein detailliertes Straßennetz von 40.000 Zeilen oder mehr sollte ausreichen, um die Speichergrenze zu erreichen.)


1
Ich habe ein Geoverarbeitungswerkzeug für ArcMap und ArcGIS Pro erstellt, das auf der Pyvoronoi-Bibliothek basiert: github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien Ancelin

2

ET Geowizards (Ein Plugin für Arc) hat ein Tool, das Polylinien akzeptiert (siehe Abbildung unten). Leider benötigen Sie das lizenzierte Produkt, um das Tool auszuführen, aber ich denke, es sollte den Trick tun.

Bildbeschreibung hier eingeben


0

Und noch eine Möglichkeit, Ihre Aufgabe mit PostgreSQL / PostGIS zu lösen.

Wenn die Zeilen kurz und einfach sind, führen Sie das Skript aus:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Sehen Sie das Ergebnis.

Wenn die Zeilen lang sind, führen Sie das Skript aus:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Sehen Sie das Ergebnis.

Verdichten Sie bei Bedarf die Anzahl der Punkte auf den Linien. In meinem Beispiel sind dies die 10 Punkte.

Originelle Lösungen.

Dieses Skript heißt: ST_VoronoiDiagramsFromLines.


Ich habe dies noch nicht ausgeführt, aber es sieht so aus, als würden die Voroni-Polygone unter Verwendung der Scheitelpunkte der Geometrien erstellt und dann (mit einer Vereinigung) zusammengeführt, wenn sie die ursprünglichen Geometrien berühren. Ist das korrekt? Wenn ja, ist es eine gute Annäherung, solange Ihre ursprünglichen Geometrien viele Scheitelpunkte und keine langen Segmente ohne Scheitelpunkte haben.
Snorfalorpagus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.