Erstellen von Punkten mit regelmäßigem Abstand innerhalb eines Polygons basierend auf dem Attributwert mithilfe von QGIS?

11

Ich habe eine Polygonebene mit einem Attributwert, der die Anzahl der Personen innerhalb eines Polygons darstellt. Ich verwende QGIS 3.0.

Ich muss die Anzahl als ein Gitter von Punkten innerhalb eines Polygons visualisieren (dh 1 Punkt = 100 Frösche, gefärbt nach Spezies). Die Punkte müssen nicht unbedingt das gesamte Polygon einnehmen und müssen vorzugsweise um einen Schwerpunkt mit vordefiniertem Abstand (dh 300 m) gezeichnet werden, damit sie ein ordentliches Gitter mit einer bestimmten Auflösung darstellen können.

Die derzeitige Problemumgehung besteht darin, "Regelmäßige Punkte" mit dem Parameter "Zählungen" zu verwenden, um Gitter innerhalb der auf einer Karte gezeichneten Ausdehnung zu erstellen und dann die vom Algorithmus erstellten zusätzlichen Punkte zu löschen (Algorithmus rundet auf ein Gitter und Sie erhalten möglicherweise 20 statt 17 Zoll) Eingang). Dies führt zu dem gewünschten Ergebnis, erfordert jedoch das Zeichnen der Flächenausdehnung für reguläre Punkte für jedes Polygon sowie die manuelle Eingabe von Attributen und das Bereinigen der erstellten Punkte. Da ich "Reguläre Punkte" mit der angegebenen Anzahl anstelle des Abstands ausführe, erhält jedes Polygon außerdem Punkte mit unterschiedlichen Abständen.

Kurz gesagt: Regelmäßige Punkte (definierte Anzahl von Punkten, gezeichnete Ausdehnung) für jedes Polygon (Stapel)> Zusätzliche Punkte löschen> den # Punkten Attributwerte zuweisen

Alternative (vermeidet den unregelmäßigen Abstand, erfordert aber noch mehr Manipulationen):

Regelmäßige Punkte (definierter Abstand, dh 300 m) in der Ausdehnung der gesamten Ebene> In die Ausdehnung der Polygone schneiden> Zusätzliche Punkte in jedem Polygon löschen, bis Sie die gewünschte Anzahl von Punkten erhalten> Punkte Attributwerte zuweisen.

Das Hauptproblem bei meinen Problemumgehungen ist die polygonweise Verarbeitung, die es schwierig macht, die Daten zu aktualisieren und mit einer größeren Anzahl von Polygonen zu arbeiten.

Die analoge Frage wurde gestellt als Erstellen einer regelmäßig verteilten, definierten Anzahl von Punkten innerhalb eines Polygons in QGIS , aber die Besonderheiten sind unterschiedlich.

Screenshot des gewünschten Ergebnisses:

Attribut tableL:

Ruslan
quelle
1
Stellt das Bild in Ihrer Frage dar, was Sie als Ergebnis erwarten? Woher kommen die Anzahl der farbigen Punkte? Könnten Sie eine Attributtabelle der Ebene hinzufügen? Insbesondere Attribute von Polygonen wie Edmonton und Sherwood Park für ein besseres Verständnis der Farben und Zählungen.
Kadir Şahbaz
1. Dies sind nur maskierte Daten, die nicht viel mit tatsächlichen Polygonen zu tun haben, aber ja, ich erwarte ein solches Ergebnis, aber mit Punkten um die Mitte des Polygons. 2. Zählungen stammen aus Attributtabellenspalten, da es drei Spalten / Punkttypen gibt, die ich zu einer Spalte zusammengefasst habe, um zuerst die richtige Anzahl von Punkten pro Polygon zu erhalten und dann die Attribute / Farben mithilfe von Ausdrücken zuzuweisen. edit: Excel- Tabelle in Frage gestellt, repräsentiert nicht die Werte, sondern die Struktur meiner Daten.
Ruslan

Antworten:

5

