Hilfe bei der PostGIS-Polygongeometrie - nicht geschlossene Ringe

10

Ich habe ein Exemplar des super bösen Buches 'Python Geospatial Development' von Erik Westra ( Amazon-Link ) in die Hand genommen und arbeite daran. Derzeit lehre ich mich, GSHHS-Küstendaten aus einem Shapefile in eine PostGIS-Datenbank zu laden, um die Erstellung einer Geodaten-Web-App vorzubereiten.

Mein Problem ist folgendes: Wenn ich versuche, die GSHHS-Daten in PostGIS zu importieren, werden sie abgelehnt, da die Küstenpolygone nicht als "gültig" angesehen werden. Insbesondere erhalte ich eine Fehlermeldung, in der einige (aber nicht alle) der Küstenpolygone als "nicht geschlossene Ringe" beschrieben werden.

Ich verstehe, dass dieser Fehler versucht, mir zu sagen, dass der erste und der letzte Punkt des Polygons nicht gleich sind. Dies ist jedoch einfach nicht wahr. Ich habe die WKT-Darstellung vieler Polygone untersucht und sie sind korrekt. Sie beginnen und enden definitiv mit derselben Koordinate.

Die Polygone werden mithilfe der OGR-Bibliothek aus den Shapefiles extrahiert und jedes Polygon-Feature in WKT exportiert. Ich habe versucht, das Polygon über Shapely wiederherzustellen, und mit WKB experimentiert, aber ohne Erfolg. Ich habe die Lage, die gleichen Daten in PostGIS als einen Multi Tabelle zu laden, mit den shp2pgsql Lader.

Ich habe mich gefragt, ob jemand da draußen:
(a) vielleicht dasselbe Buch benutzt hat, bei demselben Problem stecken geblieben ist und die Antwort für mich hat?
(b) auf ein ähnliches Problem gestoßen ist und eine Lösung gefunden hat?
(c) Wenn dies nicht der Fall ist, gibt es einige Best-Practice-Ratschläge zur Sicherstellung einer gültigen Geometrie vor dem Laden in PostGIS?

UPDATE: Ein Kollege hat vorgeschlagen, dass das Problem der nicht geschlossenen Ringe möglicherweise nur ein Symptom für ein anderes Problem ist. Es ist möglich, dass meine PostGIS / PostgreSQL-Konfiguration Größenbeschränkungen aufweist (beim Einfügen von Transaktionen, empfangenen Paketen, Textzeichenfolgen usw.).

Da ich sehr lange WKT-Polygone als Eingabe verwende, schneidet PostGIS sie möglicherweise zu früh, um jedes Polygon zu vervollständigen. Ich werde es morgen testen, aber es klingt wahrscheinlich. Meine Einfügung von Ländergrenzen akzeptierte nur einige Aufzeichnungen und andere nicht. Aus dem Gedächtnis waren die akzeptierten Geometrien für kleine Inselstaaten wie Antigua (und hatten daher wahrscheinlich kurze WKT-Darstellungen).

Dies könnte also eher ein PostGIS-Datenbankadministrationsthread als ein ungültiger Geometriethread sein.

timmy
quelle
Können Sie eine Beispiel-SHP-Datei bereitstellen?
Mario Miler
Keine Sorge. Die von mir verwendeten GSHHS-Küstenlinien-Daten sind ein Download von 96 MB von hier . Die
Weltgrenzdaten, die

Antworten:

6

Ich habe mir Ihre Daten und das Buchbeispiel angesehen. Das Problem besteht darin, dass die Daten drei ungültige Polygone enthalten, die im Buch verarbeitet werden:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Da dies ein Beispiel ist, ist es am einfachsten, diese Polygone aus dem Dataset zu löschen oder einfach eine if-Anweisung in Ihren Code einzufügen

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))
Mario Miler
quelle
Danke Mario, es scheint, als wäre ich mir selbst weit voraus, anstatt ALLE meine Eingabepolygone richtig zu validieren. Ihre Antwort war richtig - diese Polygone wurden beim Testen mit OGR als ungültig angezeigt. Interessanterweise sah das in QGis gut aus, aber ArcMap zeigte, dass ihnen ein vollständiger Ring fehlte. Diese drei Polygone fielen alle auf die Datenlinie, und ich denke, die Shapefile-Geometrie hat die Polygonkante entlang der Datenlinie nicht gezählt. Ihre Lösung ist eine schöne und einfache Möglichkeit, ungültige Polygone zu erkennen. Ich werde den Beitrag als beantwortet markieren.
Timmy
Wenn Sie sich wohltätig fühlen, haben Sie gute Lösungen für den nächsten Schritt im Prozess, bei dem die ungültigen Polygone korrigiert werden ? Ich habe versucht, die .CloseRing () -Funktion von OGR zu verwenden, aber ohne Erfolg. Es hat den Funktionsaufruf einfach ignoriert, denke ich.
Timmy
Ich habe versucht, "Buffer Trick" ( Workshops.opengeo.org/postgis-intro/validity.html ) mit formschön und ogr zu verwenden, aber ohne Erfolg. Ich werde kein ungültiges Polygon lesen und ogr wird keine Pufferoperation ausführen. Derzeit weiß ich nicht warum. Wenn ich über die Antwort stolpere, werde ich es Sie wissen lassen. Vielleicht hat jemand anderes mehr Erfolg mit diesem Problem. Es tut uns leid.
Mario Miler
Ich glaube, meine Polygonvalidierung funktioniert jetzt. Ich glaube, ich habe die .CloseRings () -Funktion von OGR falsch verwendet. Ich wurde es als Methode des Polygons genannt (dh poly.CloseRings ()). Stattdessen musste ich den linearen Ring aus dem Polygon extrahieren und dann darauf ausführen (dh lr = poly.GetGeometryRef (0); lr.CloseRings ()). Die Ergebnisse werden erfolgreich in PostGIS eingefügt, und ich kann die 3 Problempolygone in QGis ohne Sorgen verwenden. Die Überprüfung der Gültigkeit für JEDES Polygon ist nur mit einem geringen Rechenaufwand verbunden.
timmy