Par défaut, la calculatrice de champ ne prend pas en charge les jointures spatiales entre les couches d'entités. Mais, si vous jetez un œil à la publication de NathanW sur l' éditeur de fonction pour les expressions qgis, vous pourrez constater que nous pouvons écrire notre propre interaction de données.
Le script suivant vous permettra d'exprimer ce que vous recherchez. Cela fonctionne en itérant à travers toutes les entités sur la couche polygonale et s'il y a une jointure spatiale, puis référencez les données tabulaires de la colonne spécifiée:
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
Exemple de couche de polygone
Vous trouverez ci-dessous un exemple de couche de polygones que vous pourriez avoir. J'ai également créé une couche de points correspondante que vous verrez dans l'image finale.
Utilisation de l'expression
Remarque: si vous souhaitez utiliser une colonne distincte, vous devez modifier le deuxième argument pour qu'il corresponde au nom de la colonne dans le jeu de données du polygone. Par exemple, vous pouvez utiliser la colonne «AreaNumber», mais vous devez faire correspondre le type de colonne dans les paramètres de la calculatrice de champ.
Résultat
Vous pouvez voir que la valeur de colonne par défaut a été appliquée là où il n'y a pas de jointure spatiale et que les autres ont correspondu aux données correctes. Notez que le script que j'ai donné ne se joindra qu'au premier match. Vous auriez besoin de créer une autre logique métier si vos polygones se chevauchaient.