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