10 votos

Creación de una simbología de relleno de polígono de punto aleatorio en QGIS

Usando QGIS 2.18.3, me gustaría aplicar un patrón de puntos aleatorios a mi simbología de polígonos. El Administrador de Estilos predeterminado tiene un patrón de puntos regularmente espaciados, llamado Cementerio-25-50k (por favor ver la imagen abajo). Este es un buen punto de partida, pero obviamente no es aleatorio.

entrar descripción de la imagen aquí

Alternativamente, he revisado las opciones de relleno de Patrón de Puntos dentro de las Propiedades de la Capa (abajo), pero no parece haber nada que genere un patrón aleatorio.

entrar descripción de la imagen aquí

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

entrar descripción de la imagen aquí

0 votos

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

13voto

Sushant23 Puntos 329

Puedes agregar una simbología de puntos aleatoria siguiendo los siguientes pasos:

  1. Agrega una nueva capa de símbolos usando el botón '+'

introducir descripción de la imagen aquí

  1. Cambia el tipo de capa de símbolo a 'Relleno de patrón de puntos'

  2. Resalta 'Relleno de patrón de puntos' en el árbol del lado izquierdo

  3. Cambia las distancias horizontales y verticales a valores razonables. En este ejemplo, elegí el mismo valor para ambas distancias de 2.0

  4. Bajo el desplazamiento horizontal y desplazamiento vertical, utiliza las siguientes funciones:

    5.1 Para el desplazamiento horizontal:

    randf(3,5) 

    5.2 Para el desplazamiento vertical

    randf(2,4) 
  5. Duplica la capa de puntos y cambia las distancias horizontales y verticales a 6 y 3, respectivamente. Bajo el desplazamiento horizontal y desplazamiento vertical, utiliza las siguientes funciones:

    6.1 Para el desplazamiento horizontal:

    randf(0,1) 

    6.2 Para el desplazamiento vertical

    randf(1,2) 
  6. Necesitas reducir el tamaño del símbolo a 2 Píxeles

Puedes ver la salida en la siguiente imagen:

introducir descripción de la imagen aquí

En el compositor, la leyenda se verá de la siguiente manera:

introducir descripción de la imagen aquí

2 votos

No duplica completamente la aleatoriedad de la simbología de Arc integrada, pero es una solución interesante. Para aumentar la aleatoriedad, usa la función randf() en las distancias horizontales y verticales y también duplica el relleno varias veces.

1 votos

@EdRollason Gracias por tu comentario. También es una buena idea añadir varias capas con la función randf().

1 votos

@ahmadhanb ¡Interesante solución, marcado como favorito!

2voto

Mat Puntos 196

Otra técnica implica el uso de InkScape para crear un SVG y el uso de una capa de relleno SVG en QGIS.

Permite tener más control sobre la simbología (por ejemplo, se podrían dibujar árboles dispersos al azar, no solo puntos) y más control sobre el espacio.

  • En Inkscape, dibuja un círculo/árbol y selecciona el objeto
  • Editar > Clonar > Clones en mosaico
  • Crea (por ejemplo) 5 x 5 o 10 x 10 clones en mosaico. Es buena idea mantener el tamaño de la cuadrícula pequeño ya que QGIS tendrá dificultades si tienes demasiados símbolos.
  • En la pestaña Desplazar, elige algo como esto... usar la configuración predeterminada está bien, pero cambia la configuración de Aleatorizar para agregar 'sacudida'.

Experimenta con la configuración, siempre puedes hacer clic en Remover si el resultado no es bueno.

introducir descripción de la imagen aquí

  • Haz clic en Crear.
  • Selecciona todos los clones en mosaico usando CtrlA
  • CtrlMayúsD para mostrar propiedades del documento
  • Selecciona Redimensionar página al dibujo o selección
  • Guarda como un SVG, pero asegúrate de usar el formato SVG Simple
  • Ahora llévalo a QGIS como un relleno de símbolo SVG.

Aquí hay un ejemplo donde hice una cuadrícula aleatoria de 5 x 5 copias de uno de los árboles integrados de QGIS. Al experimentar con el espaciado y la sacudida puedes obtener diferentes apariencias. También puedes experimentar con el Desplazamiento Horizontal de QGIS. Al configurarlo a la mitad de la distancia horizontal, se rompe el aspecto "en mosaico" (dando un patrón como ladrillos en una pared).

introducir descripción de la imagen aquí

2voto

Chris Puntos 452

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

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

Lo que debes hacer es:

  • crear una capa de relleno y cambiarla a "Generador de geometría"
  • cambiar el "Tipo de geometría" a puntos
  • para la expresión, hacer clic en el botón "sigma" a la derecha del campo de texto
  • en la ventana de "diálogo de expresión", cambiar a la pestaña "Editor de funciones" y pegar el código a continuación allí
  • Ahora, de vuelta en el "diálogo de expresión", pegar la llamada a la función de esta manera: fillGrid(0.001,0.001,1) (los primeros 2 valores son el tamaño aleatorio)
  • Guardar los cambios y actualizar la vista.
  • ¡Increíbles puntos aleatorios estarán presentes!

Gracias al autor original del script.

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

"""
Define una cuadrícula basada en el intervalo y el cuadro delimitador de la
característica. La cuadrícula cubrirá mínimamente la característica y estará centrada.

Crear una geometría de multipunto en las intersecciones de la cuadrícula donde
la cuadrícula está encerrada por la característica - es decir, aplicar una máscara de recorte

El valor aleatorio determina la cantidad de aleatoriedad en X/Y dentro de su
cuadrado de cuadrícula se le permite tener una característica en particular
"""
@qgsfunction(args='auto', group='Personalizado')
def fillGrid(xInterval, yInterval, rand, feature, parent):
  box = feature.geometry().boundingBox()

  #Crear una cuadrícula que cubra mínimamente el límite
  #utilizando los intervalos suministrados y centrarlo
  countX = math.ceil(box.width() / xInterval)
  countY = math.ceil(box.height() / yInterval)

  #Alinear la cuadrícula
  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 para dibujar un símbolo en el elemento de la cuadrícula n+1
  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)

1voto

RagingDraugr Puntos 31

Podría haber encontrado una solución rápida que podría ser útil para algunos:

Ir a Vector y bajo Herramientas de investigación seleccionar el algoritmo de Puntos aleatorios dentro de polígonos (aunque algunos otros aquí también podrían funcionar). Utilizar el polígono existente como parámetro de entrada y configurar otros parámetros a su gusto.

Ingrese aquí una descripción de la imagen

Crea una nueva capa de puntos con puntos dispersos aleatoriamente dentro del límite del polígono (en mi caso, los puntos marrones son los que creé, la capa de abajo es el resultado de las soluciones anteriores).

Ingrese aquí una descripción de la imagen

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X