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

Как автоматически исправить ошибки геометрии?

Добавлено: 15 мар 2017, 20:38
Prince660
Есть слой полигонов, созданный машинно. Добрая часть этих полигонов имеет ошибку геометрии так как пересекают сами себя. Вернее сказать один полигон может иметь совпадающие по координатам вершины. Пример
такого полигона на картинке. (Точки с зелёными крестиками и есть те самые ошибки)
Безымянный-1.png
Безымянный-1.png (37.17 КБ) 15284 просмотра
При таких ошибках не представляется возможным использовать слой для дальнейших расчётов.
Поиск по интернету и форуму не дал результатов, нашлись только аналогичные вопросы без ответов.
В отчаянии воспользовался модулем исправления геометрии в ArcGis - ошибки не исправились...

Руками исправлять сотни объектов не вариант. Была мысль написать для этого утилиту на питоне, но при моём уровне программирования это займёт уйму времени.
Подскажите варианты решения проблемы!

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 17 мар 2017, 19:51
Boris
Назовем левую точку А, а правую - Б. В чем ошибка точки А - не ясно из рисунка совершенно.
Если точка Б - это две точки, то конечно это ошибка, но как вы мыслите она должна быть исправлена?

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 18 мар 2017, 10:37
nadiopt
ну как вариант, перегнать в покрытие, пересечения уйдут в новые полигоны, дырки затянутся. потом по площади элиминировать мелочь. Но я не знаю, как при этом не потерять атрибутику. Вариант 2 - перегнать в грид и потом либо уже с ним расчеты вести, либо перегнать обратно в вектор, пересечений тогда не будет

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 18 мар 2017, 15:35
Prince660
Boris писал(а):Назовем левую точку А, а правую - Б. В чем ошибка точки А - не ясно из рисунка совершенно.
Если точка Б - это две точки, то конечно это ошибка, но как вы мыслите она должна быть исправлена?
Обе точки на рисунке относятся к Зелёному полигону, он не полностью на рисунок влез. Получается что точки с этими координатами втречаются в полигоне по 2 раза. Для моих задач достаточно сдвинуть точку хоть на одну десятитысячную долю метра чтобы небыло ошибки и при этом было минимальное отклонение по площади. Получившийся зазор между полигонами особого значения не имеет, после дальнейших операций пересечения с другими полигонами осколочные полигоны буду сливать с более крупными соседними.

nadiopt писал(а):ну как вариант, перегнать в покрытие, пересечения уйдут в новые полигоны, дырки затянутся. потом по площади элиминировать мелочь. Но я не знаю, как при этом не потерять атрибутику. Вариант 2 - перегнать в грид и потом либо уже с ним расчеты вести, либо перегнать обратно в вектор, пересечений тогда не будет
Переганять в грид не вижу смысла, полигоны изначально были получены из растра (.tif) и собственно от туда ошибки и полезли.


Пока для решения написал модуль на Питоне, который мне в отдельный файл сохраняет совпадающие точки с ошибками. Это упращает их исправление, искать в ручную не надо.


Если есть идеи как реализовать модуль для исправления или может кто-то другие модули знает, пишите, буду рад любой информации.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 19 мар 2017, 02:49
bolotoved
В GRASS есть комплекс модулей для построения правильной топологии и ее исправления, до сих пор возможностей грасса в этом плане мне хватало с лихвой, но нужно вникнуть. Посмотрите краем глаза:

https://grasswiki.osgeo.org/wiki/Vector ... y_cleaning
https://grass.osgeo.org/grass73/manuals/v.build.html (обратите внимание на флаг -е, v.build создает файл описания ошибок топологии для всех объектов слоя, затем этот файл скармливается v.clean)
https://grass.osgeo.org/grass73/manuals/v.clean.html

Если приложите фрагмент файла, я на досуге попробую его прогнать через GRASS.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 19 мар 2017, 15:00
Prince660
bolotoved писал(а):В GRASS есть комплекс модулей для построения правильной топологии и ее исправления, до сих пор возможностей грасса в этом плане мне хватало с лихвой, но нужно вникнуть. Посмотрите краем глаза:

https://grasswiki.osgeo.org/wiki/Vector ... y_cleaning
https://grass.osgeo.org/grass73/manuals/v.build.html (обратите внимание на флаг -е, v.build создает файл описания ошибок топологии для всех объектов слоя, затем этот файл скармливается v.clean)
https://grass.osgeo.org/grass73/manuals/v.clean.html

Если приложите фрагмент файла, я на досуге попробую его прогнать через GRASS.

Был бы благодарен за помощ. Потому как с GRASS ещё никогда не работал и сходу разобраться по ссылкам не смог (не силён в английском).

