Czy tworzysz losową symbolikę wypełnienia wielokątów w QGIS?

9

Korzystając z QGIS 2.18.3, chciałbym zastosować losowy wzór punktowy do mojej symboliki wielokątów. Domyślny Menedżer stylów ma regularnie rozmieszczony wzór punktowy, zwany Cmentarz-25-50k (patrz zdjęcie poniżej). To dobry punkt wyjścia, ale oczywiście nieprzypadkowy.

wprowadź opis zdjęcia tutaj

Alternatywnie, przejrzałem opcje wypełnienia Wzorem Punktu we Właściwościach Warstwy (poniżej), ale nic nie wydaje się, by wygenerować losowy wzór.

wprowadź opis zdjęcia tutaj

To, co muszę odtworzyć, to symbol losowego punktu ESRI Arcmap, pokazany tutaj:

wprowadź opis zdjęcia tutaj

Stu Smith
źródło
jedną z możliwości (która pozwala na większą kontrolę nad losowością, a także używanie symboli abritrarnych, takich jak drzewa), jest użycie programu inkscape do utworzenia pliku SVG (przy użyciu losowo klonów sąsiadujących) i użycie wypełnienia SVG.
Steven Kay,

Odpowiedzi:

12

Możesz dodać symbolikę punktów losowych, wykonując następujące czynności:

  1. Dodaj nową warstwę symboli za pomocą przycisku „+”:

wprowadź opis zdjęcia tutaj

  1. Zmień typ warstwy Symbolu na „Wypełnienie wzorem punktowym”
  2. Podświetl „Wypełnienie wzorem punktowym” w drzewie po lewej stronie
  3. Zmień odległości w poziomie i pionie na rozsądne wartości. W tym przykładzie wybrałem tę samą wartość dla obu odległości2.0
  4. W obszarze Przesunięcie w poziomie i przesunięcie w pionie użyj następujących funkcji:

    5.1 Dla przemieszczenia poziomego:

    randf(3,5) 

    5.2 Dla przemieszczenia pionowego

    randf(2,4) 
  5. Powiel warstwę punktową i zmień odległości w poziomie i pionie odpowiednio na 6 i 3. W obszarze Przesunięcie w poziomie i przesunięcie w pionie użyj następujących funkcji:

    6.1 Dla przemieszczenia poziomego:

    randf(0,1) 

    6.2 Dla przemieszczenia pionowego

    randf(1,2) 
  6. Musisz zmniejszyć rozmiar symbolu do 2 Pixels

Dane wyjściowe można zobaczyć na następującym obrazku:

wprowadź opis zdjęcia tutaj

W kompozytorze legenda będzie wyglądać następująco:

wprowadź opis zdjęcia tutaj

ahmadhanb
źródło
2
Nie odzwierciedla to losowości wbudowanej symboliki Arc, ale to miłe rozwiązanie. Aby zwiększyć losowość, użyj funkcji randf () na odległościach poziomych i pionowych, a także kilkakrotnie powtórz wypełnienie.
Ed Rollason
1
@EdRollason Dzięki za komentarz. Dobrym pomysłem jest również dodanie kilku warstw za pomocą funkcji randf ().
ahmadhanb
1
@ahmadhanb Ciekawe rozwiązanie, zakładki!
mgri
2

inna technika polega na użyciu InkScape do utworzenia SVG i użyciu warstwy wypełniającej SVG w QGIS.

Pozwala na większą kontrolę nad symboliką (np. Możesz rysować losowo rozrzucone drzewa, nie tylko punkty) i większą kontrolę nad odstępami

  • W Inkscape narysuj okrąg / drzewo i wybierz obiekt
  • Edycja> Klon> Klony sąsiadująco
  • Utwórz (powiedzmy) 5 x 5 lub 10 x 10 klonów kafelkowych. Dobrym pomysłem jest utrzymywanie małych rozmiarów siatki, ponieważ QGIS będzie walczył, jeśli masz zbyt wiele symboli.
  • Na karcie Shift wybierz coś takiego: użyj domyślnych ustawień, ale zmień ustawienie Losowo , aby dodać „fluktuacje”.

Eksperymentuj z ustawieniami, zawsze możesz kliknąć, Removejeśli wynik nie jest dobry.

wprowadź opis zdjęcia tutaj

  • Kliknij Create.
  • Wybierz wszystkie klony sąsiadująco za pomocą CtrlA
  • CtrlShiftD aby wyświetlić właściwości dokumentu
  • Wybierz opcję Zmień rozmiar strony do rysunku lub zaznaczenia
  • Zapisz jako SVG, ale upewnij się, że używasz prostego formatu SVG
  • Teraz wprowadzaj do QGIS jako wypełnienie symbolu SVG.

Oto jeden, w którym wykonałem losową siatkę 5 x 5 kopii jednego z wbudowanych drzew QGIS. Eksperymentując z odstępami i fluktuacjami, możesz uzyskać inny wygląd. Możesz także eksperymentować z przemieszczeniem poziomym QGIS . Ustawiając ją na połowę odległości poziomej, przerywa wygląd „kafelków” (dając wzór przypominający cegły w ścianie)

wprowadź opis zdjęcia tutaj

Steven Kay
źródło
0

Właśnie znalazłem skrypt online, który z pewnymi poprawkami działa z qgis 3.5.x

Zgubiłem oryginalny post, więc nie mogę przypisać autorowi.

Co robisz to:

  • utwórz warstwę wypełnienia zmień ją na „generator geometrii”
  • zmień „typ geometrii” na punkty
  • dla wyrażenia kliknij przycisk „sigma” bezpośrednio w polu tekstowym
  • w zakładce „okno dialogowe wyrażenia” zmień zakładkę na „Edytor funkcji” i wklej poniżej kod
  • Teraz wróć do „okna dialogowego wyrażenia” wklej wywołanie funkcji w ten sposób: fillGrid (0,001,0.001,1) (pierwsze 2 wartości są wielkościami losowymi)
  • Zapisz zmiany i zaktualizuj widok.
  • Są tam niesamowite losowe punkty.

Dzięki oryginalnemu autorowi skryptu.

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
źródło