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

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Аватара пользователя
Prince660
Активный участник
Сообщения: 164
Зарегистрирован: 25 мар 2011, 20:12
Репутация: 15
Ваше звание: Питоновод
Откуда: г. Симферорполь
Контактная информация:

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

Сообщение Prince660 » 15 мар 2017, 20:38

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

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

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

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

Сообщение Boris » 17 мар 2017, 19:51

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

Аватара пользователя
nadiopt
Гуру
Сообщения: 4744
Зарегистрирован: 29 янв 2009, 13:27
Репутация: 495
Ваше звание: хрюкало
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение nadiopt » 18 мар 2017, 10:37

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

Аватара пользователя
Prince660
Активный участник
Сообщения: 164
Зарегистрирован: 25 мар 2011, 20:12
Репутация: 15
Ваше звание: Питоновод
Откуда: г. Симферорполь
Контактная информация:

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

Сообщение Prince660 » 18 мар 2017, 15:35

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

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


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


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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 19 мар 2017, 02:49

В 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.

Аватара пользователя
Prince660
Активный участник
Сообщения: 164
Зарегистрирован: 25 мар 2011, 20:12
Репутация: 15
Ваше звание: Питоновод
Откуда: г. Симферорполь
Контактная информация:

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

Сообщение Prince660 » 19 мар 2017, 15:00

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 ещё никогда не работал и сходу разобраться по ссылкам не смог (не силён в английском).

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

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 19 мар 2017, 17:11

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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 19 мар 2017, 18:09

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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 20 мар 2017, 06:39

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

Аватара пользователя
Prince660
Активный участник
Сообщения: 164
Зарегистрирован: 25 мар 2011, 20:12
Репутация: 15
Ваше звание: Питоновод
Откуда: г. Симферорполь
Контактная информация:

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

Сообщение Prince660 » 21 мар 2017, 23:47

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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 25 мар 2017, 09:36

Сорри, был в отъезде. Про Грасс на русском мало, но документация там хорошая и написана понятно, на таком уровне владеть чтением английских мануалов необходимо уметь, и судя по вашим задачам, сильно упростит вам жизнь. Первичное представление можно получить в статьях на гис-лабе: 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

Аватара пользователя
Prince660
Активный участник
Сообщения: 164
Зарегистрирован: 25 мар 2011, 20:12
Репутация: 15
Ваше звание: Питоновод
Откуда: г. Симферорполь
Контактная информация:

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

Сообщение Prince660 » 27 мар 2017, 13:13

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

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

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

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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 27 мар 2017, 13:51

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

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

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

Сообщение bolotoved » 27 мар 2017, 14:06

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

Malyuk_M
Интересующийся
Сообщения: 16
Зарегистрирован: 11 фев 2016, 14:08
Репутация: 3
Откуда: Kiev

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

Сообщение Malyuk_M » 27 мар 2017, 15:13

Я ошибки геометрии устраняю построением буффера с минимальным "Buffer distasnce"

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей