Was sind die Auswirkungen ungültiger Geometrien?

15

Ich habe einige Daten in eine Postgis-Datenbank importiert und einige der Geometrien werden als ungültig gemeldet (ST_IsValidReason meldet Selbstschnitt oder Ring-Selbstschnitt).

Die Abfragen, die ich durchführe, scheinen vom ungültigen Aspekt dieser Geometrien nicht betroffen zu sein (ich verwende nur ST_Distance-Abfragen).

Was sind die Dinge, die brechen, wenn Geometrien ungültig sind?

Ist das Fixieren dieser Geometrien "automatisch" (Puffer (Geom, 0) oder ST_SimplifyPreserveTopology (Geom, 0,0001)) eine Option?

diciu
quelle

Antworten:

19

Das Speichern fehlerhafter Daten ist eine schlechte Idee, da Sie nie vorhersagen können, wann und wo der Fehler auftreten wird. Darüber hinaus können fehlerhafte Daten Heisenbugs verursachen , die bösartigste und illusorischste Art von Bugs.

Ich halte es für etwas sinnlos, das mögliche Ergebnis der Speicherung ungültiger Geometrien zu diskutieren. Die Konsequenzen können jedoch Folgendes umfassen:

  • Falsche Ergebnisse (das heißt, die ST_Distancewerden ungenaue oder einfach falsche Zahlen zurückgeben)
  • Probleme mit der Datenbankleistung: Das Beibehalten fehlerhafter Daten kann die Datenbankleistung ernsthaft beeinträchtigen und eine große Protokolldatei erstellen, da jeder Funktionsaufruf einen Fehler in das Protokoll schreibt und die normale Datenbankarbeit stört.
  • Datenbank stürzt ab.
  • Anwendungsabstürze - entweder durch den Empfang fehlerhafter Daten aus der Datenbank oder durch das Empfangen unangemessener Ergebnisse (z. B. negative Entfernung).
  • Phantomverhalten (siehe Link oben). Dies ist die schlimmste Folge von allen. Es werden seltsame Dinge passieren. Verlangsamungen, Datenverlust, Abstürze, unangemessene Ergebnisse, lange Pausen, keine Reaktionsfähigkeit und viele andere Flüche. Möglicherweise können Sie sie nicht erkennen oder reproduzieren, da sie alle in jeder Dokumentation unter die Kategorie "undefiniert" fallen.

Mein Rat: Wenn kleine Puffer Ihre Datenkonsistenz nicht wesentlich beeinträchtigen, verwenden Sie sie, um zu verhindern, dass eines der oben genannten Ereignisse eintritt. Halten Sie Ihre Daten gültig.

Adam Matan
quelle
Können Sie etwas näher auf die Verwendung kleiner Puffer eingehen? Wie mache ich das?
Diciu
1
ST_Buffer(the_geom, 0.0000001)könnte den Trick für die Selbstüberschneidung tun. Verwenden Sie es nur, wenn die Folgen einer etwas größeren Geometrie nicht schwerwiegend sind.
Adam Matan
1
Ich habe die Erfahrung gemacht, dass die Korrektur fehlerhafter Daten eine ziemliche Untersuchung darstellt. Aber obwohl es zeitaufwändig ist, ist es normalerweise die Mühe wert. Der ST_Buffer(the_geom, 0.0000001)Trick hilft definitiv viel.
Chau
Die Sache ist, dass ST_Buffer die Geometrie korrigiert, aber das Ergebnis nicht wirklich das ist, was ich erwartet habe - für dieses ungültige Polygon hier ( openstreetmap.org/browse/way/51954364 ) gibt ST_Buffer nur das obere linke Rechteck zurück. ST_SimplifyPreserveTopology scheint näher an dem zu sein, was ich brauche (gültige Geometrie, aber so nah wie möglich am ungültigen Original). Irgendwelche Nachteile bei der Verwendung von ST_SimplifyPreserveTopology?
Diciu
Diese Geometrie sollte als eines MULTIPOLYGONvon zwei Polygonen verarbeitet werden, nicht als ein einziges POLYGON. Versuchen Sie, wenn möglich, das Original-WKT zu erhalten.
Adam Matan
13

Sie können verhindern, dass ungültige Geometrien in Ihre Datenbank gelangen. Für PostgreSQL / PostGIS-Benutzer ist dies einfach mit Überprüfungsbeschränkungen zu tun . Betrachten Sie beispielsweise eine Tabelle public.my_valid_tablemit einer Spalte mit Polygongeometrien geomund verwenden Sie die folgende SQL / DDL:

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

Hinweis: Diese Tabelle muss gültige Polygone enthalten, bevor die Einschränkung erzwungen wird.

Wenn Sie dann versuchen, eine ungültige Geometrie einzufügen / hinzuzufügen, wird ein Fehler angezeigt:

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