QGIS 3 enthält eine neue Verschiebungsmethode im Cluster-Renderer namens grid. Sieht so aus, als ob das so ziemlich das ist, was du brauchst. Erstellen Sie einfach die Anzahl der gewünschten Punkte am Schwerpunkt Ihres Polygons.

Geben Sie hier die Bildbeschreibung ein

Mir ist keine Methode bekannt, um die Punkte nur mit einem GUI-Tool zu generieren, aber ein relativ einfaches Python-Skript sollte dies tun.

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

Wenn Sie verrückt werden möchten, verpacken Sie dies in einen benutzerdefinierten Verarbeitungsalgorithmus.

Matthias Kuhn
quelle
Danke Matthias, das scheint noch besser zu sein als andere Lösungen. Können Sie einen Weg vorschlagen, um schnell die gewünschte Anzahl von Punkten basierend auf der Attributtabelle zu erstellen, um dies zu erreichen?
Ruslan
Ich kenne keine einfache Methode, außer ein kleines Python-Skript zu schreiben. Der Code ist völlig ungetestet, kann also einige Tippfehler haben;)
Matthias Kuhn
Danke noch einmal. Ich werde wahrscheinlich eine ähnliche Visualisierung für viele Ebenen / Bereiche usw. durchführen müssen, also werde ich versuchen, zumindest ein Verarbeitungsmodell dafür zu erstellen.
Ruslan
5

Vielleicht ein anderer Weg, der durch die Antwort von Sarath SRK inspiriert wird:

  1. Schwerpunkt der Polygone
  2. Puffer, der einen Ausdruck mit dem Quadrat verwendet und sich an Ihre Skala anpasst: dh (1000 * (sqrt ("Frösche" + "Katzen" + "Diplodocs") / 2)) + 1 und Segment = 1, Endkappenstil = Quadrat
  3. Neuer Gitterpunkt mit einem Abstand, der mit der Skalierung des Puffers übereinstimmt.
  4. Punkt löschen, der sich nicht mit der Pufferebene schneidet (nach Ort auswählen)
  5. Attribut nach Ort verbinden (Attribut des Puffers oder der ursprünglichen Polygone)

