Zoo di geometria non valido


9

Molte volte e spesso ho passato ore a lottare con bizzarri bug derivanti da geometrie non valide . I sintomi variano notevolmente, tra cui:

  • Rallentamenti del database
  • Risultati della query \ Null errati
  • File di registro sovraccarichi di errori e avvisi
  • Risultato incoerente con operatori geometrici (ad es. Intersezione)

Vorrei classificare i tipi di geometrie non valide, al fine di aiutare tutti qui a disinfettare i propri dati.

Rispondi con il tuo tipo preferito di geometria non valida (un tipo per risposta). Schermate, descrizioni e soluzioni sono benvenute, ma cerca di mantenere la risposta breve.

Risposte:



3

Segmenti di lunghezza zero

Esempio:

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

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

Problemi: la memorizzazione del segmento di lunghezza zero può causare errori nel calcolo dei rapporti di lunghezza (divisione per zero) o nel tentativo di calcolare azimut e funzioni trigonometriche.

Rilevamento: in PostGIS è possibile rilevare segmenti di lunghezza zero utilizzando isValid().

Soluzioni: prova a mantenere segmenti di lunghezza zero come punti.


3

Poligoni autointersecanti

inserisci qui la descrizione dell'immagine

Esempio:

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)

Problemi: calcoli errati, ad esempio area():

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

Ciò può causare errori di divisione zero con funzioni di chiamata.

Rilevamento: in PostGIS è possibile rilevare segmenti autointersecanti utilizzando isValid().

Soluzione: conversione in MULTIPOLYGON(vedi commento).


La stessa forma equivale al valido: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: corretto, la conversione in MULTIPOLYGON è una buona soluzione.
Adam Matan,
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.