¿Cuáles son las implicaciones de geometrías inválidas?

15

Importé algunos datos en una base de datos de Postgis y algunas de las geometrías se informan no válidas (ST_IsValidReason informa de la auto-intersección o auto-intersección de anillo).

Las consultas que estoy realizando no parecen afectadas por el aspecto no válido de estas geometrías (solo estoy usando consultas ST_Distance).

¿Cuáles son las cosas que se rompen cuando las geometrías no son válidas?

¿Corregir estas geometrías "automáticamente" (buffer (geom, 0) o ST_SimplifyPreserveTopology (geom, 0.0001)) es una opción?

diciu
fuente

Respuestas:

19

Mantener datos mal formados es una mala idea, porque nunca se puede predecir cuándo y dónde ocurrirá la falla. Además, los datos mal formados pueden causar errores de Heisenbugs , el tipo de errores más vicioso e ilusorio.

Creo que no tiene sentido discutir el posible resultado de almacenar geometrías inválidas. Dicho esto, las consecuencias pueden incluir:

  • Resultados incorrectos (es decir, ST_Distancedevolverá cifras inexactas o simplemente erróneas)
  • Problemas de rendimiento de la base de datos: mantener datos mal formados puede dañar seriamente el rendimiento de la base de datos y crear un archivo de registro enorme, porque cada llamada de función escribirá un error en el registro e interrumpirá el trabajo ordinario de la base de datos.
  • La base de datos se bloquea.
  • Los bloqueos de aplicaciones, ya sea causados ​​por recibir datos mal formados de la base de datos, o por recibir un resultado irrazonable (distancia negativa, por ejemplo).
  • Comportamiento fantasma (ver enlace arriba). Esta es la peor consecuencia de todas. Tendrás cosas extrañas sucediendo. Retraso, pérdida de datos, bloqueos, resultados irrazonables, largas pausas, falta de respuesta y muchas otras maldiciones. Es posible que no pueda detectarlos o reproducirlos, porque todos caen en la categoría "indefinida" en cada documentación.

Mi consejo: si los pequeños buffers no dañan significativamente la consistencia de sus datos, úselos para evitar que ocurra cualquiera de los anteriores. Mantenga sus datos válidos.

Adam Matan
fuente
¿Puedes elaborar un poco sobre el uso de pequeños tampones? ¿Cómo puedo hacer eso?
diciu
1
ST_Buffer(the_geom, 0.0000001)podría hacer el truco para la auto intersección. Úselo solo si las consecuencias de una geometría ligeramente mayor no son graves.
Adam Matan
1
Mi experiencia es que corregir datos mal formados es toda una investigación. Pero a pesar de que lleva mucho tiempo, normalmente vale la pena el esfuerzo. El ST_Buffer(the_geom, 0.0000001)truco definitivamente ayuda mucho.
Chau
La cuestión es que ST_Buffer corrige la geometría, pero el resultado no es realmente lo que esperaba: para este polígono no válido aquí ( openstreetmap.org/browse/way/51954364 ) ST_Buffer solo devuelve el rectángulo superior izquierdo. ST_SimplifyPreserveTopology parece estar más cerca de lo que necesito (geometría válida pero lo más cerca posible del original no válido). ¿Alguna desventaja en el uso de ST_SimplifyPreserveTopology?
diciu
Esa geometría debe procesarse como uno MULTIPOLYGONde dos polígonos, no como uno solo POLYGON. Intenta obtener el WKT original si es posible.
Adam Matan
13

Puede evitar que geometrías no válidas ingresen a su base de datos en primer lugar. Para los usuarios de PostgreSQL / PostGIS, esto es simple de hacer con las restricciones de verificación . Por ejemplo, considere una tabla public.my_valid_tablecon una columna de geometrías de polígonos geom, use el siguiente SQL / DDL:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Nota: esta tabla debe tener polígonos válidos antes de aplicar la restricción.

Si luego intentas insertar / agregar una geometría no válida, verás un error:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
Mike T
fuente