Creazione della simbologia di riempimento poligonale a punti casuali in QGIS?


9

Usando QGIS 2.18.3, vorrei applicare un modello a punti casuale alla mia simbologia poligonale. Lo Style Manager predefinito ha uno schema di punti a intervalli regolari , chiamato Cemetery-25-50k (vedi immagine sotto). Questo è un buon punto di partenza, ma ovviamente non casuale.

inserisci qui la descrizione dell'immagine

In alternativa, ho esaminato le opzioni di riempimento Pattern punto all'interno delle Proprietà livello (sotto), ma non appare nulla che genererebbe un motivo casuale.

inserisci qui la descrizione dell'immagine

Quello che devo ricreare è la simbologia a punti casuali ESRI Arcmap, mostrata qui:

inserisci qui la descrizione dell'immagine


una possibilità (che consente un maggiore controllo sulla casualità e che utilizza anche simboli abritrari come gli alberi) è quella di utilizzare inkscape per creare un SVG (usando cloni piastrellati con casualità) e usare un riempimento SVG.
Steven Kay,

Risposte:


12

È possibile aggiungere la simbologia dei punti casuali utilizzando i seguenti passaggi:

  1. Aggiungi un nuovo livello simbolo usando il pulsante '+':

inserisci qui la descrizione dell'immagine

  1. Cambia il tipo di livello Simbolo in "Riempimento con motivo a punti"
  2. Evidenzia "Riempimento con motivo a punti" nella struttura a sinistra
  3. Cambia le distanze orizzontali e verticali in valori ragionevoli. In questo esempio, ho scelto lo stesso valore per entrambe le distanze di2.0
  4. Sotto lo spostamento orizzontale e lo spostamento verticale, utilizzare le seguenti funzioni:

    5.1 Per spostamento orizzontale:

    randf(3,5) 

    5.2 Per lo spostamento verticale

    randf(2,4) 
  5. Duplica il livello punto e modifica le distanze orizzontale e verticale rispettivamente a 6 e 3. Sotto lo spostamento orizzontale e lo spostamento verticale, utilizzare le seguenti funzioni:

    6.1 Per spostamento orizzontale:

    randf(0,1) 

    6.2 Per lo spostamento verticale

    randf(1,2) 
  6. Devi ridurre la dimensione del simbolo a 2 Pixels

Puoi vedere l'output nella seguente immagine:

inserisci qui la descrizione dell'immagine

Nel compositore, la leggenda apparirà così:

inserisci qui la descrizione dell'immagine


2
Non duplica del tutto la casualità della simbologia Arc incorporata, ma è una buona soluzione. Per aumentare la casualità, utilizzare la funzione randf () sulle distanze orizzontale e verticale e duplicare più volte il riempimento.
Ed Rollason,

1
@EdRollason Grazie per il tuo commento. È anche una buona idea aggiungere diversi livelli con la funzione randf ().
ahmadhanb,

1
@ahmadhanb Soluzione interessante, aggiunta ai segnalibri!
mgri

2

un'altra tecnica prevede l'utilizzo di InkScape per creare un SVG e l'uso di un livello di riempimento SVG in QGIS.

Consente un maggiore controllo sulla simbologia (ad esempio, è possibile disegnare alberi sparsi casualmente, non solo punti) e un maggiore controllo sulla spaziatura

  • In Inkscape, disegna un cerchio / albero e seleziona l'oggetto
  • Modifica> Clone> Cloni piastrellati
  • Crea (diciamo) 5 x 5 o 10x10 cloni piastrellati. È una buona idea mantenere piccole le dimensioni della griglia poiché QGIS farà fatica se si hanno troppi simboli.
  • Nella scheda Maiusc, scegli qualcosa di simile ... usa le impostazioni predefinite è ok, ma cambia l' impostazione Casuale per aggiungere "jitter".

Sperimenta con le impostazioni, puoi sempre fare clic su Removese il risultato non è buono.

inserisci qui la descrizione dell'immagine

  • Fare clic Create.
  • Selezionare tutti i cloni piastrellati utilizzando CtrlA
  • CtrlShiftD per visualizzare le proprietà del documento
  • Seleziona Ridimensiona pagina in disegno o selezione
  • Salva come SVG, ma assicurati di utilizzare il formato SVG semplice
  • Ora porta in QGIS come riempimento simbolo SVG.

Eccone uno in cui ho realizzato una griglia casuale di 5 x 5 copie di uno degli alberi incorporati di QGIS. Sperimentando spaziatura e jitter è possibile ottenere diversi look. Puoi anche sperimentare lo spostamento orizzontale di QGIS . Impostandolo a metà della distanza orizzontale, interrompe l'aspetto "piastrellato" (dando un motivo come mattoni in un muro)

inserisci qui la descrizione dell'immagine


0

Ho appena trovato uno script online che con alcune regolazioni funziona con qgis 3.5.x

Ho perso il post originale, quindi non posso dare credito all'autore.

Quello che fai è:

  • crea livello di riempimento cambiarlo in "generatore di geometria"
  • cambia il "tipo di geometria" in punti
  • per l'espressione fai clic sul pulsante "sigma" direttamente nel campo di testo
  • nella scheda "Finestra di dialogo espressioni" cambia l '"Editor funzioni" e incolla il codice sottostante
  • Ora torniamo alla "finestra di dialogo delle espressioni" incolla la chiamata della funzione in questo modo: fillGrid (0.001,0.001,1) (i primi 2 valori sono la dimensione casuale)
  • Salva le modifiche e aggiorna la vista.
  • Ci sono fantastici punti casuali.

Grazie all'autore originale della sceneggiatura.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.