Créer une symbologie de remplissage de polygones ponctuels aléatoires dans QGIS?

9

En utilisant QGIS 2.18.3, je voudrais appliquer un motif de points aléatoires à ma symbologie polygonale. Le gestionnaire de styles par défaut a un motif de points régulièrement espacés , appelé Cemetery-25-50k (veuillez voir l'image ci-dessous). C'est un bon point de départ, mais évidemment pas aléatoire.

entrez la description de l'image ici

Alternativement, j'ai examiné les options de remplissage du modèle de point dans les propriétés du calque (ci-dessous), mais rien ne semble générer un modèle aléatoire.

entrez la description de l'image ici

Ce que je dois recréer est la symbologie de points aléatoires ESRI Arcmap, illustrée ici:

entrez la description de l'image ici

Stu Smith
la source
une possibilité (qui permet plus de contrôle sur le caractère aléatoire et utilise également des symboles abritaires comme les arbres) consiste à utiliser inkscape pour créer un SVG (en utilisant des clones en mosaïque avec un caractère aléatoire) et à utiliser un remplissage SVG.
Steven Kay

Réponses:

12

Vous pouvez ajouter une symbologie ponctuelle aléatoire en procédant comme suit:

  1. Ajoutez un nouveau calque de symboles à l'aide du bouton '+':

entrez la description de l'image ici

  1. Remplacez le type de calque de symbole par «Remplissage par points»
  2. Sélectionnez 'Point pattern fill' dans l'arborescence de gauche
  3. Modifiez les distances horizontales et verticales en valeurs raisonnables. Dans cet exemple, j'ai choisi la même valeur pour les deux distances de2.0
  4. Sous Déplacement horizontal et déplacement vertical, utilisez les fonctions suivantes:

    5.1 Pour le déplacement horizontal:

    randf(3,5) 

    5.2 Pour le déplacement vertical

    randf(2,4) 
  5. Dupliquez la couche de points et modifiez les distances horizontale et verticale à 6 et 3, respectivement. Sous Déplacement horizontal et déplacement vertical, utilisez les fonctions suivantes:

    6.1 Pour le déplacement horizontal:

    randf(0,1) 

    6.2 Pour le déplacement vertical

    randf(1,2) 
  6. Vous devez réduire la taille du symbole à 2 Pixels

Vous pouvez voir la sortie dans l'image suivante:

entrez la description de l'image ici

Dans le compositeur, la légende ressemblera à ceci:

entrez la description de l'image ici

ahmadhanb
la source
2
Il ne reproduit pas tout à fait le caractère aléatoire de la symbologie Arc intégrée, mais c'est une bonne solution. Pour augmenter le caractère aléatoire, utilisez la fonction randf () sur les distances horizontales et verticales et dupliquez également le remplissage plusieurs fois.
Ed Rollason
1
@EdRollason Merci pour votre commentaire. C'est aussi une bonne idée d'ajouter plusieurs couches avec la fonction randf ().
ahmadhanb
1
@ahmadhanb Solution intéressante, mise en signet!
mgri
2

une autre technique consiste à utiliser InkScape pour créer un SVG et à utiliser une couche de remplissage SVG dans QGIS.

Il permet plus de contrôle sur la symbologie (par exemple, vous pouvez dessiner des arbres dispersés de manière aléatoire, pas seulement des points) et plus de contrôle sur l'espacement

  • Dans Inkscape, dessinez un cercle / arbre et sélectionnez l'objet
  • Édition> Cloner> Clones en mosaïque
  • Créez (disons) 5 x 5 ou 10x10 clones en mosaïque. C'est une bonne idée de garder la taille de la grille petite car QGIS aura du mal si vous avez trop de symboles.
  • Dans l'onglet Shift, choisissez quelque chose comme ça ... utiliser les paramètres par défaut est correct, mais modifiez le paramètre Randomise pour ajouter "gigue".

Expérimentez avec les paramètres, vous pouvez toujours cliquer sur Removesi le résultat n'est pas bon.

entrez la description de l'image ici

  • Cliquez Create.
  • Sélectionnez tous les clones en mosaïque à l'aide CtrlA
  • CtrlShiftD pour afficher les propriétés du document
  • Sélectionnez Redimensionner la page pour dessiner ou sélectionner
  • Enregistrez en tant que SVG, mais assurez-vous d'utiliser le format SVG simple
  • Introduisez maintenant dans QGIS en tant que remplissage de symbole SVG.

En voici une où j'ai créé une grille aléatoire de 5 x 5 copies de l'une des arborescences intégrées de QGIS. En expérimentant l'espacement et la gigue, vous pouvez obtenir différents looks. Vous pouvez également expérimenter avec le déplacement horizontal de QGIS . En réglant cela à la moitié de la distance horizontale, il brise le look "carrelé" (donnant un motif comme des briques dans un mur)

entrez la description de l'image ici

Steven Kay
la source
0

Je viens de trouver un script en ligne qui, avec quelques ajustements, fonctionne avec qgis 3.5.x

J'ai perdu le message d'origine, je ne peux donc pas créditer l'auteur.

Ce que vous faites c'est:

  • créer un calque de remplissage le changer en "générateur de géométrie"
  • changer le "type de géométrie" en points
  • pour l'expression, cliquez sur le bouton "sigma" à droite du champ de texte
  • dans la fenêtre "boîte de dialogue d'expression", passez à l'onglet "Editeur de fonctions" et collez le code ci-dessous
  • Maintenant, revenons à la "boîte de dialogue d'expression", collez l'appel de fonction comme ceci: fillGrid (0.001,0.001,1) (les 2 premières valeurs sont de la taille aléatoire)
  • Enregistrez les modifications et mettez à jour la vue.
  • De superbes points aléatoires sont là.

Merci à l'auteur original du script.

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
la source