¿Hay alguna manera de seleccionar un atributo de una capa de polígono e insertar el valor en un campo virtual de una capa de puntos usando "dentro" en la calculadora de campo?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END

¿Hay alguna manera de seleccionar un atributo de una capa de polígono e insertar el valor en un campo virtual de una capa de puntos usando "dentro" en la calculadora de campo?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END

Respuestas:
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
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.

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.

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.

Se puede hacer en Field Calculator con función aggregate(). En la capa de puntos, cree un nuevo campo con una expresión de calculadora de campo como esta:
aggregate(
layer:= 'polygon_layer_name',
aggregate:='concatenate',
expression:=joining_field_name,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))
)
Donde el layernombre de la capa de polígono se escribe como una cadena, aggreagatees una función de agregado (se puede usar también suma, etc.), expressionse tomará el campo de los valores, concatenatorse une a la cadena de caracteres (debe establecerse, incluso en este caso) y filterse basa en el filtrado de características en expresión (en este caso interesa la geometría de la capa con la geometría de la capa primaria).
Para obtener más información de verificación de documentación Agregados QGIS .
Para las actualizaciones automáticas se pueden usar campos virtuales o puede establecer la expresión como valor predeterminado en la configuración del formulario de atributos en Propiedades de capa ( documentación de configuración del formulario de atributos ).
geometry(@parent)) solo son compatibles desde QGIS 3 en adelante. Por si alguien que lee esto todavía usa 2.18 ...