Crear diagrama voronoi a partir de segmentos de línea


14

Estoy buscando una manera de crear un diagrama de voronoi basado en segmentos de línea en lugar de puntos. Vea el siguiente ejemplo (tomado de esta presentación ).

Idealmente, me gustaría algo que pueda escribir desde Python, pero una solución con ArcGIS o similar también sería aceptable.

diagrama de voronoi de segmentos de línea

La única biblioteca para hacer esto que he encontrado hasta ahora es openvoronoi , que parece prometedora. ¿Hay otros?


1
Esto probablemente ayudará: gis.stackexchange.com/questions/53414/…
Dan C

Gracias. No estoy seguro de por qué esa pregunta no apareció en mis búsquedas.
Snorfalorpagus

Respuestas:


5

Nosotros (un equipo universitario) diseñamos una implementación para esto usando un complemento ArcGIS 10.0 y ArcObjects. La aplicación es completamente gratuita. La implementación utiliza una metodología de trama que toma como puntos de entrada, líneas o polígonos para crear diagramas de Voronoi ponderados ordinarios o multiplicados (o una combinación de los anteriores, es decir, puede usar uno de cada tipo de forma, creando un solo conjunto de diagramas de hasta tres clases de entidad distintas). Todavía está en desarrollo, pero debería ser bastante estable, especialmente si solo desea hacer líneas. El complemento requiere la licencia de Spatial Analyst para funcionar. El código en sí mismo es de código abierto, así que siéntete libre de hacerlo como quieras.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Utiliza un método similar a la "Asignación euclidiana" descrita en la respuesta de @ radouxju y usa la dirección de flujo / ráster de cuenca para crear polígonos vectoriales a partir del ráster resultante.



3

Voronoï está inicialmente diseñado para puntos. Estos son los dos métodos que puedo imaginar para su problema (citando herramientas de ArcGIS, pero probablemente posible con Shapely):

1)

a) crear puntos a lo largo de las líneas (por ejemplo, densificar y luego presentar vértices a línea)

b) crear polígonos de Thiessen

c) disuelva los polígonos de Thiessen en función de las líneas que intersecan

2)

a) con el analista espacial, calcule la asignación euclidiana a las líneas

b) convierte cada zona en un polígono


3

Para algunos clientes, un par de compañeros de trabajo y yo hemos estado trabajando en la creación de 2 herramientas de geoprocesamiento que hacen eso. Si bien las herramientas de geoprocesamiento no están disponibles públicamente, Python y C # que hemos utilizado son:

Tanto el envoltorio de C # como el de Python realmente dependen de la API de C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Tenga en cuenta que la API consume mucha memoria. Esto no es un problema si está utilizando Geoprocesamiento para 64 bits, ArcGIS Pro o QGIS. Esto es una limitación si está en ArcGIS Desktop, ya que tiene 32 bits. (Una red vial detallada de 40,000 filas o más debería ser suficiente para alcanzar el límite de memoria)


1
De hecho, he creado una herramienta de geoprocesamiento para ArcMap y ArcGIS Pro que se basa en la biblioteca pyvoronoi
Fabien Ancelin

2

ET Geowizards (Un complemento para Arc) tiene una herramienta para esto que acepta Polilíneas (ver captura de pantalla a continuación). Desafortunadamente, necesitará el producto con licencia para ejecutar la herramienta, pero creo que debería funcionar.

ingrese la descripción de la imagen aquí


0

Además de una forma más de resolver su tarea usando PostgreSQL / PostGIS.

Si las líneas son cortas y simples, ejecute el script:

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;

Ver el resultado.

Si las líneas son largas, ejecute el script:

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;

Ver el resultado.

Si es necesario, compacte el número de puntos en las líneas, en mi ejemplo, este es el punto 10.

Soluciones originales

Este script se llama: ST_VoronoiDiagramsFromLines.


Todavía no he ejecutado esto, pero parece que crea los polígonos voroni utilizando los vértices de las geometrías y luego los fusiona (con una unión) si tocan las geometrías originales. ¿Es eso correcto? Si es así, es una aproximación correcta siempre que sus geometrías originales tengan muchos vértices y no segmentos largos sin ninguno.
Snorfalorpagus

Probado por: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.