Mehr

Sich selbst schneidende Polygone manuell reparieren

Sich selbst schneidende Polygone manuell reparieren


Ich möchte eine Methode implementieren, um sich selbst schneidende Polygone durch Bearbeiten der Scheitelpunktreihenfolge zu reparieren. Wir möchten die Polygonringe nehmen und Scheitelpunkte neu anordnen/hinzufügen, um ein gültiges Polygon zu erstellen. Dies ist ähnlich wie bei ArcMapGeometrie reparierenläuft. Ich habe andere Methoden wie PostGIS verwendetST_MakeValue, aber das Ergebnis hat uns nicht gefallen, da es dem Polygon zusätzliche Fläche hinzugefügt hat. Aus diesem Grund möchte ich meine eigene Strategie umsetzen.

Ich möchte die WKT des Feature-Shapes nehmen und die Koordinaten manuell bearbeiten. Etwas wie eine Pufferoperation, Split und Union oder irgendetwas anderes wird nicht wirklich funktionieren. Was wir tun möchten, ist in der Lage zu sein, Scheitelpunkte zu erkennen und zu Selbstüberschneidungen hinzuzufügen, ähnlich wie beim Werkzeug von ArcMap.

Wenn ich eine Erklärung zu einigen gängigen Tools zur Korrektur von sich selbst schneidenden Polygonen und vielleicht ein Codebeispiel/Algorithmusbeispiel erhalten könnte, würde mir das sehr helfen.


Das Puffern um Null ist ein üblicher "Hack", der in den meisten Fällen gut funktioniert, und aus Ihrer Frage geht nicht hervor, warum dies für Sie inakzeptabel ist. Räumlich aktivierte Datenbanken wie PostGIS (das kostenlos ist) verfügen normalerweise über eine ST_MakeValid-Funktion, die Ihren Anforderungen entsprechen sollte. Sie können dies in Verbindung mit anderen Tools wie ST_IsValidReason oder ST_IsValidDetail verwenden. Diese Tools listen die Fehler und ihre Positionen auf und können sich als nützlich erweisen, wenn Sie aus irgendeinem Grund eine eigene Lösung benötigen.

Zusätzlich zur Datenbankmethode haben Sie Topologie-Tools wie GRASS GIS Build- und Clean-Tools (ArcGIS hat auch ähnliche Tools - es können jedoch Lizenzbeschränkungen gelten).

Zur Diagnose können Sie sich Shapely ansehen. Es verfügt über Tools wie is_valid undvalidation.explainValidity (siehe Dokumentation).

Ich nehme an, Sie suchen nach kostenlosen Alternativen zu ArcMap und Sie können die meisten dieser Tools mit einer guten GUI, einer Python-API und einem Model Builder-Dienstprogramm für die Automatisierung über QGIS erhalten (das standardmäßig mit GRASS, SAGA und Verbindungsdienstprogrammen zu PostGIS geliefert wird). ). QGIS hat auch ein WerkzeugÜberprüfen Sie die Gültigkeit der Geometrie. Ich vermute, dass dies etwas Ähnliches wie ST_IsValidReason verwendet, aber dies könnte sich als nützlich erweisen, da Sie sagen, dass Sie Fehler manuell beheben möchten. Mit diesem Werkzeug können Sie einen Vektorlayer analysieren und dann QGIS die Fehler auflisten lassen. Sie können dann jeden Fehler in der Liste auswählen und QGIS springt zu ihm und Sie können dann Ihre Bearbeitungen durchführen.


Ich habe kein Codebeispiel. und dies ist eine rein kommerzielle Lösung. Aber es ist Weltklasse. 1Validieren Sie durch 1Räumlich. Sie haben die Fähigkeit, Topology QA/QC in viele GIS-Unternehmenssysteme zu integrieren.

Ich bin ziemlich weit gekommen, als ich mir eine räumliche/autocad-Kartenlösung von Oracle in der •1Spatial Management Suite ansah.
Aber diese Suite ist nur eine Suite von Tools, die Sie für die Daten implementieren. Ich glaube, jetzt haben sie einige Implementierungen auf FME.


