GIS-LAB

Географические информационные системы и дистанционное зондирование


Форумы GIS-Lab.info

Геоинформационные системы (ГИС) и Дистанционное зондирование Земли


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

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести

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

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

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

При таких ошибках не представляется возможным использовать слой для дальнейших расчётов.
Поиск по интернету и форуму не дал результатов, нашлись только аналогичные вопросы без ответов.
В отчаянии воспользовался модулем исправления геометрии в ArcGis - ошибки не исправились...

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

Карты мира меняют первопроходцы и плохие топографы. (В. Брудзинский)
Аватара пользователя
Prince660
Активный участник
 
Зарегистрирован: 25 мар 2011
Откуда: г. Симферорполь (на карте)
 
Сообщения: 100
Репутация: 4

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

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

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

Boris
Гуру
 
Зарегистрирован: 10 апр 2006
Откуда: Париж (на карте)
 
Сообщения: 3867
Репутация: 327
Статьи: 3
Проекты: 1

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

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

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

ин гроссен фамилен нихт клювен клац клац
Аватара пользователя
nadiopt
хрюкало
 
Зарегистрирован: 29 янв 2009
Откуда: Москва-Питер (на карте)
 
Сообщения: 4535
Репутация: 421
Статьи: 4

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

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

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


Обе точки на рисунке относятся к Зелёному полигону, он не полностью на рисунок влез. Получается что точки с этими координатами втречаются в полигоне по 2 раза. Для моих задач достаточно сдвинуть точку хоть на одну десятитысячную долю метра чтобы небыло ошибки и при этом было минимальное отклонение по площади. Получившийся зазор между полигонами особого значения не имеет, после дальнейших операций пересечения с другими полигонами осколочные полигоны буду сливать с более крупными соседними.


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


Переганять в грид не вижу смысла, полигоны изначально были получены из растра (.tif) и собственно от туда ошибки и полезли.


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


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

Карты мира меняют первопроходцы и плохие топографы. (В. Брудзинский)
Аватара пользователя
Prince660
Активный участник
 
Зарегистрирован: 25 мар 2011
Откуда: г. Симферорполь (на карте)
 
Сообщения: 100
Репутация: 4

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

Сообщение bolotoved » 19 мар 2017, 03: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.
  • 0

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

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

Карты мира меняют первопроходцы и плохие топографы. (В. Брудзинский)
Аватара пользователя
Prince660
Активный участник
 
Зарегистрирован: 25 мар 2011
Откуда: г. Симферорполь (на карте)
 
Сообщения: 100
Репутация: 4

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

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

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

gamm
программист
 
Зарегистрирован: 15 окт 2010
Откуда: Казань (на карте)
 
Сообщения: 2466
Репутация: 487

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

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

Prince660 писал(а):Вот пример файла


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

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

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

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

Вот исходный растр.
curv.zip
исходный растр
(382.43 КБ) Скачиваний: 24

Нужно получить полигоны сглаженные, а не строго по ячейкам квадратами созданные.
Я это делал в ArcGis 10.4 - результат уже все видели.
Нужен другой способ создания сглаженых полигонов. Буду рад, если кто-то подскажет.
Если вдруг такая возможность есть в GRASS, то дайте, по возможности, ссылку на русскоязычную инструкцию для чайников.
  • 0

Карты мира меняют первопроходцы и плохие топографы. (В. Брудзинский)
Аватара пользователя
Prince660
Активный участник
 
Зарегистрирован: 25 мар 2011
Откуда: г. Симферорполь (на карте)
 
Сообщения: 100
Репутация: 4

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

Сообщение bolotoved » 25 мар 2017, 10: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
  • 3

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

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

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

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


Спасибо что заморочились, но мой воз и ныне там. Проверил тот файл что вы выложили в QGIS (проверка топологии) и мне вылезло больше сотни ошибок.

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

Карты мира меняют первопроходцы и плохие топографы. (В. Брудзинский)
Аватара пользователя
Prince660
Активный участник
 
Зарегистрирован: 25 мар 2011
Откуда: г. Симферорполь (на карте)
 
Сообщения: 100
Репутация: 4

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

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

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

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

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

bolotoved
Гуру
 
Зарегистрирован: 30 дек 2008
Откуда: Ханты-Мансийск (на карте)
 
Сообщения: 913
Репутация: 230
Статьи: 4
Проекты: 1

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

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

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

Malyuk_M
Новоприбывший
 
Зарегистрирован: 11 фев 2016
Откуда: Kiev (на карте)
 
Сообщения: 13
Репутация: 3

След.

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

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

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


(Геокруг)

© GIS-Lab и авторы, 2002-2013. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).