Lösen Sie Polygone in QGIS (GEOS) mit Toleranz auf

11

Ich habe eine Polygonvektorebene, die den von einer Flut überfluteten Bereich darstellt. Die Ebene wurde so erstellt, dass einige der Bereiche aus mehreren kleineren berührenden Polygonen bestehen (siehe Abbildung unten mit der Bezeichnung "Originaldaten").

Ich möchte die Polygone dort auflösen, wo sie sich berühren. Wenn ich das Auflösungs-Geoverarbeitungswerkzeug in den fTools von QGIS verwende, das die GEOS-Bibliothek verwendet, erhalte ich einige unerwartete Ergebnisse (siehe "Mit QGIS fTools auflösen"). Es scheint, dass GEOS keinen Schwellenwert verwendet, um festzustellen, ob sich Polygone berühren, wie in den folgenden Abschnitten erwähnt:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

Der gleiche Ansatz in ArcGIS liefert das erwartete Ergebnis (siehe "Mit ArcGIS 10.1 auflösen").

Anscheinend ist dies eher eine "Funktion" von GEOS als ein Fehler. Gibt es eine Möglichkeit, die Daten zu korrigieren, um das erwartete Ergebnis zu erzielen? Ein geringfügiger Präzisionsverlust (einige cm?) Könnte für mich akzeptabel sein. Idealerweise könnte ich die Lösung als Vorverarbeitungsschritt in ein QGIS-Plugin schreiben.

Verwandte Frage (ohne Antworten): Wie wird der Toleranzwert des Geoverarbeitungswerkzeugs in QGIS festgelegt?

Link zu Beispieldaten als Shapefile: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

Polygone auflösen v.dissolve

Snorfalorpagus
quelle
Eine Problemumgehung wäre, zuerst das in fTools aufgelöste Polygon zu vergrößern und dann zu verkleinern (indem zuerst mit einem positiven und dann mit einem negativen Puffer gepuffert wird).
Jake
Ich habe es versucht, aber am Ende habe ich andere Probleme (z . B. i.stack.imgur.com/LnFJy.png ). Hier wird der blaue Bereich erstellt, wenn ich puffere / auflöse / negiere - Puffer, wo er nicht sein sollte. Dies ist nicht viel besser als das ursprüngliche Problem. Ich kann nicht sehen, wie ich die ursprüngliche "scharfe" Ecke wiederherstellen kann.
Snorfalorpagus

Antworten:

14

In diesem Fall müssen Sie dem Auflösungswerkzeug helfen, indem Sie zuerst die Topologie korrigieren. So können Sie dies in GRASS tun.

Wenn Sie das Shapefile laden, sieht GRASS es folgendermaßen:

Jedes Kreuz markiert einen Bereich. Sie können sehen, dass sich an den Grenzlinien einige Kreuze befinden: Dies sind die Splitterpolygone, die durch den leichten Versatz zwischen den Grenzlinien verursacht werden.

  1. Entfernen Sie die Splitterpolygone, die durch die Lücken zwischen den realen Polygonen gebildet werden:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Fang die Grenzlinien:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Brechen Sie die Grenzlinien an den neuen Kreuzungen:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Entfernen Sie die jetzt doppelten Grenzlinien:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Löse die Polygone auf

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:

Jake
quelle
Danke @Jake. Dies ist eine sehr klare Antwort. Wenn ich versuche, den Prozess auf mein gesamtes Dataset (2500 km2) anzuwenden, erhalte ich leider eine Fehlermeldung vom Snap-Tool "ERROR: G_realloc: 144720024 Byte Speicher bei snap.c: 186 kann nicht zugeordnet werden". Ich denke, ich muss es in kleinere Stücke zerlegen. Das sollte jedoch in Ordnung sein, da ich es bereits in 0,25 km2 große Quadrate zerlege, um Schnittpunkte / räumliche Indizierung zu beschleunigen (dies ist das Feld "ID" in den Beispieldaten).
Snorfalorpagus
7

Verwenden Sie den GRASS GIS-Befehl v.dissolve (im Sextante-Plugin -> GRASS-Befehle -> Vektor).

Wenn ich Sie schnell reproduziere Beispiel: Geben Sie hier die Bildbeschreibung ein

Das Ergebnis mit v.dissolve:

Geben Sie hier die Bildbeschreibung ein

Erläuterung

Das Problem ist leicht zu verstehen. Ein Shapefile hat keine Topologie. Wenn zwei Bereiche einen gemeinsamen Rand haben, wird dieser Rand zweimal digitalisiert und auch doppelt gespeichert.

Sie sehen dies deutlich, wenn Sie versuchen, das Shapefile zu bearbeiten:

Geben Sie hier die Bildbeschreibung ein

GRASS GIS (als ArcGIS) ist ein topologisches GIS. Wenn Sie das Shapefile in GRASS importieren, hat die resultierende Ebene eine Topologie: Die gemeinsame Grenze zwischen zwei Bereichen ist einmal vorhanden und wird gemeinsam genutzt.

Geben Sie hier die Bildbeschreibung ein

Aus diesem Grund können beim Auflösen eines Shapefiles ( zwei Grenzen auflösen ) Probleme auftreten (in QGIS, GvSIG, OpenJUMP oder dem alten ArcView 3.x), siehe ArcUserI: Grundlegendes zu Topologie und Shapefiles .

In GRASS wurde v.dissolve entwickelt, um gemeinsame Grenzen zwischen Bereichen mit derselben Kategorienummer aufzulösen

Gen
quelle
1
Ich vermute, dass dies ein numerisches Problem ist, und ich frage mich, ob Ihre ziemlich gute Kopie der OP-Geometrie dieselben numerischen Eigenschaften erfassen würde.
Chau
@Chau: v.dissolvehat einen Toleranzparameter, der das Problem des OP behebt .
Jake
Dieses Detail sollte in die obige Antwort aufgenommen werden, danke für die Klarstellung :)
Chau
Ich habe in der Frage einen Link zu den Originaldaten als Shapefile hinzugefügt. Wenn ich es benutze v.dissolve, scheint es zu funktionieren, außer dass es das kleine Quadrat in der Mitte der Features "ausfüllt". i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Ich schlage eine Erklärung vor
Gen