Как автоматически исправить ошибки геометрии?
- Prince660
- Активный участник
- Сообщения: 164
- Зарегистрирован: 25 мар 2011, 20:12
- Репутация: 15
- Ваше звание: Питоновод
- Откуда: г. Симферорполь
- Контактная информация:
Как автоматически исправить ошибки геометрии?
Есть слой полигонов, созданный машинно. Добрая часть этих полигонов имеет ошибку геометрии так как пересекают сами себя. Вернее сказать один полигон может иметь совпадающие по координатам вершины. Пример
такого полигона на картинке. (Точки с зелёными крестиками и есть те самые ошибки) При таких ошибках не представляется возможным использовать слой для дальнейших расчётов.
Поиск по интернету и форуму не дал результатов, нашлись только аналогичные вопросы без ответов.
В отчаянии воспользовался модулем исправления геометрии в ArcGis - ошибки не исправились...
Руками исправлять сотни объектов не вариант. Была мысль написать для этого утилиту на питоне, но при моём уровне программирования это займёт уйму времени.
Подскажите варианты решения проблемы!
такого полигона на картинке. (Точки с зелёными крестиками и есть те самые ошибки) При таких ошибках не представляется возможным использовать слой для дальнейших расчётов.
Поиск по интернету и форуму не дал результатов, нашлись только аналогичные вопросы без ответов.
В отчаянии воспользовался модулем исправления геометрии в ArcGis - ошибки не исправились...
Руками исправлять сотни объектов не вариант. Была мысль написать для этого утилиту на питоне, но при моём уровне программирования это займёт уйму времени.
Подскажите варианты решения проблемы!
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Как автоматически исправить ошибки геометрии?
Назовем левую точку А, а правую - Б. В чем ошибка точки А - не ясно из рисунка совершенно.
Если точка Б - это две точки, то конечно это ошибка, но как вы мыслите она должна быть исправлена?
Если точка Б - это две точки, то конечно это ошибка, но как вы мыслите она должна быть исправлена?
- nadiopt
- Гуру
- Сообщения: 4744
- Зарегистрирован: 29 янв 2009, 13:27
- Репутация: 495
- Ваше звание: хрюкало
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
ну как вариант, перегнать в покрытие, пересечения уйдут в новые полигоны, дырки затянутся. потом по площади элиминировать мелочь. Но я не знаю, как при этом не потерять атрибутику. Вариант 2 - перегнать в грид и потом либо уже с ним расчеты вести, либо перегнать обратно в вектор, пересечений тогда не будет
ин гроссен фамилен нихт клювен клац клац
- Prince660
- Активный участник
- Сообщения: 164
- Зарегистрирован: 25 мар 2011, 20:12
- Репутация: 15
- Ваше звание: Питоновод
- Откуда: г. Симферорполь
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Обе точки на рисунке относятся к Зелёному полигону, он не полностью на рисунок влез. Получается что точки с этими координатами втречаются в полигоне по 2 раза. Для моих задач достаточно сдвинуть точку хоть на одну десятитысячную долю метра чтобы небыло ошибки и при этом было минимальное отклонение по площади. Получившийся зазор между полигонами особого значения не имеет, после дальнейших операций пересечения с другими полигонами осколочные полигоны буду сливать с более крупными соседними.Boris писал(а):Назовем левую точку А, а правую - Б. В чем ошибка точки А - не ясно из рисунка совершенно.
Если точка Б - это две точки, то конечно это ошибка, но как вы мыслите она должна быть исправлена?
Переганять в грид не вижу смысла, полигоны изначально были получены из растра (.tif) и собственно от туда ошибки и полезли.nadiopt писал(а):ну как вариант, перегнать в покрытие, пересечения уйдут в новые полигоны, дырки затянутся. потом по площади элиминировать мелочь. Но я не знаю, как при этом не потерять атрибутику. Вариант 2 - перегнать в грид и потом либо уже с ним расчеты вести, либо перегнать обратно в вектор, пересечений тогда не будет
Пока для решения написал модуль на Питоне, который мне в отдельный файл сохраняет совпадающие точки с ошибками. Это упращает их исправление, искать в ручную не надо.
Если есть идеи как реализовать модуль для исправления или может кто-то другие модули знает, пишите, буду рад любой информации.
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
В 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.
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: Как автоматически исправить ошибки геометрии?
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 ещё никогда не работал и сходу разобраться по ссылкам не смог (не силён в английском).
Вот пример файла: Скачать файл
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Как автоматически исправить ошибки геометрии?
а не проще тогда векторизатор поправить - векторизатор, обводящий пиксели, пишется за вечер, проверить примыкания - не проблема, как и задать правила, в какую сторону их расширять - либо делать несвязные контура, либо "протоку" прокладывать. А уж потом упрощать с сохранением топологии тем же GEOS-ом, который нынче везде привинчен (R, Python, PostGIS, далее везде ...)Prince660 писал(а):Переганять в грид не вижу смысла, полигоны изначально были получены из растра (.tif) и собственно от туда ошибки и полезли.
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Да уж, файлик, мягко говоря, так себе. Лучше векторизовать заново, но в чем-то другом, если векторизатор писать лень. В том же GRASS векторизатор вполне годный.Prince660 писал(а):Вот пример файла
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Помучился, но вменяемого результата не добился. Там ошибки двух типов -- дыры, причем довольно большие и пересечение полигонов. Даже на высоком значении порога не все дыры убираются, но самое неприятное, что появляются новые. Я с таким еще не сталкивался. Думаю, что тут дело в особенностях векторизатора. Судя по атрибутивным данным, восстановить их труда не составит, по этому лучший вар. это векторизовать заново. Если приложите исходный растр, напишу вам скрипт, как это делать в GRASS.
- Prince660
- Активный участник
- Сообщения: 164
- Зарегистрирован: 25 мар 2011, 20:12
- Репутация: 15
- Ваше звание: Питоновод
- Откуда: г. Симферорполь
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Вот исходный растр.
Я это делал в ArcGis 10.4 - результат уже все видели.
Нужен другой способ создания сглаженых полигонов. Буду рад, если кто-то подскажет.
Если вдруг такая возможность есть в GRASS, то дайте, по возможности, ссылку на русскоязычную инструкцию для чайников.
Нужно получить полигоны сглаженные, а не строго по ячейкам квадратами созданные.
Я это делал в ArcGis 10.4 - результат уже все видели.
Нужен другой способ создания сглаженых полигонов. Буду рад, если кто-то подскажет.
Если вдруг такая возможность есть в GRASS, то дайте, по возможности, ссылку на русскоязычную инструкцию для чайников.
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Сорри, был в отъезде. Про Грасс на русском мало, но документация там хорошая и написана понятно, на таком уровне владеть чтением английских мануалов необходимо уметь, и судя по вашим задачам, сильно упростит вам жизнь. Первичное представление можно получить в статьях на гис-лабе: http://gis-lab.info/qa.html в качестве ключевого слова нужно внести "GRASS"
Прилагаю результат векторизации и скрипт с помощью которого он получен. Можно геометрию еще упростить и сгладить используя модуль v.generalize, сейчас там без особого упрощения, только со сглаживанием с порогом в 30 м: https://yadi.sk/d/isrl5VRr3GKtwP
Следует помнить, что шейп-файлы -- не смотря на свою популярность не поддерживают топологию (!!!), и изначально верная топология в GRASS в некоторых случаях при экспорте в шейп может быть нарушена. Я проверил экспортированный шейп, посчитал площади полигонов в QGIS -- не заругался.
Прилагаю результат векторизации и скрипт с помощью которого он получен. Можно геометрию еще упростить и сгладить используя модуль 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: Как автоматически исправить ошибки геометрии?
Спасибо что заморочились, но мой воз и ныне там. Проверил тот файл что вы выложили в QGIS (проверка топологии) и мне вылезло больше сотни ошибок.bolotoved писал(а):Сорри, был в отъезде. Про Грасс на русском мало, но документация там хорошая и написана понятно, на таком уровне владеть чтением английских мануалов необходимо уметь, и судя по вашим задачам, сильно упростит вам жизнь. Первичное представление можно получить в статьях на гис-лабе: http://gis-lab.info/qa.html в качестве ключевого слова нужно внести "GRASS"
Прилагаю результат векторизации и скрипт с помощью которого он получен. Можно геометрию еще упростить и сгладить используя модуль v.generalize, сейчас там без особого упрощения, только со сглаживанием с порогом в 30 м: https://yadi.sk/d/isrl5VRr3GKtwP
Следует помнить, что шейп-файлы -- не смотря на свою популярность не поддерживают топологию (!!!), и изначально верная топология в GRASS в некоторых случаях при экспорте в шейп может быть нарушена. Я проверил экспортированный шейп, посчитал площади полигонов в QGIS -- не заругался.
Пока справляюсь с задачей отискивая ошибки различными способами и исправляя их вручную.
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
А что вы примерно делаете с этим шейпом дальше? М.б. это лучше сделать в топологически верной GRASS, чем в неподдерживающем топологию шейпе?
-
- Гуру
- Сообщения: 920
- Зарегистрирован: 30 дек 2008, 14:11
- Репутация: 236
- Откуда: Ханты-Мансийск
- Контактная информация:
Re: Как автоматически исправить ошибки геометрии?
Если вы работаете в ArcGIS, там обязательно должен быть какой-то формат поддерживающий топологию, вероятно нужно при векторизации растра сохранять в этот формат, а не в шейп.
-
- Интересующийся
- Сообщения: 16
- Зарегистрирован: 11 фев 2016, 14:08
- Репутация: 3
- Откуда: Kiev
Re: Как автоматически исправить ошибки геометрии?
Я ошибки геометрии устраняю построением буффера с минимальным "Buffer distasnce"
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 28 гостей