Вот пример файла: Скачать файл

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 19 мар 2017, 17:11
gamm
Prince660 писал(а):Переганять в грид не вижу смысла, полигоны изначально были получены из растра (.tif) и собственно от туда ошибки и полезли.
а не проще тогда векторизатор поправить - векторизатор, обводящий пиксели, пишется за вечер, проверить примыкания - не проблема, как и задать правила, в какую сторону их расширять - либо делать несвязные контура, либо "протоку" прокладывать. А уж потом упрощать с сохранением топологии тем же GEOS-ом, который нынче везде привинчен (R, Python, PostGIS, далее везде ...)

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 19 мар 2017, 18:09
bolotoved
Prince660 писал(а):Вот пример файла
Да уж, файлик, мягко говоря, так себе. Лучше векторизовать заново, но в чем-то другом, если векторизатор писать лень. В том же GRASS векторизатор вполне годный.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 20 мар 2017, 06:39
bolotoved
Помучился, но вменяемого результата не добился. Там ошибки двух типов -- дыры, причем довольно большие и пересечение полигонов. Даже на высоком значении порога не все дыры убираются, но самое неприятное, что появляются новые. Я с таким еще не сталкивался. Думаю, что тут дело в особенностях векторизатора. Судя по атрибутивным данным, восстановить их труда не составит, по этому лучший вар. это векторизовать заново. Если приложите исходный растр, напишу вам скрипт, как это делать в GRASS.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 21 мар 2017, 23:47
Prince660
Вот исходный растр.
curv.zip
исходный растр
(382.43 КБ) 378 скачиваний
Нужно получить полигоны сглаженные, а не строго по ячейкам квадратами созданные.
Я это делал в ArcGis 10.4 - результат уже все видели.
Нужен другой способ создания сглаженых полигонов. Буду рад, если кто-то подскажет.
Если вдруг такая возможность есть в GRASS, то дайте, по возможности, ссылку на русскоязычную инструкцию для чайников.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 25 мар 2017, 09:36
bolotoved
Сорри, был в отъезде. Про Грасс на русском мало, но документация там хорошая и написана понятно, на таком уровне владеть чтением английских мануалов необходимо уметь, и судя по вашим задачам, сильно упростит вам жизнь. Первичное представление можно получить в статьях на гис-лабе: http://gis-lab.info/qa.html в качестве ключевого слова нужно внести "GRASS"

Прилагаю результат векторизации и скрипт с помощью которого он получен. Можно геометрию еще упростить и сгладить используя модуль v.generalize, сейчас там без особого упрощения, только со сглаживанием с порогом в 30 м: https://yadi.sk/d/isrl5VRr3GKtwP

Следует помнить, что шейп-файлы -- не смотря на свою популярность не поддерживают топологию (!!!), и изначально верная топология в GRASS в некоторых случаях при экспорте в шейп может быть нарушена. Я проверил экспортированный шейп, посчитал площади полигонов в QGIS -- не заругался.

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

# создаем БД GRASS
mkdir '/data/pool/test2/GRASSDB'
cd '/data/pool/test2/GRASSDB'

# создаем новую location, 
# флаг -e означает, что после создания, мы выходим из GRASS
grass73 -e -c '/data/pool/test2/CURV.tif' 'experiment'

# создаем новый mapset
grass73 -c '/data/pool/test2/GRASSDB/experiment/curve'

# импортируем растр
r.in.gdal input='/data/pool/test2/CURV.tif' output=curv

# подгоняем регион в котором будут проходить вычисления к разрешению и охвату растра
g.region rast=curv -a

# устанавливаем значение пропуска данных
r.null map=curv setnull=0

# векторизация
# флаг -s приводит к первичному сглаживанию полигонов
r.to.vect -s input=curv output=curv_vect type=area column=value

# упрощение геометрии (сгладим методом chaiken с порогом в 30 м)
v.generalize input=curv_vect output=curv_vect_chaiken_30m method=chaiken \
  threshold=30 error=curv_vect_chaiken_err --overwrite

# экспорт в shp
v.out.ogr input=curv_vect_chaiken_30m type=area format='ESRI_Shapefile' output='/data/pool/test2/' --overwrite

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 27 мар 2017, 13:13
Prince660
bolotoved писал(а):Сорри, был в отъезде. Про Грасс на русском мало, но документация там хорошая и написана понятно, на таком уровне владеть чтением английских мануалов необходимо уметь, и судя по вашим задачам, сильно упростит вам жизнь. Первичное представление можно получить в статьях на гис-лабе: http://gis-lab.info/qa.html в качестве ключевого слова нужно внести "GRASS"

Прилагаю результат векторизации и скрипт с помощью которого он получен. Можно геометрию еще упростить и сгладить используя модуль v.generalize, сейчас там без особого упрощения, только со сглаживанием с порогом в 30 м: https://yadi.sk/d/isrl5VRr3GKtwP

Следует помнить, что шейп-файлы -- не смотря на свою популярность не поддерживают топологию (!!!), и изначально верная топология в GRASS в некоторых случаях при экспорте в шейп может быть нарушена. Я проверил экспортированный шейп, посчитал площади полигонов в QGIS -- не заругался.
Спасибо что заморочились, но мой воз и ныне там. Проверил тот файл что вы выложили в QGIS (проверка топологии) и мне вылезло больше сотни ошибок.

Пока справляюсь с задачей отискивая ошибки различными способами и исправляя их вручную.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 27 мар 2017, 13:51
bolotoved
А что вы примерно делаете с этим шейпом дальше? М.б. это лучше сделать в топологически верной GRASS, чем в неподдерживающем топологию шейпе?

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 27 мар 2017, 14:06
bolotoved
Если вы работаете в ArcGIS, там обязательно должен быть какой-то формат поддерживающий топологию, вероятно нужно при векторизации растра сохранять в этот формат, а не в шейп.

Re: Как автоматически исправить ошибки геометрии?

Добавлено: 27 мар 2017, 15:13
Malyuk_M
Я ошибки геометрии устраняю построением буффера с минимальным "Buffer distasnce"