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.
ST_Multi()
para forçar todos os polígonos para serMULTIPOLYGON
s (esta é uma suposição)Respostas:
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:
é 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.
fonte
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:
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.fonte