Ring-Selbstschnittpunkte in PostGIS

10

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

Ich habe die Gültigkeit der Topologie in meinen Daten überprüft und im Landbedeckungsdatensatz (Polygon) etwa 1700 Topologieprobleme gefunden. Dies sind alles "Ring Self_intersection".

Mit einigen nützlichen 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: Ring-Selbstschnittpunkt am oder in der Nähe des Punkts (bearbeitet) FEHLER: Neue Zeile für die Beziehung "sgm_buffer" verletzt die Prüfbedingung "erzwingen_geotype_the_geom"

********** Error **********

FEHLER: Neue Zeile für die Beziehung "sgm_buffer" verletzt die Prüfbedingung "erzwingen_geotype_the_geom" SQL-Status: 23514

Ich habe auch nur versucht:

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

und bekomme:

FEHLER: Neue Zeile für die Beziehung "sgm_buffer" verletzt die Prüfbedingung "erzwingen_geotype_the_geom"

********** Error **********

FEHLER: Neue Zeile für die Beziehung "sgm_buffer" verletzt die Prüfbedingung "erzwingen_geotype_the_geom" SQL-Status: 23514

Nehme ich also an, dass diese Puffertechnik bei meinen Problemen nicht funktioniert? Oder mache ich etwas falsch?

Herr Ramsay fährt dann im selben Dokument fort und schlägt eine zusätzliche Technik vor, um mit "Zahl von 8" -Polygonen umzugehen. Ich verstehe nicht ganz, wie ich das vollständig in Code schreiben soll (oder was es tut und ob es mir helfen wird):

SELECT ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))')

Also ... kann jemand helfen? Dies ist ein wahrer Albtraum mit meinen engen Zeitplänen und begrenzten Fähigkeiten in PostGIS.

ESRIHelp
quelle
1
Was gibt "Geometrie_Typ (the_geom) aus sgm_buffer Limit 1 auswählen" zurück? Sind in Bezug auf die in der anderen Frage erwähnte Laufzeit von 40 Stunden räumliche Indizes für Ihre Tabelle definiert?
Diciu
Möglicherweise benötigen Sie a ST_Multi(), um alle Polygone zu zwingen, MULTIPOLYGONs zu sein (dies ist eine Annahme)
Mike T
Vielen Dank für Kommentare - diciu Ich denke, es gibt Indizes, sie scheinen in pgAdminIII sichtbar zu sein, aber vielleicht muss ich sie aktualisieren? Ich könnte Lösungen finden, um die Abfrage zu beschleunigen - ich weiß nicht, wann ein angemessener Zeitpunkt für die Ausführung wäre? Landcover hat ca. 20 Millionen Funktionen.
ESRIHelp

Antworten:

12

Ich denke, was passiert ist, dass Ihre sich selbst überschneidenden Polygone beim Puffern zu MULTIPOLYGONEN werden.

Sie haben zwei Möglichkeiten:

1 Entfernen Sie die Einschränkung "erzwingen_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, Dinge zu tun, da Sie dann nichts an Ihrer ursprünglichen Tabelle ändern. Die Abfrage kann ungefähr 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 möglicherweise mehr Felder in Ihre neue Tabelle einfügen.

Versuchen Sie zuerst den Puffertrick. Im zweiten Ansatz kann sich Paulus sagen, welchen Einfluss der leere Linestring hat. Ich erinnere mich nicht, wie diese Magie passiert.

Nicklas Avén
quelle
0

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 sie hat nicht funktioniert. Ich habe auch andere Methoden angewendet.

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

     -- Create the new polygons 

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) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

Ich habe die Fläche des Polygons und die Selbstüberschneidung berechnet und behalte nur Polygone mit einer Fläche> 1. 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.

Abdillahi Abdi Mohamed
quelle