Zoológico de geometria inválido


9

Muitas vezes, passei horas lutando com bugs estranhos resultantes de geometrias inválidas . Os sintomas variam muito, incluindo:

  • Lentidão do banco de dados
  • Resultados de consulta \ Null incorretos
  • Arquivos de log sobrecarregados com erros e avisos
  • Resultado inconsistente com operadores geométricos (por exemplo, interseção)

Gostaria de categorizar os tipos de geometrias inválidas, para ajudar todos aqui a higienizar seus dados.

Responda com seu tipo favorito de geometria inválida (um tipo por resposta). Capturas de tela, descrições e soluções são bem-vindas - mas tente manter sua resposta curta.

Respostas:



3

Segmentos de comprimento zero

Exemplo:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

Problemas: O armazenamento do segmento de comprimento zero pode causar erros ao calcular as proporções de comprimento (divisão por zero) ou ao tentar calcular azimutes e funções trigonométricas.

Detecção: no PostGIS, segmentos de comprimento zero podem ser detectados usando isValid().

Soluções: Tente manter segmentos de comprimento zero como pontos.


3

Polígonos com auto-interseção

insira a descrição da imagem aqui

Exemplo:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

Problemas: cálculos incorretos, por exemplo area():

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

Isso pode causar erros de divisão zero com funções de chamada.

Detecção: No PostGIS, segmentos com auto-interseção podem ser detectados usando isValid().

Solução: Conversão para MULTIPOLYGON(ver comentário).


Essa mesma forma é equivalente à válida: #MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Mike T

@ Mike Toews: Correto, converter para MULTIPOLYGON é uma boa solução.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.