Объединение непересекающихся векторных полигонов

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
snouman
Новоприбывший
Сообщения: 10
Зарегистрирован: 25 дек 2012, 15:00
Репутация: 1

Объединение непересекающихся векторных полигонов

Сообщение snouman » 24 мар 2021, 20:36

Добрый день,

Может быть, кто-нибудь пробовал или есть какие-нибудь идеи (буфер, полигон в точки и т.д.), как можно объединить несколько векторных неперекрывающихся друг с другом объектов и не имеющих общих сторон. То есть это должен быть объект (замкнутая линия, полигон), охватывающий "внешние" вершины нескольких полигонов, но при этом в целом повторяя их форму (см. прикреп. рисунок, красная линия).
Я пробовал несколько функций в QGIS, в частности Convex Hull и Minimum bounding geometry, но там не получалось то, что нужно. Подойдет любая ГИС, PostGIS, ogr или код на питоне.
Спасибо.
Вложения
полигоны.JPG
полигоны.JPG (38.47 КБ) 721 просмотр

Аватара пользователя
Эдуард Казаков
Гуру
Сообщения: 506
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 500
Ваше звание: NextGIS
Откуда: Санкт-Петербург
Контактная информация:

Re: Объединение непересекающихся векторных полигонов

Сообщение Эдуард Казаков » 24 мар 2021, 22:17

Ну, вообще convex hull по множеству всех вершин это как раз то что отвечает постановке задачи... Попробуйте разные реализации, например из scipy ещё.

Svility
Интересующийся
Сообщения: 46
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 4
Откуда: 32637

Re: Объединение непересекающихся векторных полигонов

Сообщение Svility » 24 мар 2021, 23:31

Так можно попробовать. Склеить нужные полигоны, а после вычислить выпуклую оболочку мульти-геометрии:

Код: Выделить всё

select ST_ConvexHull(a.geom) as geom
from(
SELECT 
       ST_Union(f.geom) as geom
from public.my_polygon f
where id in (123,321)
) a

Ivor
Активный участник
Сообщения: 128
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 38
Откуда: Иркутск

Re: Объединение непересекающихся векторных полигонов

Сообщение Ivor » 25 мар 2021, 02:27

У вас на рисунке невыпуклая оболочка, и, скорее всего, готового универсального решения не найдёте. А решение для частного случая запрограммировать можно хоть на питоне, хоть ещё как

gamm
Гуру
Сообщения: 3388
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 870
Ваше звание: программист
Откуда: Казань

Re: Объединение непересекающихся векторных полигонов

Сообщение gamm » 25 мар 2021, 19:42

Постановка невнятная (сверху соединены вершины, снизу линия втыкается в ребро). Если соединять вершины, то можно написать программу, чтобы поправить выпуклую оболочку. Если две точки ребра выпуклой оболочки лежат на одном контуре, то заменяем ребро на часть контура между точками, "вдавливая" ребро вдоль полигона.

snouman
Новоприбывший
Сообщения: 10
Зарегистрирован: 25 дек 2012, 15:00
Репутация: 1

Re: Объединение непересекающихся векторных полигонов

Сообщение snouman » 25 мар 2021, 23:46

Да, согласен, с точки зрения геометрии постановка задачи не совсем корректная в части выпуклости/невыпуклости.
Тем не менее, еще немного покопавшись в QGIS, я нашел другую функцию - Concave Hull, которая возвращает практически то, что нужно. В PostGIS она тоже есть, и для этих конкретных объектов сработала лучше (предварительно используется ST_Union). Вот такой получился результат (рис.).

Спасибо всем за помощь.
Вложения
concave_hull.JPG
concave_hull.JPG (38.85 КБ) 544 просмотра

gamm
Гуру
Сообщения: 3388
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 870
Ваше звание: программист
Откуда: Казань

Re: Объединение непересекающихся векторных полигонов

Сообщение gamm » 26 мар 2021, 08:25

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

Точно, есть там параметр, RTFM

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей