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)