Autointerseções de anéis no PostGIS

10

Este é um seguimento da pergunta anterior . Você verá que eu sou um novo usuário do PostGIS.

Examinei a validade da topologia em meus dados e localizei cerca de 1700 problemas de topologia no conjunto de dados de cobertura de terra (polígono). Estes são todos "Ring Self_intersection".

Usando algumas informações úteis nesta apresentação de Paul Ramsay (página 20), tentei armazenar meus dados em buffer de acordo:

UPDATE schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false e isvalid (buffer (the_geom, 0.0)) = true;

Mas eu recebo a resposta:

AVISO: Toque em auto-interseção no ponto ou próximo (editado) ERRO: a nova linha da relação "sgm_buffer" viola a restrição de verificação "enforce_geotype_the_geom"

********** Erro **********

ERRO: a nova linha da relação "sgm_buffer" viola a restrição de verificação "enforce_geotype_the_geom" Estado SQL: 23514

Eu também tentei apenas:

UPDATE csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)

e pegue:

ERRO: a nova linha da relação "sgm_buffer" viola a restrição de verificação "enforce_geotype_the_geom"

********** Erro **********

ERRO: a nova linha da relação "sgm_buffer" viola a restrição de verificação "enforce_geotype_the_geom" Estado SQL: 23514

Então, assumo que essa técnica de buffer não funcionará nos meus problemas? Ou estou fazendo algo errado?

Ramsay prossegue no mesmo documento sugerindo uma técnica adicional para lidar com polígonos de "número 8". Eu não entendo completamente como escrever isso na íntegra no código (ou o que está fazendo e se isso vai me ajudar):

SELECT ST_BuildArea (ST_Union ('LINESTRING VAZIO', ST_ExteriorRing ('POLYGON ((...))')

Então .... alguém pode ajudar? Isso está provando um verdadeiro pesadelo com meus prazos apertados e habilidades limitadas no PostGIS.

ESRIHelp
fonte
1
o que "seleciona geometry_type (the_geom) do sgm_buffer limit 1" retorna? Além disso, relacionado ao tempo de execução de 40 horas mencionado na outra pergunta, existem índices espaciais definidos em sua tabela?
diciu 03/10/11
Você pode precisar de um ST_Multi()para forçar todos os polígonos para ser MULTIPOLYGONs (esta é uma suposição)
Mike T
Obrigado pelos comentários - diciu Acho que existem índices, eles parecem visíveis no pgAdminIII, mas talvez eu precise atualizá-los? Eu poderia encontrar soluções para acelerar a consulta - não sei qual seria um tempo razoável para que ela fosse executada? Landcover tem aproximadamente 20 milhões de recursos.
usar o seguinte código

Respostas:

12

Eu acho que o que está acontecendo é que seus polígonos com auto-interseção se tornam MULTIPOLYGONS ao armazenar em buffer.

você tem duas opções:

Para remover a restrição "enforce_geotype_the_geom", você pode fazer isso no pgAdmin
2 e colocar o resultado em uma nova tabela em vez de atualizar a antiga. essa é geralmente uma boa maneira de fazer as coisas, porque você não altera nada na sua tabela original. a consulta pode ser algo como:

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

é claro que você pode querer trazer mais campos para sua nova tabela.

tente o truque do buffer primeiro. Na segunda abordagem, Paulo pode dizer a si mesmo o que afeta a cadeia de linhas vazia. Não me lembro como essa mágica acontece.

Nicklas Avén
fonte
0

Eu tive os mesmos problemas alguns meses atrás. Eu tinha polígonos no meu banco de dados com muitas interseções automáticas. Eu usei o método de Niklas Aven, mas não funcionou. Eu também usei outros métodos.

Meu método é remover a auto-interseção dos meus polígonos. Aqui está a consulta SQL que eu usei:

     -- 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

Calculei a área do polígono e a auto-interseção e manterei apenas polígonos com uma área> 1. 1é a tolerância, porque a área da auto-interseção é muito pequena. Observe também que a transformação do SRID em metros é importante se você tiver dados em graus.

Abdillahi Abdi Mohamed
fonte