Sie werden jedoch so etwas haben Geben Sie hier die Bildbeschreibung ein

  1. Verwenden Sie einen grafischen Modellierer, um ein neues Feld mit dem Befehl "@row_number" zu erstellen. Geben Sie hier die Bildbeschreibung ein

  2. Führen Sie das Modell mit einer Iteration auf der Pufferschicht aus Geben Sie hier die Bildbeschreibung ein

  3. Alle neuen Ebenen zusammenführen

  4. Löschen Sie alle Punkte mit einem ID_pt-Feld, das größer ist als die Summe Ihres Feldes ("Frösche" + "Katzen" + "Diplodocs").

  5. Mit Regeln kategorisieren (dh
    • "ID_pt" <= "Frösche"
    • "ID_pt"> "Frösche" und "ID_pt" <= ("Katzen" + "Frösche")
    • "ID_pt"> ("Katzen" + "Frösche") und "ID_pt" <= ("Katzen" + "Frösche" + "Diplodocs") Geben Sie hier die Bildbeschreibung ein
Christophe
quelle
Danke dafür! Ich hätte heute keine Zeit, dies zu versuchen, aber es scheint eine praktikable Lösung zu sein, wenn man bedenkt, dass Sie die gewünschte Ausgabe erhalten haben.
Ruslan
1

Sie können hierfür Geometriegeneratoren verwenden.

  1. Fügen Sie dem Symbol 3 Unterschichten hinzu, eine für jede Farbe / jedes Attribut.
  2. Erstellen Sie einen Ausdruck, der für jede Unterschicht ein Multipolygon generiert.
  3. Generieren Sie nun als schwieriger Teil quadratische Teile für das Multipolygon basierend auf dem Attribut. Ich denke, dies erfordert eine benutzerdefinierte Python-Ausdrucksfunktion.
  4. Verwenden Sie optional die Rendervariablen für die Kartenskalierung, um die Skalierung der Polygone und den Abstand zu bestimmen.
Matthias Kuhn
quelle
Entschuldigung, ich bin gerade zu beschäftigt für eine vollständige Antwort, aber es wird eine sehr interessante Herausforderung sein, hier etwas aus diesem Rezept zu erfinden. Vielleicht kommt jemand dazu, uns auf dieser Grundlage eine gute Lösung zu bieten.
Matthias Kuhn
1

Eine Lösung könnte darin bestehen, eine Punktebene mit Punkten am Schwerpunkt jedes Polygons zu erstellen. Zum Beispiel haben Sie am Schwerpunkt von Edmonton 25 überlagerte Punkte erhalten: 5 mit einem Froschattribut, 20 Punkte mit Katze und 0 mit Diplodocs.

Wenn Sie dann den Punktverschiebungs-Renderer mit der als Raster festgelegten Platzierungsmethode verwenden, sollten Sie in der Lage sein, den Effekt zu erzielen.

Die Schwierigkeit besteht darin, die Punktebene zu erstellen ....

JR
quelle
0

Eine sehr einfache Alternative könnte darin bestehen, das Kreisdiagramm zu verwenden, das in den Eigenschaften der Ebene verfügbar ist. Attribute und Größen können durch einen Ausdruck vorgegeben werden.

Geben Sie hier die Bildbeschreibung ein

Christophe
quelle
2
Nun, ich kenne alternative Möglichkeiten, um die Daten abzubilden. Der Punkt der Frage ist, diesen Visualisierungsworkflow zu ermöglichen. Die Kreisdiagramme funktionieren nicht wirklich, weil Sie beim Betrachten des Rasters einen sehr guten Eindruck von der Anzahl der Personen bekommen. Der Versuch, genaue Einzelzahlen jedes Polygons aus Kreisdiagrammen zu schätzen, ist nahezu unmöglich.
Ruslan
0

Sie können die Punkte auf einem Spiralpfad ausgehend vom Polygonschwerpunkt generieren. Der folgende Beitrag zum Stapelüberlauf enthält Python-Code zum Erstellen von Punkten mit gleichem Abstand, aber ich kann ihn derzeit nicht testen, da mir die Freizeit fehlt.

Techie_Gus
quelle
Scheint nah genug zu sein, aber wie in der Frage erwähnt, bin ich nicht kompetent genug, um dies zu codieren / den dort vorgeschlagenen Code zu ändern.
Ruslan
Hoffentlich
mischt sich
0

In deinem Fall,

  1. Erstellen Sie Punkte mit regelmäßigem Abstand unter Verwendung des angegebenen Abstands für den gesamten AOI
  2. Erstellen Sie Schwerpunktpunkte für alle Polygone (Eingabe).
  3. Erstellen Sie einen Puffer für diese Schwerpunktpunkte mit dem Puffer für festen Abstand mit dem Segmentwert '1'. Es wird ein quadratischer Puffer anstelle eines Kreises erstellt (Verwenden Sie das Drehwerkzeug in Qgis, wenn Sie Pufferpolygone drehen möchten).
  4. Erstellen Sie eine Auswahl von Punkten, die in Pufferpolygone fallen, mit Vektor -> Recherchewerkzeuge -> Nach Position auswählen (Punkte innerhalb der Polygonregel).
  5. Wechseln Sie die Auswahl und löschen Sie Punkte außerhalb der Pufferpolygone. Jetzt haben Sie regelmäßig Punkte um den Schwerpunkt der Polygone verteilt.
  6. Geben Sie das Mehrheitsattribut für ganze Punkte an, und der Rest der Punkte muss manuell klassifiziert werden. Verwenden Sie das Tool QuickMultiAttributeEdit , um Attribute einfach zu aktualisieren.
Sarath SRK
quelle
Vielen Dank, dies scheint die Verarbeitungsschritte zu reduzieren, aber dies löst nicht das Problem, dass manuell ausgewählt werden muss (Puffer in Polygonen wären in der Größe identisch = gleiche Anzahl von Punkten pro Polygon), erstellte Punkte für jeden der Punkte gelöscht und zugeordnet werden Polygone, das ist das Hauptproblem bei diesem und meinem Workflow.
Ruslan