Страница 1 из 1

Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 18:50
rhot
Получил от коллеги векторные данные. Он уверял, что данные кристально чистые. :?

Изначально ошибка топологии возникла при работе функции rgeos::gBuffer в R. Там полно полигонов, которые имеют дыры, замыкающиеся на границу полигонов, т.е. граница сама на себя перехлёстывается.
См. рисунок: жёлтый цвет - полигон с ошибкой топологии, прозрачные круги - составные точки суррогатного полигона, который нужно удалить.
topology_error.png
topology_error.png (10.58 КБ) 15763 просмотра
Я в курсе, что ArcGIS for Desktop Advanced умеет фиксить ошибки топологии, но только для своего формата данных - GDB. Мне это не совсем подходит, лень конвертить шейп.

Перегонку через растр не предлагать, т.к. это очень затратно как в плане времени, так и ресурсов.

Пробовал v.clean в GRASS: не помогло. Странно, но в GRASS именно такая ошибка топологии почему-то не учтена, поправьте если ошибаюсь.

Пробовал плагин repair for Processing для QGIS. По-моему, он вообще не работает. Оригинальный repair, который требует доустановки софта от Hugo Ledoux, чем отличается?

PostGIS (ST_IsValid()) назвал это Ring self-intersection. Функция ST_MakeValid() не дала результатов.

Можно ли исправить именно эту ошибку топологии автоматом?

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:17
Ariki
А ST_MakeValid вообще ничего не сделал с геометрией или превратил её в корректную геометрию с дыркой, касающейся внешней границы? Ещё ST_Buffer(geom, 0) можно попробовать.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:21
rhot
ST_MakeValid() странно сработал - некоторые полигоны растянулись на несколько км в разные стороны.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:22
KolesovDmitry
Правильно ли я понял, что нужно удалить верхний треугольник серого цвета, вклинивающийся в желтый? А получившееся пустое место присоединить к желтому?

Если так, то по-моему в GRASS все-таки можно такое сделать, хотя и не полностью автоматом (потребуется играть параметрами). Нужно:
1. Создать узлы в пересечениях линий (есть инструмент для этого), если этих узлов еще нет.
2. Удалить области, меньшие по площади заданного порога.

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

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:29
rhot
Что-то наподобие этого?

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

v.clean input=areamap output=areamap_clean1 tool=bpol,rmdupl type=boundary
v.clean input=areamap_clean1 output=areamap_clean2 tool=rmarea type=area threshold=10

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:33
rhot
KolesovDmitry писал(а):Правильно ли я понял, что нужно удалить верхний треугольник серого цвета, вклинивающийся в желтый? А получившееся пустое место присоединить к желтому?
Проблема двояка. Есть треугольники, которые просто суррогаты, т.е. возникли из-за плохоруких операторов, а есть треугольники с осмысленными данными, которые трогать нельзя.
Некоторые полигоны вместо серого треугольника не имеют ничего, т.е. буквально дыра. Значит, инструмент с удалением маленьких полигонов не решит проблему полностью.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 19:37
KolesovDmitry
Да, что-то похожее. Только я бы использовал break, чтобы создать узел на пересечении линий:

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

v.clean input=areamap output=areamap_clean tool=break,rmdupl,rmarea type=boundary threshold=dummy,dummy,10
Но на самом деле я не проверял код, нужно смотреть, что там есть среди инструментов

Re: Полигон замыкается петлёй сам на себя

Добавлено: 09 июн 2016, 21:10
bim2010
Делал двойное преобразование в Mapinfo. Сначала все полигоны преобразовал в полилинии; все линии объединил в одну; разъединить линии; создал полигоны из линий; отсортировал полигоны по площади; удалил самые мелкие. Помогло ~ на 90%.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 13 июн 2016, 14:13
Александр Мурый
По-хорошему, чтобы оценить возможность обработки таких полигонов в GRASS или ещё в каком-либо ПО, нужны тестовые данные. Было бы интересно поэкспериментировать.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 13 июн 2016, 20:28
rhot
Согласен, только данных на 1,5 Гб.
Временно, решил проблему через растр. :?

Re: Полигон замыкается петлёй сам на себя

Добавлено: 13 июн 2016, 22:39
Александр Мурый
rhot писал(а):Согласен, только данных на 1,5 Гб.
Временно, решил проблему через растр. :?
Круто, конечно, только вот почему бы сразу не написать здесь это решение?

Re: Полигон замыкается петлёй сам на себя

Добавлено: 14 июн 2016, 10:37
rhot
Потому что это не решение, а костыль.

Re: Полигон замыкается петлёй сам на себя

Добавлено: 14 июн 2016, 12:39
Ariki
rhot писал(а):Проблема двояка. Есть треугольники, которые просто суррогаты, т.е. возникли из-за плохоруких операторов, а есть треугольники с осмысленными данными, которые трогать нельзя.
Всё-таки нужен критерий, позволяющий отличить осмысленные треугольники от бессмысленных, и тестовый пример с хотя бы несколькими "хорошими" и "плохими" полигонами. Иначе задача не поставлена корректно.