¿Crear simbología de relleno de polígono de punto aleatorio en QGIS?


9

Usando QGIS 2.18.3, me gustaría aplicar un patrón de puntos aleatorios a mi simbología de polígono. El Administrador de estilos predeterminado tiene un patrón de puntos regularmente espaciado , llamado Cemetery-25-50k (vea la imagen a continuación). Este es un buen punto de partida, pero obviamente no es aleatorio.

ingrese la descripción de la imagen aquí

Alternativamente, he revisado las opciones de relleno del Patrón de puntos dentro de las Propiedades de capa (a continuación), pero no aparece nada que genere un patrón aleatorio.

ingrese la descripción de la imagen aquí

Lo que necesito para recrear es la simbología de puntos aleatorios de Arcmap de ESRI, que se muestra aquí:

ingrese la descripción de la imagen aquí


Una posibilidad (que permite un mayor control sobre la aleatoriedad, y también usar símbolos arbitrarios como los árboles) es usar Inkscape para crear un SVG (usando clones en mosaico con aleatoriedad), y usar un relleno SVG.
Steven Kay

Respuestas:


12

Puede agregar simbología de puntos aleatorios con los siguientes pasos:

  1. Agregue una nueva capa de símbolo con el botón '+':

ingrese la descripción de la imagen aquí

  1. Cambie el tipo de capa de Símbolo a 'Relleno de patrón de puntos'
  2. Resalte 'Relleno de patrón de puntos' en el árbol del lado izquierdo
  3. Cambie las distancias horizontal y vertical a valores razonables. En este ejemplo, elegí el mismo valor para ambas distancias de2.0
  4. Bajo el desplazamiento horizontal y el desplazamiento vertical, use las siguientes funciones:

    5.1 Para desplazamiento horizontal:

    randf(3,5) 

    5.2 Para desplazamiento vertical

    randf(2,4) 
  5. Duplique la capa de puntos y cambie las distancias horizontal y vertical a 6 y 3, respectivamente. Bajo el desplazamiento horizontal y el desplazamiento vertical, use las siguientes funciones:

    6.1 Para desplazamiento horizontal:

    randf(0,1) 

    6.2 Para desplazamiento vertical

    randf(1,2) 
  6. Necesita reducir el tamaño del símbolo a 2 Pixels

Puede ver el resultado en la siguiente imagen:

ingrese la descripción de la imagen aquí

En el compositor, la leyenda se verá así:

ingrese la descripción de la imagen aquí


2
No duplica la aleatoriedad de la simbología de Arc incorporada, pero esa es una buena solución. Para aumentar la aleatoriedad, use la función randf () en las distancias horizontal y vertical y también duplique el relleno varias veces.
Ed Rollason

1
@EdRollason Gracias por tu comentario. También es una buena idea agregar varias capas con la función randf ().
ahmadhanb

1
@ahmadhanb ¡Solución interesante, marcada como favorita!
mgri

2

Otra técnica consiste en utilizar InkScape para crear un SVG y utilizar una capa de relleno SVG en QGIS.

Permite un mayor control sobre la simbología (por ejemplo, podría dibujar árboles dispersos al azar, no solo puntos) y un mayor control sobre el espaciado

  • En Inkscape, dibuje un círculo / árbol y seleccione el objeto
  • Editar> Clonar> Clones en mosaico
  • Cree (digamos) 5 x 5 o 10x10 clones en mosaico. Es una buena idea mantener el tamaño de la cuadrícula pequeño, ya que QGIS tendrá problemas si tiene demasiados símbolos.
  • En la pestaña Shift, elija algo como esto ... usar la configuración predeterminada está bien, pero cambie la configuración Randomise para agregar 'jitter'.

Experimente con la configuración, siempre puede hacer clic en Removesi el resultado no es bueno.

ingrese la descripción de la imagen aquí

  • Haga clic Create.
  • Seleccione todos los clones en mosaico usando CtrlA
  • CtrlShiftD para abrir las propiedades del documento
  • Seleccione Cambiar tamaño de página a dibujo o selección
  • Guardar como SVG, pero asegúrese de usar el formato SVG simple
  • Ahora ingrese a QGIS como un símbolo de relleno SVG.

Aquí hay uno en el que hice una cuadrícula aleatoria de 5 x 5 copias de uno de los árboles integrados de QGIS. Al experimentar con el espaciado y el jitter puede obtener diferentes miradas. También puede experimentar con el desplazamiento horizontal de QGIS . Al establecer eso a la mitad de la distancia horizontal, se rompe el aspecto de "mosaico" (dando un patrón como ladrillos en una pared)

ingrese la descripción de la imagen aquí


0

Acabo de encontrar un script en línea que con algunos ajustes funciona con qgis 3.5.x

Perdí la publicación original, así que no puedo dar crédito al autor.

Lo que haces es:

  • crear capa de relleno cambiarlo a "generador de geometría"
  • cambiar "tipo de geometría" a puntos
  • para la expresión, haga clic en el botón "sigma" directamente al campo de texto
  • en la ventana de "diálogo de expresión", cambie la pestaña al "Editor de funciones" y pegue el código debajo
  • Ahora, de vuelta al "diálogo de expresión", pegue la llamada a la función así: fillGrid (0.001,0.001,1) (los primeros 2 valores son de tamaño aleatorio)
  • Guardar cambios y actualizar vista.
  • Impresionantes puntos aleatorios están ahí.

Gracias al autor original del guión.

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.