Zoológico de geometría inválida

9

Muchas veces he pasado horas luchando con errores extraños resultantes de geometrías inválidas . Los síntomas varían mucho, incluyendo:

  • Retraso de la base de datos
  • Resultados de consulta incorrectos \ nulos
  • Archivos de registro sobrecargados con errores y advertencias
  • Resultado inconsistente con operadores geométricos (por ejemplo, intersección)

Me gustaría clasificar los tipos de geometrías inválidas, para ayudar a todos aquí a desinfectar sus datos.

Responda con su tipo favorito de geometría inválida (un tipo por respuesta). Las capturas de pantalla, las descripciones y las soluciones son bienvenidas, pero intente que su respuesta sea breve.

Adam Matan
fuente

Respuestas:

3

Segmentos de longitud cero

Ejemplo:

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

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

Problemas: el almacenamiento del segmento de longitud cero puede causar errores al calcular las proporciones de longitud (división por cero) o al intentar calcular acimutes y funciones trigonométricas.

Detección: en PostGIS, se pueden detectar segmentos de longitud cero usando isValid().

Soluciones: Intente mantener segmentos de longitud cero como puntos.

Adam Matan
fuente
3

Polígonos de auto-intersección

ingrese la descripción de la imagen aquí

Ejemplo:

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 incorrectos, por ejemplo area():

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

Esto puede causar errores de división cero con funciones de llamada.

Detección: en PostGIS, los segmentos auto intersectantes se pueden detectar usando isValid().

Solución: Conversión a MULTIPOLYGON(ver comentario).

Adam Matan
fuente
Esa misma forma es equivalente a la 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: Correcto, la conversión a MULTIPOLYGON es una buena solución.
Adam Matan