Mehr

Ringselbstschnittpunkte in PostGIS

Ringselbstschnittpunkte in PostGIS


Dies ist eine Fortsetzung der vorherigen Frage. Sie werden sehen, dass ich ein neuer PostGIS-Benutzer bin.

Ich habe mir die Gültigkeit der Topologie in meinen Daten angesehen und im Landbedeckungs-(Polygon-)Datensatz rund 1700 Topologieprobleme gefunden. Dies sind alle "Ring Self_intersection".

Anhand einiger nützlicher Informationen in dieser Präsentation von Paul Ramsay (Seite 20) habe ich versucht, meine Daten entsprechend zu puffern:

UPDATE schema.data SET the_geom=buffer(the_geom,0.0) WHERE isvalid(the_geom)=false und isvalid(buffer(the_geom, 0.0))=true;

Aber ich bekomme die Antwort:

HINWEIS: Ringselbstschnittpunkt an oder nahe Punkt (bearbeitet) FEHLER: Neue Zeile für Relation "sgm_buffer" verletzt Prüfbedingung "enforce_geotype_the_geom"

********** Fehler **********

FEHLER: Neue Zeile für Relation "sgm_buffer" verletzt Prüfbedingung "enforce_geotype_the_geom" SQL-Zustand: 23514

Ich habe es auch gerade probiert:

UPDATE csgn.sgm_buffer SET the_geom=buffer(the_geom,0.0)

und bekomme:

FEHLER: Neue Zeile für Relation "sgm_buffer" verletzt Prüfbedingung "enforce_geotype_the_geom"

********** Fehler **********

FEHLER: Neue Zeile für Relation "sgm_buffer" verletzt Prüfbedingung "enforce_geotype_the_geom" SQL-Zustand: 23514

Gehe ich also davon aus, dass diese Puffertechnik bei meinen Problemen nicht funktioniert? Oder mache ich etwas falsch?

Herr Ramsay fährt dann in demselben Dokument fort, eine zusätzliche Technik vorzuschlagen, um mit Polygonen der "Figur von 8" umzugehen. Ich verstehe nicht ganz, wie ich dies vollständig im Code ausschreiben soll (oder was es tut und ob es mir hilft):

SELECT ST_BuildArea( ST_Union( 'LINESTRING LEER', ST_ExteriorRing( 'POLYGON((… ))'

Also… kann jemand helfen? Dies erweist sich angesichts meiner engen Zeitvorgaben und meiner begrenzten Fähigkeiten in PostGIS als echter Albtraum.


Ich denke, was passiert, ist, dass Ihre sich selbst schneidenden Polygone beim Puffern zu MULTIPOLYGONS werden.

du hast zwei möglichkeiten:

1 Entfernen Sie die Einschränkung "enforce_geotype_the_geom", Sie können dies in pgAdmin . tun
2 fügen Sie das Ergebnis in eine neue Tabelle ein, anstatt die alte zu aktualisieren. das ist oft eine gute Möglichkeit, weil Sie dann nichts an Ihrer ursprünglichen Tabelle ändern. die Abfrage kann etwa so aussehen:

CREATE TABLE new_buffered_table as SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

Natürlich möchten Sie vielleicht mehr Felder in Ihre neue Tabelle aufnehmen.

Versuchen Sie zuerst den Puffertrick. Beim zweiten Ansatz kann sich Paul selbst sagen, welchen Einfluss der leere Linienzug hat. Ich erinnere mich nicht, wie diese Magie passiert.


Ich hatte vor ein paar Monaten die gleichen Probleme. Ich hatte Polygone in meiner Datenbank mit vielen Selbstüberschneidungen. Ich habe die Methode von Niklas Aven verwendet, aber es hat nicht funktioniert. Ich habe auch andere Methoden verwendet.

Meine Methode besteht darin, den Selbstschnittpunkt aus meinen Polygonen zu entfernen. Hier ist die SQL-Abfrage, die ich verwendet habe:

-- Erzeuge die neuen Polygone SELECT ST_GeomFromText(polygone) as geom from ( SELECT st_astext(ST_MakePolygon(linear)) as polygone from ( SELECT st_astext ((ST_dump (st_boundary (ST_MakeValid (ST_Transform (ST_SETSRID (geometry,4326),32631))) )).geom) als linear von table_name) als query2) als query1 wobei ST_area(polygone) > 1

Ich habe die Fläche des Polygons und den Selbstschnitt berechnet und werde nur Polygone behalten, die eine Fläche > 1 haben.1ist die Toleranz, da die Fläche der Selbstüberschneidung sehr klein ist. Beachten Sie auch, dass die Umwandlung der SRID in Meter wichtig ist, wenn Sie Daten in Grad haben.