Créer un diagramme de voronoi à partir de segments de ligne

14

Je cherche un moyen de créer un diagramme de voronoi basé sur des segments de ligne au lieu de points. Voir l'exemple ci-dessous (tiré de cette présentation ).

Idéalement, j'aimerais quelque chose que je puisse écrire à partir de Python, mais une solution utilisant ArcGIS ou similaire serait également acceptable.

diagramme de voronoi à partir de segments de ligne

La seule bibliothèque pour le faire que j'ai trouvée jusqu'à présent est openvoronoi , qui semble prometteuse. Y en a-t-il d'autres?

Snorfalorpagus
la source
1
Cela vous aidera probablement: gis.stackexchange.com/questions/53414/…
Dan C
Merci. Je ne sais pas pourquoi cette question ne s'est pas posée dans mes recherches.
Snorfalorpagus

Réponses:

5

Nous (une équipe universitaire) avons conçu une implémentation pour cela en utilisant un complément ArcGIS 10.0 et ArcObjects. L'application est entièrement gratuite. L'implémentation utilise une méthodologie raster qui prend comme points d'entrée, lignes ou polygones pour créer des diagrammes de Voronoi ordinaires ou multipliés par pondération (ou une combinaison des éléments ci-dessus, c'est-à-dire que vous pouvez utiliser un de chaque type de forme, créant un ensemble de diagrammes unique de jusqu'à trois classes d'entités distinctes). Il est toujours en développement mais devrait être assez stable, surtout si vous ne voulez faire que des lignes. L'addin nécessite la licence Spatial Analyst pour fonctionner. Le code lui-même est open source, alors n'hésitez pas à en faire ce que vous voulez.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Il utilise une méthode similaire à la «répartition euclidienne» décrite dans la réponse de @ radouxju et utilise le raster Flow Direction / Basin pour créer des polygones vectoriels à partir du raster résultant.

Conor
la source
Partie importante pour les personnes intéressées: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn
3

Voronoï est initialement conçu pour les points. Voici les deux méthodes que je peux imaginer pour votre problème (citant les outils ArcGIS, mais probablement possibles avec galbées):

1)

a) créer des points le long des lignes (par exemple, densifier puis présenter les sommets à la ligne)

b) créer des polygones de Thiessen

c) dissoudre les polygones de Thiessen en fonction des lignes qu'ils coupent

2)

a) avec l'analyste spatial, calculer l'allocation euclidienne aux lignes

b) convertir chaque zone en un polygone

radouxju
la source
3

Pour certains clients, quelques collègues de travail et moi avons travaillé sur la création de 2 outils de géotraitement qui font cela. Bien que les outils de géotraitement ne soient pas accessibles au public, le python et le C # que nous avons utilisés sont:

Le wrapper C # et python s'appuient en fait sur l'API C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Notez que l'API consomme beaucoup de mémoire. Ce n'est pas un problème si vous utilisez le géotraitement pour 64 bits, ArcGIS Pro ou QGIS. Il s'agit d'une limitation si vous êtes sur ArcGIS Desktop car il s'agit d'un 32 bits. (Un réseau routier détaillé de 40 000 lignes ou plus devrait suffire pour atteindre la limite de mémoire)

Fabien Ancelin
la source
1
J'ai en fait créé un outil de géotraitement pour ArcMap et ArcGIS Pro qui s'appuie sur la bibliothèque pyvoronoi
Fabien Ancelin
2

ET Geowizards (Un plugin pour Arc) a un outil pour cela qui accepte les polylignes (voir capture d'écran ci-dessous). Malheureusement, vous aurez besoin du produit sous licence pour exécuter l'outil, mais je pense qu'il devrait faire l'affaire.

entrez la description de l'image ici

MAJ742
la source
0

Plus une autre façon de résoudre votre tâche en utilisant PostgreSQL / PostGIS.

Si les lignes sont courtes et simples, exécutez le 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;

Voir le résultat.

Si les lignes sont longues, exécutez le 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;

Voir le résultat.

Si nécessaire, compactez le nombre de points sur les lignes, dans mon exemple c'est le 10 points.

Solutions originales.

Ce script est appelé: ST_VoronoiDiagramsFromLines.

Cyril Mikhalchenko
la source
Je n'ai pas encore exécuté cela, mais il semble qu'il crée les polygones voroni en utilisant les sommets des géométries puis les fusionne (avec une union) s'ils touchent les géométries d'origine. Est-ce exact? Si c'est le cas, c'est une approximation OK tant que vos géométries d'origine ont beaucoup de sommets et pas de longs segments sans aucun.
Snorfalorpagus
Testé par: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko