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)
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.