Кольцевые самопересечения в PostGIS

10

Это продолжение предыдущего вопроса . Вы увидите, что я новый пользователь 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.

ESRIHelp
источник
1
что возвращает "select geometry_type (the_geom) из предела 1 sgm_buffer"? Кроме того, в связи с продолжительностью 40 часов, упомянутой в другом вопросе, определены ли пространственные индексы в вашей таблице?
diciu
Возможно, вам понадобится ST_Multi()заставить все полигоны быть MULTIPOLYGONs (это предположение)
Mike T
Спасибо за комментарии - diciu Я думаю, что есть индексы, они, кажется, видны в pgAdminIII, но, возможно, мне нужно обновить их? Я мог бы найти решения для ускорения запроса - я не знаю, какое было бы разумное время для его выполнения? Landcover имеет около 20 миллионов функций.
ESRIHelp

Ответы:

12

Я думаю, что происходит то, что ваши самопересекающиеся полигоны становятся мультиполигонами при буферизации.

у вас есть два варианта:

1 удалите ограничение "forcece_geotype_the_geom", вы можете сделать это в pgAdmin
2 поместить результат в новую таблицу вместо обновления старой. это часто хороший способ сделать что-то, потому что тогда вы ничего не меняете в своей исходной таблице. запрос может выглядеть примерно так:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

Конечно, вы можете добавить больше полей в новую таблицу.

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

Никлас Авен
источник
0

У меня были такие же проблемы несколько месяцев назад. В моей базе данных были многоугольники с множеством самопересечений. Я использовал метод Никласа Авена, но он не сработал. Я также использовал другие методы.

Мой метод состоит в том, чтобы удалить самопересечение из моих многоугольников. Вот SQL-запрос, который я использовал:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

Я вычислил площадь многоугольника и самопересечения, и я сохраню только те многоугольники, у которых площадь> 1 1является допуском, поскольку площадь самопересечения очень мала. Также обратите внимание, что преобразование SRID в метры важно, если у вас есть данные в градусах.

Абдиллахи Абди Мохамед
источник