Это продолжение предыдущего вопроса . Вы увидите, что я новый пользователь PostGIS.
Я посмотрел на достоверность топологии в моих данных и нашел около 1700 проблем топологии в наборе данных наземного покрова (полигона). Это все "Кольцо Self_intersection".
Используя некоторую полезную информацию в этой презентации Пола Рамсея (стр. 20), я попытался соответствующим образом буферизовать свои данные:
ОБНОВЛЕНИЕ schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false и isvalid (buffer (the_geom, 0.0)) = true;
Но я получаю ответ:
ВНИМАНИЕ: Кольцо самопересечения в точке или около нее (отредактировано). ОШИБКА: новая строка для отношения "sgm_buffer" нарушает проверочное ограничение "forcece_geotype_the_geom"
********** Ошибка **********
ОШИБКА: новая строка для отношения «sgm_buffer» нарушает проверочное ограничение «forcece_geotype_the_geom» Состояние SQL: 23514
Я также попробовал просто:
ОБНОВЛЕНИЕ csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)
и получить:
ОШИБКА: новая строка для отношения "sgm_buffer" нарушает проверочное ограничение "forcece_geotype_the_geom"
********** Ошибка **********
ОШИБКА: новая строка для отношения «sgm_buffer» нарушает проверочное ограничение «forcece_geotype_the_geom» Состояние SQL: 23514
Так я предполагаю, что этот метод буфера не будет работать на моих проблемах? Или я что-то не так делаю?
Затем г-н Рамсей продолжает в том же документе предлагать дополнительную технику для работы с полигонами «фигуры 8». Я не совсем понимаю, как написать это полностью в коде (или что он делает и поможет ли это мне):
SELECT ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))'
Так .... может кто-нибудь помочь? Это доказывает настоящий кошмар из-за моих сжатых сроков и ограниченных навыков в PostGIS.
ST_Multi()
заставить все полигоны бытьMULTIPOLYGON
s (это предположение)Ответы:
Я думаю, что происходит то, что ваши самопересекающиеся полигоны становятся мультиполигонами при буферизации.
у вас есть два варианта:
1 удалите ограничение "forcece_geotype_the_geom", вы можете сделать это в pgAdmin
2 поместить результат в новую таблицу вместо обновления старой. это часто хороший способ сделать что-то, потому что тогда вы ничего не меняете в своей исходной таблице. запрос может выглядеть примерно так:
Конечно, вы можете добавить больше полей в новую таблицу.
попробуйте сначала трюк с буфером. Во втором подходе Пол может сказать себе, что влияет на пустую строку. Я не помню, как происходит это волшебство.
источник
У меня были такие же проблемы несколько месяцев назад. В моей базе данных были многоугольники с множеством самопересечений. Я использовал метод Никласа Авена, но он не сработал. Я также использовал другие методы.
Мой метод состоит в том, чтобы удалить самопересечение из моих многоугольников. Вот SQL-запрос, который я использовал:
Я вычислил площадь многоугольника и самопересечения, и я сохраню только те многоугольники, у которых площадь> 1
1
является допуском, поскольку площадь самопересечения очень мала. Также обратите внимание, что преобразование SRID в метры важно, если у вас есть данные в градусах.источник