Vereinfachen benachbarter Polygone mit dem QGIS-Werkzeug "Geometrien vereinfachen"

10

Ich habe ein großes Shapefile mit 200.000 Polygonen, aber die Datei ist zu groß für die Anwendung, die es verwenden wird. Ich möchte diese Polygone verallgemeinern und eine viel kleinere Datei erstellen.

Ich habe versucht, dies in QGIS mit dem Tool "Geometrien vereinfachen" zu tun. Ich habe dies an einem sehr kleinen Teil meines Shapefile versucht und bin mit den Ergebnissen zufrieden, habe aber ein kleines Problem, das ich nicht lösen kann. Ich habe das Bild angehängt, um das Problem zu zeigen.

WEISSE Grenzen sind Grenzen vor der Vereinfachung. ROTE Grenzen sind nach Vereinfachung. Die Problembereiche sind orange eingekreist. Wie Sie sehen können, enthalten "vereinfachte Grenzen" einige Bereiche, die nach der Vereinfachung zu keinem der vorherigen Polygone gehören.

Wie vereinfache ich dieses Shapefile und behalte gemeinsame Grenzen zwischen Polygonen als einzelne Linie bei und eliminiere Bereiche, die nach der Vereinfachung erstellt wurden?

Vereinfachte Polygone in QGIS

ZUSÄTZLICHE INFORMATION:

Nachdem Sie die vorgeschlagenen Anweisungen befolgt haben

  1. Konvertieren Sie Polygone in Linien
  2. Linien vereinfachen
  3. Konvertieren Sie Linien zurück in Polygone

Ich erhalte die folgenden Ergebnisse. Es ist etwas besser als zuvor, aber ich bekomme immer noch Bereiche außerhalb der ursprünglichen Polygone (siehe weiße Bereiche im Bild unten).

@ Andrew schlug vor, dass ich jede Linie einem benachbarten Polygon zuordne, aber ich weiß nicht, wie ich das in QGIS machen soll.

Geben Sie hier die Bildbeschreibung ein

Ich versuche immer noch, den Prozess der Vereinfachung von Polygonen abzuschließen. Ich habe die in diesem Beitrag vorgeschlagenen Anweisungen befolgt und als ich dachte, ich hätte akzeptable Ergebnisse erzielt, trat ein weiteres Problem auf. Unten ist die Zusammenfassung dessen, was ich mit Bildern von Ergebnissen gemacht habe. Alle Schritte wurden mit der Toolbox PROCESSING in QGIS ausgeführt.

  1. Zuerst habe ich Polygone in Linien konvertiert
  2. Zweitens habe ich Zeilen mit v.clean mit break-Option bereinigt. Dies führte zu CLEANED VECTOR LAYER und ERROR LAYER. Die Fehlerebene (grüne Punkte auf dem bereitgestellten Bild) hat an jedem Linienschnitt einen grünen Punkt. Ich weiß nicht was das bedeutet.
  3. Drittens habe ich Linien mit dem Werkzeug "GEOMETRIE VEREINFACHEN" vereinfacht (was zu roten Linien in den Bildern führt). Beim Vergleich von vereinfachten roten Linien und originalen orangefarbenen Linien bin ich mit dem Ergebnis zufrieden.
  4. Viertens wollte ich Linien mit dem Werkzeug "Polygonisieren" in "VERARBEITUNG" wieder in Polygone konvertieren und erhielt Ergebnisse, die ich nicht erwartet hatte (zweites Bild mit schattierten Polygonen in dunkler olivfarbener Farbe). Es sieht aus wie mit Polygonisierern verbundene Schnittpunkte von Fehlerebenen und erstellt völlig andere Polygonsätze, wobei vereinfachte Linien ignoriert werden.

Könnte jemand erklären, was hier schief gelaufen ist?

Warum wurden rote vereinfachte Linien nicht richtig in vereinfachte Polygone umgewandelt?

Wie Sie sehen, bin ich kein GIS-Experte, muss dies aber selbst tun. Ich weiß nicht, ob ich zu weit von der Lösung entfernt bin, aber es ist frustrierend, dass ich vereinfachte Linien sehe, die ich für akzeptabel hielt, aber nicht in Polygone konvertieren kann.

Hier sind zwei Bilder mit Ergebnissen der letzten beiden Schritte des Prozesses:

Vereinfachte Linien und ursprüngliche Linien

Ergebnisse von plygonisierten vereinfachten Linien

David
quelle
@nhopton Auf der Polygonizer-Webseite plugins.qgis.org/plugins/Polygonizer heißt es, dass "Polygone aus sich überschneidenden Linien erstellt werden". Dies deutet darauf hin, dass Polygone immer dann erstellt werden, wenn es einen Linienschnitt gibt (aber möglicherweise ist meine Interpretation falsch). Was ich brauche, ist, die Lücken zu beseitigen, die bei der Verwendung des Werkzeugs "Geometrien vereinfachen" entstanden sind, und wenn Polygonizer dies kann, wäre ich sehr glücklich.
David
Wenn Sie darüber nachdenken, sollte sich Ihre ursprüngliche Polygonebene problemlos vereinfachen lassen. Wenn dies nicht der Fall ist, bedeutet dies wahrscheinlich, dass die Originaldaten fehlerhafte Polygone enthalten. Polygone, die sich leicht überlappen oder zwischen denen winzige Zwischenräume liegen. Versuchen Sie, die Problembereiche zu vergrößern, um festzustellen, ob Sie so etwas finden. N.
nhopton
Eine gute Möglichkeit, die Topologie beizubehalten, besteht in dem von @radouxju vorgeschlagenen Workflow (mit Ausnahme der nicht erforderlichen Schwerpunktberechnung), der in meiner Antwort im Verarbeitungsmodell dargestellt wird. Alternativ denke ich, dass GRASS v.generalizeeine weitere großartige Option ist. Hoffe das hilft.
Antonio Falciano