Aufbauend auf der Antwort von @Brad Nesom gibt es einige Transformatoren, die bei Ihrem Problem helfen können, wenn Sie sich eine FME-Lösung ansehen möchten. Aber wahrscheinlich das nützlichste wäre das probably Geometrie-Validator. Es bietet viele Möglichkeiten zum Erkennen und Beheben von Geometriefehlern. Wie Sie sehen können, enthält der Dialog viele Tests, einschließlich Self-Intersections in 2D:

Aus der Dokumentation:

Wenn Reparaturversuch auf Nein gesetzt ist, werden Selbstschnittpunkte erkannt.

Wenn Reparaturversuch auf Ja gesetzt ist, wird eine Eingabegeometrie mit Selbstüberschneidungen in eine Sammlung von Geometrieteilen unterteilt, die keine Selbstüberschneidungen enthalten. Zum Beispiel wird ein Achterpolygon mit einer „Taillengröße“ von 0 in eine IFMEMultiArea von zwei Polygonen repariert. Als weiteres Beispiel werden Netze, Dreiecksstreifen und Dreiecksfächer zu Verbundflächen repariert.

Erwarten Sie, dass Selbstüberschneidungen nur in x und y erkannt werden.

Doppelte Koordinaten (doppelt in x und y) gelten als Selbstschnittpunkte und werden als solche gemeldet. Doppelte aufeinanderfolgende Koordinaten werden als einzelner Selbstschnittpunkt gemeldet.

Flächen werden auf die x-y-Ebene gedreht, in x und y selbst geschnitten und dann nicht gedreht.

Gesteinskörnungen, Verbundoberflächen, Netze, Dreiecksstreifen und Dreiecksfächer werden auf einer Basis pro Teil (oder pro Fläche) auf Selbstüberschneidung getestet, aber die Teile überschneiden sich nicht gegenseitig. Donutlöcher und Ringe sind gegeneinander selbstschneidend. Wenn beispielsweise eine Verbundfläche eine Fläche hat, die sich selbst schneidet, wird sie über den Port „Fehlgeschlagen“ oder „Repariert“ ausgegeben. Wenn eine Verbundfläche zwei Flächen hat, die sich schneiden, sich aber nicht selbst schneiden, wird die Verbundfläche über den Port Passed ausgegeben.

Selbstüberschneidungen werden über .location-Merkmale gemeldet. Wenn Selbstüberschneidungen erkannt werden, aber keine Selbstüberschneidungspunkte zum Melden verfügbar sind, meldet der Transformator einen Standort in der Nähe.

Selbstberührendes Polygon prüfen

Wenn Ja und Reparaturversuch auf Ja eingestellt ist, wird bei Ringen mit einem Loch, das die äußere Begrenzung berührt, das Loch zur äußeren Begrenzung hinzugefügt. Dadurch wird die äußere Begrenzung in ein Pinch-Polygon umgewandelt. Diese Option wirkt sich nur auf Ringlöcher aus, die die ursprüngliche äußere Begrenzung berühren. Die reparierten Donuts können zu Donuts ohne Löcher werden und somit degenerieren.


Wenn Java für Sie funktioniert, werfen Sie einen Blick auf http://github.com/Esri/geometry-api-java. Es hat OperatorSimplify für die Polygonreparatur. Es hat auch OperatorSimplifyOGC, wenn Sie möchten, dass die Polygone auch OGC-kompatibel sind.


Es scheint, dass eine Funktion zur "Geometriereparatur" von Open Source vollständig vermisst wird, während sie ein volles Vorrecht der Unternehmenslösung ist. Ich verwende den FME GeometryValidator, auch wenn dies erfordert, dass die Geometrie einige Male an den Validator übergeben wird.

Grass hat eine v_clean-Funktion, die an der Topologie ausgerichtet arbeitet, wenn ich mich nicht irre.

PostGIS hat die ST_validReason () um das (OGC) Problem zu finden und ein st_makevalid, das "versucht zu beheben", aber den ValidityStatus intern auf "Valid" setzt, so dass es nicht in allen Fällen hilfreich ist (auch wenn es für die meisten Probleme behoben ist). .

Normalerweise sind alles, was Sie haben können, Tricks, wie Buffer(0) oder manuelle Korrektur oder Bezahlung.