Как разделить два пересекающихся многоугольника по средней строке линий общей области (QGIS / python shapely)

9

У меня есть два полигона,

ПОЛИГОН ((- 5 -5, -5 5,5 5,5 -5, -5 -5)) ПОЛИГОН ((1 1, 1 7, 7 7, 7 1, 1 1))

и хочу разделить их равномерно. Результат должен быть разделен вдоль красной отмеченной линии.

Я использую qgis / python, и хочу сделать это с помощью python.

LINESTRING (1 5,5 1)

МНК
источник
4
Насколько общая ваша проблема? Очевидно, вы намереваетесь применить решение не только к этим двум полигонам. Какие виды полигонов вы рассматриваете? Что именно вы подразумеваете под "равномерно"? Должно ли разделение быть вдоль отрезка или вдоль какой-то нелинейной дуги? Что должно произойти, если пересечение многоугольника состоит из нескольких компонентов или не просто связано? Какую форму должен иметь выход - должен ли он разбивать пересечение или каждый из многоугольников, или, может быть, просто линию разделения?
whuber
1
Я работаю с неправильными полигонами и хочу иметь два непересекающихся полигона. в этом случае, оригинальные полигоны в качестве упоминания и желаемый результат - это POLYGON ((- 5 -5, -5 5,1 5,5 1,5 -5, -5 -5)) POLYGON ((1 5, 1 7, 7 7, 7 1,5 1,1 5))
OLS
1
Проблема трудна, когда один или оба многоугольника могут иметь кольца (то есть не быть просто связными).
whuber

Ответы:

5

Я однажды использовал подход с вороными полигонами. Я сделал это вручную, и у меня есть только смутное представление о том, как вы могли бы сделать это с красивой, но вот как это происходит.

Сначала вы извлекаете вершины каждого перекрывающегося многоугольника и создаете из них многоугольники Вороного (вектор> инструменты геометрии> извлекать узлы и вектор> инструменты геометрии> vononoi). Получив форму, вы можете нарисовать линию, которая разделяет область перекрытия ровно на две части. (Ярко-зеленая линия) Вороного

Вы обрезаете слой вороной перекрывающимся многоугольником, удаляете перекрытие из исходных фигур и вставляете обрезанный многоугольник вороной обратно в исходные фигуры. Выберите, объедините, вуаля!

Теперь это выглядит немного грубо, потому что у меня действительно простые формы. Но если вы уплотните его (Вектор> Инструменты геометрии> Геометрия плотности) и добавите примерно 20 узлов между каждой существующей вершиной, вы можете получить это:

densigy_voronoi

Который намного лучше. Легко, если у вас есть только небольшое количество форм для изменения.

fgcartographix
источник
Это хорошая идея. Но откуда взялась эта ярко-зеленая линия и откуда вы знаете, что она разделяет регион на две равные части?
whuber
насколько этот процесс отличается от `SELECT astext (пересечение (geomFromText ('POLYGON ((- 5 -5, -5 5,5 5,5 -5, -5 -5))', 4326), geomFromText ('POLYGON ( (1 1, 1 7, 7 7, 7 1, 1 1)) ', 4326))); astext -------------------------------- ПОЛИГОН ((1 5,5 5,5 1,1 1,1 5 ) '?
OLS
Происходит от приличия вороного многоугольника. Он делит пространство равномерно между точками. Вот почему вы должны уплотнить свои полигоны, потому что в противном случае «средняя» линия не следует за границами. Что касается яркой линии, я рисую ее вручную, чтобы проиллюстрировать, где находится середина ... Что касается команды PostGIS (я новичок в PostGIS), я думаю, что она только выберет пересекающуюся область, но не разделит ее.
fgcartographix
1
Сказав это, я не сказал, что это будет равная часть. Этот метод используется для нахождения центральной линии реки. Если у вас есть залив в реке, средняя линия будет тянуться к нему. но оно не войдет в него, тем самым делая его «центрированным».
fgcartographix