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

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

Добавлено: 15 ноя 2013, 18:56
ajuvolkov
Здравствуйте, есть такая проблема.
Имеются векторные данные в 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 для быстрого поиска)

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

Добавлено: 15 ноя 2013, 19:14
trir

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

Добавлено: 15 ноя 2013, 19:23
Александр Мурый
trir писал(а):OGR + dotNET?
И как это поможет в данном случае?

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

Добавлено: 15 ноя 2013, 20:14
trir
Написать код который будет чистить геометрию и сохранять в нужное место...

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

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

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

Добавлено: 15 ноя 2013, 20:30
trir
Свою написать! Или взять готовые, например из dotspatial

Update: Задачка чем то напоминает - задачу на нахождение выпуклой оболочки...

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

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

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

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

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

Добавлено: 17 ноя 2013, 08:43
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);
После проверки геометрии (инструмент 'Проверка геометрии') ошибок не обнаружено.

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

Добавлено: 18 ноя 2013, 09:23
ajuvolkov
Александр Мурый писал(а):
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.

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

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

Добавлено: 18 ноя 2013, 09:44
ajuvolkov
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 :(

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

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

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

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

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

Добавлено: 18 ноя 2013, 14:00
ajuvolkov
Александр Мурый писал(а):Проблема в "линейных" полигонах с нулевой площадью.
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, но вот что-то ни чего не работает :( Хотя какой то комбинацией этих инструментов удавалось получить требуемый результат, хотя возможно я еще что-то использовал, к сожалению, не помню что именно, был жутко уставшим, т.к. колупался пол дня с этой проблемой :(

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 "Анализ", так быстрее.