Исправить топологию полигонов в Shape файле с помощью GRASS

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
ajuvolkov
Новоприбывший
Сообщения: 5
Зарегистрирован: 15 ноя 2013, 18:18
Репутация: 0

Исправить топологию полигонов в Shape файле с помощью GRASS

Сообщение ajuvolkov » 15 ноя 2013, 18:56

Здравствуйте, есть такая проблема.
Имеются векторные данные в shape файлах. Если на них натравить ogr2ogr, то он сыпет ошибками:

ERROR 1: TopologyException: found non-noded intersection between LINESTRING (-160489 2.55518e+006, -160396 2.55529e+006) and LINESTRING (-160427 2.55525e+006, -160334 2.55536e+006) at -160411.18098869335 2555270.7874998883

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

Изображение

Пробовал исправить это в автоматическом режиме с помощью GRASS, чего только не пробовал - ни чего не помогает. Не подскажете как это можно исправить? Таких проблемных мест очень много.

Прилагаю исходный shape файл

http://zalil.ru/34814844

Координаты полигона 88.55812539 21.82649204 (можно воспользоваться плагином ZoomToCoordinates для быстрого поиска)

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение trir » 15 ноя 2013, 19:14


Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение Александр Мурый » 15 ноя 2013, 19:23

trir писал(а):OGR + dotNET?
И как это поможет в данном случае?
Редактор материалов, модератор форума

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение trir » 15 ноя 2013, 20:14

Написать код который будет чистить геометрию и сохранять в нужное место...

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение Александр Мурый » 15 ноя 2013, 20:23

trir писал(а):Написать код который будет чистить геометрию и сохранять в нужное место...
Вы знаете, какие именно функции в OGR "чистят" геометрию? И как именно "чистят"? И при чём тут .NET? Вы название темы читали? :)
Редактор материалов, модератор форума

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение trir » 15 ноя 2013, 20:30

Свою написать! Или взять готовые, например из dotspatial

Update: Задачка чем то напоминает - задачу на нахождение выпуклой оболочки...
Последний раз редактировалось trir 15 ноя 2013, 20:36, всего редактировалось 1 раз.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение Александр Мурый » 15 ноя 2013, 20:35

ajuvolkov писал(а):Если на них натравить ogr2ogr, то он сыпет ошибками
Что в данном случае значит "натравить"? Т.к. у меня простое переконвертирование вашего шейп-файла со сменой СК ошибок не выдало.
ajuvolkov писал(а): В общем, более понятно будет если посмотреть скрин-шот.
Лично я по скриншоту ничего не понял. Прогнал шейп-файл через плагин "Проверка топологии", 549 полигонов из 1533 имеют проблемы: "зазор", "наложение" и "недействительная геометрия".
Редактор материалов, модератор форума

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение trir » 15 ноя 2013, 20:43

какие именно функции в OGR "чистят" геометрию?
Самое простое: разобрать кольца на сегменты и поискать пересечения (OGRGeometry::Intersection)

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение HasT » 17 ноя 2013, 08:43

При проверке слоя в QGIS инструментом 'Проверка геометрии' выявлено 37 ошибок.
Через QGIS плагин 'Менеджер БД' импортировал слой в PostGIS БД (поле геометрии the_geom, SRID 4326, имя слоя initiallayer). Таблица в БД имеет поле с типом геометрии "the_geom geometry(MultiPolygonZ,4326)".
Для исправления self-intersection применил ST_Buffer(the_geom, 0.0), для конвертирования geom3d в geom2d применил ST_Force2D.
Запрос:

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

CREATE TABLE fixedlayer AS 
   SELECT ST_Buffer(the_geom, 0.0) AS the_geom, facc_code, cell, wb 
      FROM initiallayer;
UPDATE fixedlayer SET the_geom = ST_Force2D(the_geom);
ALTER TABLE fixedlayer ALTER COLUMN the_geom TYPE geometry(Polygon,4326);
После проверки геометрии (инструмент 'Проверка геометрии') ошибок не обнаружено.

ajuvolkov
Новоприбывший
Сообщения: 5
Зарегистрирован: 15 ноя 2013, 18:18
Репутация: 0

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение ajuvolkov » 18 ноя 2013, 09:23

Александр Мурый писал(а):
ajuvolkov писал(а):Если на них натравить ogr2ogr, то он сыпет ошибками
Что в данном случае значит "натравить"? Т.к. у меня простое переконвертирование вашего шейп-файла со сменой СК ошибок не выдало.
ajuvolkov писал(а): В общем, более понятно будет если посмотреть скрин-шот.
Лично я по скриншоту ничего не понял. Прогнал шейп-файл через плагин "Проверка топологии", 549 полигонов из 1533 имеют проблемы: "зазор", "наложение" и "недействительная геометрия".
Александр, попробуйте вызвать ogr со следующими параметрами:
ogr2ogr -overwrite -clipdst 21.7333 88.458 21.773 88.458 clipped.shp swbdz_54_08.shp

По поводу скриншота, на скриншоте отображен режим редактирования, я зацепил близлежайший узел и немного сместил его. Синим отображается смещенное положение ребер и узла. Обратите внимание на картинку внизу, я подписал порядок обхода узлов при построении ребер полигона.

Изображение

Т.е. получается, что ребро 1-2, 2-3, 3-4 имеют как бы общий отрезок 2-3.

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

После того как вы сделаете перепроекцию данного файла (я меняю проекцию на Гномоническую), OGR опять начнет ругаться на проблемы с топологией, и если загрузить перепроэцированный файл обратно в QGIS, то Topology Checker опять найдет проблемы.

С помощью Grass Tools, а именно через v.clean мне как-то удалось в автоматическом режиме исправить все проблемы, я обрадовался и закрыл Grass, но позже я не смог воспроизвести этот результат :) видимо очень важна последовательность вызовов инструментов v.clean.
Grass попросту удалил ребро 2-3, оставив ребра 1-3, 3-2, 2-4.

Как это сделать еще раз, я не знаю :) просидел пол дня так и ничего не добившись :(

ajuvolkov
Новоприбывший
Сообщения: 5
Зарегистрирован: 15 ноя 2013, 18:18
Репутация: 0

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение ajuvolkov » 18 ноя 2013, 09:44

HasT писал(а):При проверке слоя в QGIS инструментом 'Проверка геометрии' выявлено 37 ошибок.
Через QGIS плагин 'Менеджер БД' импортировал слой в PostGIS БД (поле геометрии the_geom, SRID 4326, имя слоя initiallayer). Таблица в БД имеет поле с типом геометрии "the_geom geometry(MultiPolygonZ,4326)".
Для исправления self-intersection применил ST_Buffer(the_geom, 0.0), для конвертирования geom3d в geom2d применил ST_Force2D.
Запрос:

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

CREATE TABLE fixedlayer AS 
   SELECT ST_Buffer(the_geom, 0.0) AS the_geom, facc_code, cell, wb 
      FROM initiallayer;
UPDATE fixedlayer SET the_geom = ST_Force2D(the_geom);
ALTER TABLE fixedlayer ALTER COLUMN the_geom TYPE geometry(Polygon,4326);
После проверки геометрии (инструмент 'Проверка геометрии') ошибок не обнаружено.
HasT, честно говоря я впервые использую QGIS и не смог сделать то, что вы говорите. У меня почему то не получается приконектиться к БД, получаю connection refused :(

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение HasT » 18 ноя 2013, 12:32

ajuvolkov писал(а): HasT, честно говоря я впервые использую QGIS и не смог сделать то, что вы говорите. У меня почему то не получается приконектиться к БД, получаю connection refused :(
написал в ЛС

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение Александр Мурый » 18 ноя 2013, 13:29

Проблема в "линейных" полигонах с нулевой площадью.
swbdz_54_08.png
swbdz_54_08.png (2.79 КБ) 15711 просмотров
С помощью модуля <v.clean> в GRASS я тоже чистил, но "Проверка топологии" в QGIS выдаёт что-то странное про острова (причём не про нужные нам точки). Может, я чего не понимаю…
Т.к. у вас всего лишь 4 точки с ошибками топологии, проще в QGIS исп-ть плагин "ZoomToCoordinates", увеличивать до ошибочных точек и вручную удалять вершины, создающие "линейные" полигоны. У меня сработало.
Редактор материалов, модератор форума

ajuvolkov
Новоприбывший
Сообщения: 5
Зарегистрирован: 15 ноя 2013, 18:18
Репутация: 0

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение ajuvolkov » 18 ноя 2013, 14:00

Александр Мурый писал(а):Проблема в "линейных" полигонах с нулевой площадью.
swbdz_54_08.png
С помощью модуля <v.clean> в GRASS я тоже чистил, но "Проверка топологии" в QGIS выдаёт что-то странное про острова (причём не про нужные нам точки). Может, я чего не понимаю…
Т.к. у вас всего лишь 4 точки с ошибками топологии, проще в QGIS исп-ть плагин "ZoomToCoordinates", увеличивать до ошибочных точек и вручную удалять вершины, создающие "линейные" полигоны. У меня сработало.
Дело в том, что у меня большое количество файлов, всего их 862 :) не хотелось бы геройствовать врукопашную ))))))
Да и к тому же ogr2ogr может прекрасно работать с одной частью кривого shape-файла, а потом когда ближе подберешься к проблемной области он выдаст ошибку, так что путь правки исходных файлов будет долог и жесток :) хотелось бы меньше боли :)
По уму, сначала нужно сделать v.clean.rmsa (Remove Small Angles), потом применить v.clean.break и v.clean.bpol. Возможно потом надо применить v.clean.prune, но вот что-то ни чего не работает :( Хотя какой то комбинацией этих инструментов удавалось получить требуемый результат, хотя возможно я еще что-то использовал, к сожалению, не помню что именно, был жутко уставшим, т.к. колупался пол дня с этой проблемой :(

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Исправить топологию полигонов в Shape файле с помощью GR

Сообщение Александр Мурый » 18 ноя 2013, 14:16

ajuvolkov писал(а): По уму, сначала нужно сделать v.clean.rmsa (Remove Small Angles), потом применить v.clean.break и v.clean.bpol. Возможно потом надо применить v.clean.prune, но вот что-то ни чего не работает :( Хотя какой то комбинацией этих инструментов удавалось получить требуемый результат(
По уму нужно делать сначала операцию "bpol" и "rmdupl", вместе или последовательно именно в этом порядке (см. мануал), "break" в случае полигоном не нужен. Выставлять порог (thresh) тоже не надо. Это решает проблему, я сейчас проверил, <ogr2ogr> не ругается. Рекомендую в вашем случае делать через SEXTANTE "Анализ", так быстрее.
Редактор материалов, модератор форума

Ответить

Вернуться в «QGIS»

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

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