Antworten:

7

Ich habe mit GRASS v.generalize aus der Processing Toolbox ein ziemlich gutes Ergebnis mit Standardwerten erzielt:

Geben Sie hier die Bildbeschreibung ein

Einige Zeilen bleiben unberührt.

AndreJ
quelle
Hatte guten Erfolg mit dieser Methode, nachdem die v.in.ogr-Snap-Toleranz von -1 (kein Snap) auf 0,00001 eingestellt wurde, wie von @Kantan vorgeschlagen.
cm1
4

Ich bin mit Qgis2.16 auf dieses Problem gestoßen, konnte GRASS jedoch nicht dazu bringen, ein topologisch korrektes Ergebnis wie @AndreJ zu liefern.

Eine gute Problemumgehung besteht darin, die Snap-Toleranz von v.in.ogr in den erweiterten Parametern des Tools v.generalize.simplify zu ändern . Der Standardwert ist -1, wodurch das Einrasten von GRASS verhindert wird.

Wenn Sie hier einen kleinen Wert eingeben (z. B. 1e-05 m), wird das Einrasten aktiviert und GRASS erkennt die gemeinsamen Ränder der Polygone. Die Vereinfachung ergibt dann eine topologisch korrekte Schicht ohne Löcher.

Hinweis: Wenn Sie die Fangtoleranz auf höhere Werte einstellen, können Sie die Polygone sogar so ändern, dass sehr dünne gelöscht werden können, wenn Sie möchten. Folgen Sie dieser Operation mit v.clean mit rmarea und einem Schwellenwert, der groß genug ist, um die kleinen Reste zu löschen, und fertig!

Kantan
quelle
3

Konvertieren Sie zuerst Ihr Polygon in Linien

Verwenden Sie v.clean, um Ihre Topologie zu bereinigen (mit der Option "break").

dann vereinfachen Sie Ihre Zeilen

Schließlich drehen Sie Ihre Linien wieder in Polygone um (mit polygonize)

BEARBEITEN: Um die Attribute Ihrer Polygone zu erhalten, ist es am besten, wenn Sie keine mehrteiligen Polygone im Originaldatensatz haben , die Schwerpunkte der alten und der vereinfachten Polygone abzurufen und sie basierend auf der nächstgelegenen Position zu verbinden (Schwerpunkte sollten) nicht viel bewegen, wenn Sie Ihre Grenzen nur geringfügig ändern)

Radouxju
quelle
1
Für mich sieht es so aus, als würden Sie einige Schritte weglassen, obwohl der Workflow am Ende möglicherweise funktioniert. Wenn Sie die Polygone in Linien konvertieren, müssen Sie die Linie möglicherweise allen benachbarten Polygonen zuordnen. Nach der Vereinfachung müssen Sie die Linien wieder in mehrteilige Polygone umwandeln. Wenn die ursprünglichen Polygone konvex sind, können Sie das Original möglicherweise mithilfe des Schwerpunkts mit dem vereinfachten übereinstimmen (z. B. wenn der Schwerpunkt des Originals in dem vereinfachten Poly enthalten ist, handelt es sich um eine Übereinstimmung). Wenn sie nicht konvex sind, wird es viel schwieriger.
Andy W
Hallo, ich habe das von radouxju vorgeschlagene Verfahren befolgt, aber ich erhalte immer noch Teile des ursprünglichen Polygons außerhalb seiner ursprünglichen Grenzen. Wie ordne ich die Linie allen benachbarten Polygonen in QGIS zu? Ich plane, diese Polygone in den Webanwendungen zu verwenden und muss die Anzahl der Knoten reduzieren, um das Laden zu beschleunigen. Was ich jetzt bekomme, ist eine gute Reduzierung, aber ich kann diese kleinen Bereiche, die nach der Vereinfachung vorhanden sind, nicht loswerden. Ideen zur Lösung dieses Problems werden sehr geschätzt.
David
@David. Ich denke, Ihr Problem könnte in Schritt 3 liegen, Linien zu Polygonen. Im Processing Toolkit gibt es ein Tool namens "Polygonize" und ich würde es versuchen. Ich denke, dafür müssen noch die Shapely- und Numpy-Pakete installiert werden. Trotzdem kann ich "Polygonize" nicht in der Minute dazu bringen, für mich in QGIS-Master zu arbeiten. N.
nhopton
2

Sie können das Problem mit einem Verarbeitungsmodell (ex SEXTANTE) wie folgt lösen:

Geben Sie hier die Bildbeschreibung ein

Skriptversion:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Anmerkung: Die einzige Einschränkung ist , dass das gemeinsame Feld sein muss , IDin Join attributes table, weil der einzige Bereich des Ausgangs Lines to polygons. Aus diesem Grund ist das gemeinsame Feld keine variable Eingabe des Modells. Daher IDmuss in der Eingabe-Polygon-Ebene ein Feld verfügbar sein.

Antonio Falciano
quelle