Полигон замыкается петлёй сам на себя
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Полигон замыкается петлёй сам на себя
Получил от коллеги векторные данные. Он уверял, что данные кристально чистые.
Изначально ошибка топологии возникла при работе функции rgeos::gBuffer в R. Там полно полигонов, которые имеют дыры, замыкающиеся на границу полигонов, т.е. граница сама на себя перехлёстывается.
См. рисунок: жёлтый цвет - полигон с ошибкой топологии, прозрачные круги - составные точки суррогатного полигона, который нужно удалить. Я в курсе, что ArcGIS for Desktop Advanced умеет фиксить ошибки топологии, но только для своего формата данных - GDB. Мне это не совсем подходит, лень конвертить шейп.
Перегонку через растр не предлагать, т.к. это очень затратно как в плане времени, так и ресурсов.
Пробовал v.clean в GRASS: не помогло. Странно, но в GRASS именно такая ошибка топологии почему-то не учтена, поправьте если ошибаюсь.
Пробовал плагин repair for Processing для QGIS. По-моему, он вообще не работает. Оригинальный repair, который требует доустановки софта от Hugo Ledoux, чем отличается?
PostGIS (ST_IsValid()) назвал это Ring self-intersection. Функция ST_MakeValid() не дала результатов.
Можно ли исправить именно эту ошибку топологии автоматом?
Изначально ошибка топологии возникла при работе функции rgeos::gBuffer в R. Там полно полигонов, которые имеют дыры, замыкающиеся на границу полигонов, т.е. граница сама на себя перехлёстывается.
См. рисунок: жёлтый цвет - полигон с ошибкой топологии, прозрачные круги - составные точки суррогатного полигона, который нужно удалить. Я в курсе, что ArcGIS for Desktop Advanced умеет фиксить ошибки топологии, но только для своего формата данных - GDB. Мне это не совсем подходит, лень конвертить шейп.
Перегонку через растр не предлагать, т.к. это очень затратно как в плане времени, так и ресурсов.
Пробовал v.clean в GRASS: не помогло. Странно, но в GRASS именно такая ошибка топологии почему-то не учтена, поправьте если ошибаюсь.
Пробовал плагин repair for Processing для QGIS. По-моему, он вообще не работает. Оригинальный repair, который требует доустановки софта от Hugo Ledoux, чем отличается?
PostGIS (ST_IsValid()) назвал это Ring self-intersection. Функция ST_MakeValid() не дала результатов.
Можно ли исправить именно эту ошибку топологии автоматом?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Полигон замыкается петлёй сам на себя
А ST_MakeValid вообще ничего не сделал с геометрией или превратил её в корректную геометрию с дыркой, касающейся внешней границы? Ещё ST_Buffer(geom, 0) можно попробовать.
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Полигон замыкается петлёй сам на себя
ST_MakeValid() странно сработал - некоторые полигоны растянулись на несколько км в разные стороны.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Полигон замыкается петлёй сам на себя
Правильно ли я понял, что нужно удалить верхний треугольник серого цвета, вклинивающийся в желтый? А получившееся пустое место присоединить к желтому?
Если так, то по-моему в GRASS все-таки можно такое сделать, хотя и не полностью автоматом (потребуется играть параметрами). Нужно:
1. Создать узлы в пересечениях линий (есть инструмент для этого), если этих узлов еще нет.
2. Удалить области, меньшие по площади заданного порога.
Это если говорить о готовых инструментах. Возможно, что получится написать скрипт, который делает то, что нужно, если сформулировать по пунктам, как должен вести себя этот скрипт для разных входных данных.
Если так, то по-моему в GRASS все-таки можно такое сделать, хотя и не полностью автоматом (потребуется играть параметрами). Нужно:
1. Создать узлы в пересечениях линий (есть инструмент для этого), если этих узлов еще нет.
2. Удалить области, меньшие по площади заданного порога.
Это если говорить о готовых инструментах. Возможно, что получится написать скрипт, который делает то, что нужно, если сформулировать по пунктам, как должен вести себя этот скрипт для разных входных данных.
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Полигон замыкается петлёй сам на себя
Что-то наподобие этого?
Код: Выделить всё
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
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Полигон замыкается петлёй сам на себя
Проблема двояка. Есть треугольники, которые просто суррогаты, т.е. возникли из-за плохоруких операторов, а есть треугольники с осмысленными данными, которые трогать нельзя.KolesovDmitry писал(а):Правильно ли я понял, что нужно удалить верхний треугольник серого цвета, вклинивающийся в желтый? А получившееся пустое место присоединить к желтому?
Некоторые полигоны вместо серого треугольника не имеют ничего, т.е. буквально дыра. Значит, инструмент с удалением маленьких полигонов не решит проблему полностью.
Последний раз редактировалось rhot 09 июн 2016, 19:48, всего редактировалось 1 раз.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Полигон замыкается петлёй сам на себя
Да, что-то похожее. Только я бы использовал break, чтобы создать узел на пересечении линий:
Но на самом деле я не проверял код, нужно смотреть, что там есть среди инструментов
Код: Выделить всё
v.clean input=areamap output=areamap_clean tool=break,rmdupl,rmarea type=boundary threshold=dummy,dummy,10
-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: Полигон замыкается петлёй сам на себя
Делал двойное преобразование в Mapinfo. Сначала все полигоны преобразовал в полилинии; все линии объединил в одну; разъединить линии; создал полигоны из линий; отсортировал полигоны по площади; удалил самые мелкие. Помогло ~ на 90%.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Полигон замыкается петлёй сам на себя
По-хорошему, чтобы оценить возможность обработки таких полигонов в GRASS или ещё в каком-либо ПО, нужны тестовые данные. Было бы интересно поэкспериментировать.
Редактор материалов, модератор форума
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Полигон замыкается петлёй сам на себя
Согласен, только данных на 1,5 Гб.
Временно, решил проблему через растр.
Временно, решил проблему через растр.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Полигон замыкается петлёй сам на себя
Круто, конечно, только вот почему бы сразу не написать здесь это решение?rhot писал(а):Согласен, только данных на 1,5 Гб.
Временно, решил проблему через растр.
Редактор материалов, модератор форума
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Полигон замыкается петлёй сам на себя
Потому что это не решение, а костыль.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Полигон замыкается петлёй сам на себя
Всё-таки нужен критерий, позволяющий отличить осмысленные треугольники от бессмысленных, и тестовый пример с хотя бы несколькими "хорошими" и "плохими" полигонами. Иначе задача не поставлена корректно.rhot писал(а):Проблема двояка. Есть треугольники, которые просто суррогаты, т.е. возникли из-за плохоруких операторов, а есть треугольники с осмысленными данными, которые трогать нельзя.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей