Створіть діаграму voronoi з відрізків рядків


14

Я шукаю спосіб створити діаграму voronoi на основі сегментів рядків замість точок. Дивіться приклад нижче (взято з цієї презентації ).

В ідеалі мені б хотілося щось, що я можу скриптувати з Python, але рішення з використанням ArcGIS або подібного також було б прийнятним.

діаграма вороного з відрізків рядків

Єдина бібліотека для цього, яку я знайшов поки що - openvoronoi , яка виглядає багатообіцяючо. Чи є інші?


1
Можливо, це допоможе: gis.stackexchange.com/questions/53414/…
Dan C

Дякую. Не знаю, чому це запитання не виникло в моїх пошуках.
Snorfalorpagus

Відповіді:


5

Ми (команда університету) розробили для цього реалізацію, використовуючи ArcGIS 10.0 addin та ArcObjects. Додаток повністю безкоштовний. Реалізація використовує растрову методологію, яка приймає в якості точок введення, ліній або багатокутників для створення звичайних або мультиплікативних зважених діаграм Вороного (або комбінації вищезазначених, тобто ви можете використовувати один з кожного типу фігури, створюючи єдину діаграму, встановлену з до три окремі класи ознак). Він ще в розробці, але повинен бути досить стабільним, особливо якщо ви хочете робити тільки лінії. Для роботи додатка потрібна ліцензія просторового аналітика. Сам код є відкритим кодом, тому не соромтеся робити з ним як завгодно.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Він використовує аналогічний метод, як "евклідовий розподіл", описаний у відповіді @ radouxju, і використовує растровий напрямок / басейн для створення векторних багатокутників із результуючого растру.


Важлива частина для зацікавлених: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn

3

Спочатку Voronoï призначений для балів. Ось два способи, які я можу уявити для вашої проблеми (посилаючись на інструменти ArcGIS, але, ймовірно, це можливо з витонченими):

1)

а) створюйте точки вздовж ліній (наприклад, ущільнюйте, потім додайте вершини до рядка)

б) створити багатокутники Тіссена

в) розчинити багатокутники Тіссена на основі прямих, які вони перетинаються

2)

а) за допомогою просторового аналітика обчисліть розподіл Евклідова до рядків

б) перетворити кожну зону на багатокутник


3

Для деяких клієнтів я працював пару однокласників і створив два інструменти для геообробки, які роблять це. Хоча інструменти для геообробки не є загальнодоступними, пітон і C #, які ми використовували:

І C #, і обгортка python насправді покладаються на API C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Зауважте, що API забирає багато пам'яті. Це не проблема, якщо ви використовуєте Geoprocessing для 64-бітових, ArcGIS Pro або QGIS. Це обмеження, якщо ви перебуваєте на ArcGIS Desktop, оскільки це 32 біти. (Детальна дорожня мережа в 40 000 рядів і більше повинна бути достатньою для досягнення межі пам’яті)


1
Я фактично створив інструмент геообробки для ArcMap та ArcGIS Pro, який спирається на бібліотеку pyvoronoi
Fabien Ancelin

2

ET Geowizards (плагін для Arc) має інструмент для цього, який приймає Polylines (див. Скріншот нижче). На жаль, для запуску інструменту вам знадобиться ліцензований продукт, але я думаю, він повинен зробити свою справу.

введіть тут опис зображення


0

Плюс ще один спосіб вирішити свою задачу за допомогою PostgreSQL / PostGIS.

Якщо рядки короткі та прості, запустіть сценарій:

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;

Побачити результат.

Якщо рядки довгі, запустіть сценарій:

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;

Побачити результат.

Якщо потрібно, ущільнюйте кількість точок на лініях, у моєму прикладі це 10 балів.

Оригінальні рішення.

Цей скрипт називається: ST_VoronoiDiagramsFromLines.


Я ще цього не запускав, але схоже, що він створює багатокутники ворони, використовуючи вершини геометрій, потім об'єднує їх (з об'єднанням), якщо вони торкаються оригінальної геометрії. Це правильно? Якщо так, то це нормальне наближення, якщо у ваших оригінальних геометріях є безліч вершин і жодних довгих сегментів.
Snorfalorpagus

Тестував: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Кирило Михальченко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.