Quali sono le implicazioni di geometrie non valide


15

Ho importato alcuni dati in un database Postgis e alcune delle geometrie sono riportate non valide (ST_IsValidReason riporta autointersezione o anello di autointersezione).

Le query che sto eseguendo non sembrano influenzate dall'aspetto non valido di queste geometrie (sto solo usando query ST_Distance).

Quali sono le cose che si rompono quando le geometrie non sono valide?

La correzione di queste geometrie "automaticamente" (buffer (geom, 0) o ST_SimplifyPreserveTopology (geom, 0,0001)) è un'opzione?

Risposte:


19

Conservare i dati non validi è una cattiva idea, perché non si può mai prevedere quando e dove si verificherà l'errore. Inoltre, i dati non validi possono causare Heisenbugs , il tipo di bug più vizioso e illusorio.

Penso che sia un po 'inutile discutere il possibile risultato della memorizzazione di geometrie non valide. Detto questo, le conseguenze possono includere:

  • Risultati errati (ovvero ST_Distancerestituirà cifre imprecise o chiaramente errate)
  • Problemi di prestazioni del database: la conservazione di dati non validi può danneggiare seriamente le prestazioni del database e creare file di registro di grandi dimensioni, poiché ogni chiamata di funzione scriverà un errore nel registro e interromperà il normale funzionamento del database.
  • Il database si arresta in modo anomalo.
  • Arresti anomali dell'applicazione - causati dalla ricezione di dati non validi dal database o dalla ricezione di risultati irragionevoli (distanza negativa, ad esempio).
  • Comportamento fantasma (vedi link sopra). Questa è la peggiore conseguenza di tutte. Avrai cose strane che accadono. Rallentamenti, perdita di dati, arresti anomali, risultati irragionevoli, lunghe pause, nessuna reattività e molte altre maledizioni. Potresti non essere in grado di individuarli o riprodurli, perché rientrano tutti nella categoria "non definita" in ogni documentazione.

Il mio consiglio: se i buffer di piccole dimensioni non danneggiano in modo significativo la coerenza dei dati, utilizzarli per evitare che accada uno di questi. Mantieni i tuoi dati validi.


Puoi approfondire un po 'l'utilizzo dei buffer di piccole dimensioni? Come lo faccio?
diciu

1
ST_Buffer(the_geom, 0.0000001)potrebbe fare il trucco per l'autointersezione. Usalo solo se le conseguenze di una geometria leggermente più grande non sono gravi.
Adam Matan,

1
La mia esperienza è che la correzione dei dati non validi è una vera indagine. Ma anche se richiede tempo, normalmente vale la pena. Il ST_Buffer(the_geom, 0.0000001)trucco sicuramente aiuta molto.
Chau,

Il fatto è che ST_Buffer corregge la geometria ma il risultato non è proprio quello che mi aspettavo - per questo poligono non valido qui ( openstreetmap.org/browse/way/51954364 ) ST_Buffer restituisce solo il rettangolo in alto a sinistra. ST_SimplifyPreserveTopology sembra essere più vicino a ciò di cui ho bisogno (geometria valida ma il più vicino possibile all'originale non valido). Qualche svantaggio nell'uso di ST_SimplifyPreserveTopology?
diciu

Quella geometria dovrebbe essere elaborata come uno MULTIPOLYGONdi due poligoni, non come un singolo POLYGON. Cerca di ottenere il WKT originale, se possibile.
Adam Matan,

13

È possibile impedire che geometrie non valide entrino nel database in primo luogo. Per gli utenti PostgreSQL / PostGIS, questo è semplice da fare con i vincoli di controllo . Ad esempio, considera una tabella public.my_valid_tablecon una colonna di geometrie poligonali geom, usa il seguente SQL / DDL:

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

Nota: questa tabella deve avere poligoni validi prima di applicare il vincolo.

Se si tenta quindi di inserire / aggiungere una geometria non valida, verrà visualizzato un errore:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.