Fuera de la caja, la calculadora de campo no admite uniones espaciales a través de capas de entidades. Pero, si echa un vistazo a la publicación de NathanW en el editor de funciones para expresiones qgis , podrá ver que podemos escribir nuestra propia interacción de datos.
El siguiente script le permitirá expresar lo que busca. Funciona iterando a través de todas las entidades en la capa de polígono y si hay una unión espacial, entonces haga referencia a los datos tabulares de la columna especificada:
from qgis.core import *
from qgis.gui import *
from qgis.utils import iface
allfeatures = None
index = QgsSpatialIndex()
indexMade = 0
refLayer = None
@qgsfunction(args="auto", group='Custom')
def spatialJoinLookup(layerName, refColumn, defaultValue, geom, feature, parent):
if geom is None:
return defaultValue
# globals so we don't create the index, refLayer more than once
global allfeatures
global index
global indexMade
global refLayer
# Get the reference layer
if refLayer is None:
for layer in iface.mapCanvas().layers():
if layerName == layer.name():
refLayer = layer
break
if refLayer is None:
raise Exception("Layer [" + layerName + "] not found")
# Create the index if not exists
if indexMade == 0:
index = QgsSpatialIndex()
allAttrs = layer.pendingAllAttributesList()
layer.select(allAttrs)
allfeatures = {feature.id(): feature for (feature) in refLayer.getFeatures()}
for f in allfeatures.values():
index.insertFeature(f)
indexMade = 1
# Use spatail index to find intersect
fid = None
ids = index.intersects(geom.boundingBox())
for id in ids:
fid = id
break # Only get the first match.
if fid is not None:
return allfeatures[fid].attribute(refColumn)
# Default
return defaultValue
Ejemplo de capa de polígono
A continuación se muestra un ejemplo de una capa de polígono que podría tener. También he creado una capa de puntos correspondiente que verá en la imagen final.
Uso de expresiones
Tenga en cuenta que si desea utilizar una columna separada, debe cambiar el segundo argumento para que coincida con el nombre de la columna en el conjunto de datos del polígono. Por ejemplo, podría usar la columna 'ÁreaNúmero', pero tendría que coincidir con el tipo de columna en la configuración de la calculadora de campo.
Resultado
Puede ver que el valor de columna predeterminado se ha aplicado donde no hay unión espacial, y los otros han coincidido con los datos correctos. Tenga en cuenta que el script que he dado solo se unirá en la primera coincidencia. Debería crear alguna otra lógica de negocios si sus polígonos se superpusieran.