Страница 1 из 1
Полигон замыкается петлёй сам на себя
Добавлено: 09 июн 2016, 18:50
rhot
Получил от коллеги векторные данные. Он уверял, что данные кристально чистые.
Изначально ошибка топологии возникла при работе функции
rgeos::gBuffer в R. Там полно полигонов, которые имеют дыры, замыкающиеся на границу полигонов, т.е. граница сама на себя перехлёстывается.
См. рисунок: жёлтый цвет - полигон с ошибкой топологии, прозрачные круги - составные точки суррогатного полигона, который нужно удалить.
- 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 писал(а):Проблема двояка. Есть треугольники, которые просто суррогаты, т.е. возникли из-за плохоруких операторов, а есть треугольники с осмысленными данными, которые трогать нельзя.
Всё-таки нужен критерий, позволяющий отличить осмысленные треугольники от бессмысленных, и тестовый пример с хотя бы несколькими "хорошими" и "плохими" полигонами. Иначе задача не поставлена корректно.