Erstellen einer zufälligen Punktpolygonfüllsymbolik in QGIS?

9

Mit QGIS 2.18.3 möchte ich ein zufälliges Punktmuster auf meine Polygonsymbologie anwenden. Der Standard-Style-Manager verfügt über ein Punktmuster mit regelmäßigem Abstand namens Cemetery-25-50k (siehe Abbildung unten). Dies ist ein guter Ausgangspunkt, aber offensichtlich nicht zufällig.

Geben Sie hier die Bildbeschreibung ein

Alternativ habe ich die Fülloptionen für Punktmuster in den Ebeneneigenschaften (unten) überprüft, aber es wird nichts angezeigt, das ein zufälliges Muster erzeugen würde.

Geben Sie hier die Bildbeschreibung ein

Was ich neu erstellen muss, ist die hier gezeigte ESRI Arcmap-Zufallspunktsymbolik:

Geben Sie hier die Bildbeschreibung ein

Stu Smith
quelle
Eine Möglichkeit (die mehr Kontrolle über die Zufälligkeit ermöglicht und auch abrräre Symbole wie Bäume verwendet) besteht darin, mit inkscape eine SVG zu erstellen (unter Verwendung von gekachelten Klonen mit Zufälligkeit) und eine SVG-Füllung zu verwenden.
Steven Kay

Antworten:

12

Mit den folgenden Schritten können Sie eine zufällige Punktsymbologie hinzufügen:

  1. Fügen Sie mit der Schaltfläche '+' eine neue Symbolebene hinzu:

Geben Sie hier die Bildbeschreibung ein

  1. Ändern Sie den Symbolebenentyp in "Punktmusterfüllung".
  2. Markieren Sie im linken Seitenbaum 'Punktmusterfüllung'
  3. Ändern Sie die horizontalen und vertikalen Abstände auf angemessene Werte. In diesem Beispiel habe ich für beide Entfernungen von den gleichen Wert gewählt2.0
  4. Verwenden Sie unter Horizontale Verschiebung und vertikale Verschiebung die folgenden Funktionen:

    5.1 Für horizontale Verschiebung:

    randf(3,5) 

    5.2 Für vertikale Verschiebung

    randf(2,4) 
  5. Duplizieren Sie die Punktebene und ändern Sie den horizontalen und vertikalen Abstand auf 6 bzw. 3. Verwenden Sie unter Horizontale Verschiebung und vertikale Verschiebung die folgenden Funktionen:

    6.1 Für horizontale Verschiebung:

    randf(0,1) 

    6.2 Für vertikale Verschiebung

    randf(1,2) 
  6. Sie müssen die Symbolgröße auf 2 reduzieren Pixels

Sie können die Ausgabe im folgenden Bild sehen:

Geben Sie hier die Bildbeschreibung ein

Im Komponisten sieht die Legende folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

ahmadhanb
quelle
2
Die Zufälligkeit der integrierten Arc-Symbologie wird nicht ganz dupliziert, aber das ist eine gute Lösung. Um die Zufälligkeit zu erhöhen, verwenden Sie die Funktion randf () für den horizontalen und vertikalen Abstand und duplizieren Sie die Füllung mehrmals.
Ed Rollason
1
@ EdRollason Danke für deinen Kommentar. Es ist auch eine gute Idee, mehrere Ebenen mit der Funktion randf () hinzuzufügen.
Ahmadhanb
1
@ahmadhanb Interessante Lösung, mit Lesezeichen versehen!
Mgri
2

Eine andere Technik besteht darin, mit InkScape ein SVG zu erstellen und in QGIS eine SVG-Füllschicht zu verwenden.

Es ermöglicht mehr Kontrolle über die Symbologie (z. B. können Sie zufällig verstreute Bäume zeichnen, nicht nur Punkte) und mehr Kontrolle über den Abstand

  • Zeichnen Sie in Inkscape einen Kreis / Baum und wählen Sie das Objekt aus
  • Bearbeiten> Klonen> Gekachelte Klone
  • Erstellen Sie (sagen wir) 5 x 5 oder 10 x 10 gekachelte Klone. Es ist eine gute Idee, die Größe des Rasters klein zu halten, da QGIS Probleme hat, wenn Sie zu viele Symbole haben.
  • Wählen Sie auf der Registerkarte "Umschalt" Folgendes aus: Verwenden Sie die Standardeinstellungen, aber ändern Sie die Zufallseinstellung , um "Jitter" hinzuzufügen.

Experimentieren Sie mit den Einstellungen. Sie können jederzeit auf klicken, Removewenn das Ergebnis nicht gut ist.

Geben Sie hier die Bildbeschreibung ein

  • Klicken Sie auf Create.
  • Wählen Sie alle gekachelten Klone mit aus CtrlA
  • CtrlShiftD um Dokumenteigenschaften aufzurufen
  • Wählen Sie Seite an Zeichnung oder Auswahl ändern ändern
  • Als SVG speichern, aber stellen Sie sicher, dass Sie das einfache SVG- Format verwenden
  • Bringen Sie nun QGIS als SVG-Symbolfüllung ein.

Hier ist eine, in der ich ein zufälliges Raster von 5 x 5 Kopien eines der in QGIS integrierten Bäume erstellt habe. Wenn Sie mit Abstand und Jitter experimentieren, erhalten Sie unterschiedliche Looks. Sie können auch mit der horizontalen Verschiebung von QGIS experimentieren . Wenn Sie diesen Wert auf die Hälfte des horizontalen Abstands einstellen, wird der "gekachelte" Look aufgehoben (ein Muster wie Ziegelsteine ​​in einer Wand).

Geben Sie hier die Bildbeschreibung ein

Steven Kay
quelle
0

Ich habe gerade ein Online-Skript gefunden, das mit einigen Anpassungen mit qgis 3.5.x funktioniert

Ich habe den ursprünglichen Beitrag verloren, daher kann ich den Autor nicht gutschreiben.

Was Sie tun, ist:

  • Füllen Sie eine Füllschicht und ändern Sie sie in "Geometriegenerator".
  • Ändern Sie "Geometrietyp" in Punkte
  • Für den Ausdruck klicken Sie auf die Schaltfläche "Sigma" direkt neben dem Textfeld
  • Ändern Sie im Fenster "Ausdrucksdialog" die Registerkarte in den "Funktionseditor" und fügen Sie dort den folgenden Code ein
  • Zurück zum "Ausdrucksdialog" fügen Sie den Funktionsaufruf wie folgt ein: fillGrid (0.001.0.001,1) (die ersten beiden Werte sind die Zufallsgröße)
  • Änderungen speichern und Ansicht aktualisieren.
  • Es gibt tolle zufällige Punkte.

Vielen Dank an den ursprünglichen Autor des Skripts.

from qgis.core import *
from qgis.gui import *
import math
import random

"""
Define a grid based on the interval and the bounding box of
the feature. Grid will minimally cover the feature and be centre aligned

Create a multi-point geometry at the grid intersections where
the grid is enclosed by the feature - i.e. apply a clipping mask

Random value determines amount of randomness in X/Y within its
grid square a particular feature is allowed to have
"""
@qgsfunction(args='auto', group='Custom')
def fillGrid(xInterval, yInterval, rand, feature, parent):
  box = feature.geometry().boundingBox()

  #Create a grid that minimally covers the boundary
  #using the supplied intervals and centre it
  countX = math.ceil(box.width() / xInterval)
  countY = math.ceil(box.height() / yInterval)

  #Align the grid
  gridX = countX * xInterval
  gridY = countY * yInterval
  dX= gridX - box.width()
  dY= gridY - box.height()
  xMin = box.xMinimum() - (dX/2)
  yMin = box.yMinimum() - (dY/2)

  points = []
  #+1 to draw a symbol on the n+1th grid element
  for xOff in range(countX+1):
    for yOff in range(countY+1):

      ptX = xMin + xOff*(xInterval) + rand * random.uniform(0,xInterval)
      ptY = yMin + yOff*(yInterval) + rand * random.uniform(0,xInterval)

      pt = QgsPointXY(ptX,ptY)
      point = QgsGeometry.fromPointXY(pt)
      if feature.geometry().contains(point):
        points.append(pt)

  return QgsGeometry.fromMultiPointXY(points)
MichałKraków
quelle