Ungültiger Geometriezoo

9

Viele Male und oft habe ich Stunden damit verbracht, mit bizarren Fehlern zu kämpfen, die aus ungültigen Geometrien resultieren . Die Symptome variieren stark, einschließlich:

  • Datenbankverlangsamungen
  • Falsche \ Null-Abfrageergebnisse
  • Mit Fehlern und Warnungen überladene Protokolldateien
  • Inkonsistentes Ergebnis mit geometrischen Operatoren (z. B. Schnittpunkt)

Ich möchte die Arten ungültiger Geometrien kategorisieren, um allen hier zu helfen, ihre Daten zu bereinigen.

Bitte antworten Sie mit Ihrem bevorzugten Typ ungültiger Geometrie (ein Typ pro Antwort). Screenshots, Beschreibungen und Lösungen sind willkommen - aber versuchen Sie, Ihre Antwort kurz zu halten.

Adam Matan
quelle

Antworten:

3

Segmente mit null Länge

Beispiel:

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

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

Probleme: Das Speichern von Nulllängensegmenten kann zu Fehlern bei der Berechnung von Längenverhältnissen (Division durch Null) oder beim Versuch, Azimute und trigonometrische Funktionen zu berechnen, führen.

Erkennung: In PostGIS können Segmente mit einer Länge von Null mithilfe von erkannt werden isValid().

Lösungen: Versuchen Sie, Segmente mit der Länge Null als Punkte beizubehalten.

Adam Matan
quelle
3

Selbstüberschneidende Polygone

Geben Sie hier die Bildbeschreibung ein

Beispiel:

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)

Probleme: Falsche Berechnungen, zum Beispiel area():

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

Dies kann zu Nullteilungsfehlern bei aufrufenden Funktionen führen.

Erkennung: In PostGIS können sich selbst schneidende Segmente mithilfe von erkannt werden isValid().

Lösung: Umstellung auf MULTIPOLYGON(siehe Kommentar).

Adam Matan
quelle
Dieselbe Form entspricht der gültigen: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: Richtig, die Konvertierung in MULTIPOLYGON ist eine gute Lösung.
Adam Matan