Как я комбинирую сложные полигоны?

Учитывая два полигона:

POLYGON((1 0, 1 8, 6 4, 1 0))
POLYGON((4 1, 3 5, 4 9, 9 5, 4 1),(4 5, 5 7, 6 7, 4 4, 4 5))

Как я могу вычислить объединение (объединенный полигон)?

enter image description here

Пример Dave использует SQL-сервер для создания объединения, но я должен выполнить то же в коде. Я ищу математическую формулу или пример кода на любом языке, который выставляет фактическую математику. Я пытаюсь произвести карты, которые комбинируют страны динамично в регионы. Я задал связанный вопрос здесь: Группировка географических форм

74
задан Rob 5 December 2017 в 05:42
поделиться

5 ответов

Вам нужно определить, какие точки лежат внутри . После удаления этих точек вы можете вставить один набор «внешних» точек в другой. Ваши точки вставки (например, там, где у вас есть стрелка на картинке справа) - это то место, где вам нужно было удалить точки из входных наборов.

6
ответ дан 24 November 2019 в 12:03
поделиться

Попробуйте gpc .

4
ответ дан 24 November 2019 в 12:03
поделиться

Хороший вопрос! Я никогда не пробовал это раньше, но сейчас попробую.

Во-первых: вам нужно знать, где эти две формы пересекаются.Чтобы сделать это, вы можете посмотреть на каждое ребро в многоугольнике A и увидеть, где оно пересекается и граница в многоугольнике B. В этом примере должно быть две точки пересечения.

Затем: Сделайте форму союза. Вы можете взять все вершины в A и B, а также точки пересечения, а затем исключить вершины, содержащиеся в окончательной форме. Чтобы найти эти точки, похоже, вы можете просто найти любую вершину A, которая находится внутри B, и любую вершину B, которая находится внутри A.

4
ответ дан 24 November 2019 в 12:03
поделиться

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

1
ответ дан 24 November 2019 в 12:03
поделиться

Решение, которое я видел с использованием деревьев BSP, описано здесь .

По сути, он описывает пересечение в терминах объединения ребер многоугольника A , которые находятся внутри многоугольника B (включая частичные ребра и вычисляются с использованием BSP-дерева ). Затем вы можете определить A / B как ~ (~ A / \ ~ B ), где ~ обозначает реверсирование обмотки многоугольник, / обозначает объединение, а / \ обозначает пересечение.

2
ответ дан 24 November 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: