Создать диаграмму вороной из отрезков

14

Я ищу способ создать диаграмму Вороного, основанную на отрезках, а не на точках. Смотрите пример ниже (взят из этой презентации ).

В идеале мне бы хотелось написать что-нибудь из Python, но также было бы приемлемо решение с использованием ArcGIS или аналогичного.

вороной график из отрезков

Единственная библиотека для этого, которую я нашел, - это openvoronoi , которая выглядит многообещающе. Есть ли другие?

Snorfalorpagus
источник
1
Это, вероятно, поможет: gis.stackexchange.com/questions/53414/…
Dan C
Благодарю. Не уверен, почему этот вопрос не возник в моих поисках.
Снорфалорпагус

Ответы:

5

Мы (университетская команда) разработали реализацию для этого с использованием надстройки ArcGIS 10.0 и ArcObjects. Приложение полностью бесплатное. Реализация использует растровую методологию, которая использует в качестве входных точек, линий или многоугольников для создания обыкновенных или умноженных на несколько диаграмм Вороного диаграммы (или комбинацию вышеупомянутого, т.е. вы можете использовать один из каждого типа фигуры, создавая одну диаграмму из набора до три отдельных класса объектов). Он все еще находится в разработке, но должен быть достаточно стабильным, особенно если вы хотите делать только строки. Для работы надстройки требуется лицензия Spatial Analyst. Сам код с открытым исходным кодом, поэтому не стесняйтесь делать с ним, как вам угодно.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Он использует метод, аналогичный «евклидовому распределению», описанному в ответе @ radouxju, и использует растровое направление / растровое направление для создания векторных многоугольников из результирующего растра.

Конор
источник
Важная часть для заинтересованных: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn
3

Вороной изначально рассчитан на очки. Вот два метода, которые я могу представить для вашей проблемы (со ссылкой на инструменты ArcGIS, но, возможно, это возможно с помощью shapely):

1)

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

б) создать полигоны Тиссена

в) растворить многоугольники Тиссена на основе линий, которые они пересекают

2)

а) с помощью пространственного аналитика вычислите евклидово распределение по линиям

б) преобразовать каждую зону в многоугольник

radouxju
источник
3

Для некоторых клиентов пара коллег и я работали над созданием двух инструментов геообработки, которые делают это. Хотя инструменты геообработки не являются общедоступными, мы использовали следующие Python и C #:

И C #, и оболочка python фактически используют API C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm.

Обратите внимание, что API потребляет много памяти. Это не проблема, если вы используете геообработку для 64 бит, ArcGIS Pro или QGIS. Это ограничение, если вы используете ArcGIS Desktop, поскольку оно 32-битное. (Подробная дорожная сеть из 40000 строк или более должна быть достаточной для достижения предела памяти)

Фабьен Анселин
источник
1
Я действительно создал инструмент геообработки для ArcMap и ArcGIS Pro, который опирается на библиотеку pyvoronoi: github.com/fabanc/Boost-Voronoi-For-ArcGIS
Фабьен Анселин,
2

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

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

MAJ742
источник
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.

Кирилл Михальченко
источник
Я еще не запускал это, но похоже, что он создает полигоны ворони, используя вершины геометрий, а затем объединяет их (с объединением), если они касаются исходных геометрий. Это верно? Если это так, то это нормальное приближение, если в вашей исходной геометрии много вершин и нет длинных сегментов без них.
Снорфалорпаг
Протестировано: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Кирилл Михальченко