Suite

Comment faire référence à une autre couche dans le calculateur de champ ?


Existe-t-il un moyen de sélectionner un attribut à partir d'une couche de polygones et d'insérer la valeur dans un champ virtuel d'une couche de points en utilisant "à l'intérieur" dans le calculateur de champ ?

CASE WHEN inside($geometry, geometry_polygon) THEN attribute_polygon END


Les jointures spatiales sont disponibles dans le calculateur de champ après l'installation du plugin refFunctions.

geomwithin(targetLayer,targetField)

Prêt à l'emploi, le calculateur de champs ne prend pas en charge les jointures spatiales entre les couches d'entités. Mais, si vous jetez un œil à l'article de NathanW sur l'éditeur de fonctions pour les expressions qgis, vous pourrez vous rendre compte que nous pouvons scripter notre propre interaction de données.

Le script suivant vous permettra d'exprimer ce que vous recherchez. Il fonctionne en itérant sur toutes les entités de la couche de polygones et s'il existe une jointure spatiale, référencez les données tabulaires de la colonne spécifiée :

de qgis.core import * de qgis.gui import * de 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) : si geom est None : retourne defaultValue # globals afin que nous ne créions pas l'index, refLayer plus d'une fois global allfeatures global index global indexMade global refLayer # Obtient la couche de référence si refLayer is None : pour le calque dans iface.mapCanvas().layers() : if layerName == layer.name() : refLayer = coupure de calque si refLayer est None : lever Exception("Layer [" + layerName + "] not found" ) # Créer l'index s'il n'existe pas if indexMade == 0: index = QgsSpatialIndex() allAttrs = layer.pendingAllAttributesList() layer.select(allAttrs) allfeatures = {feature.id(): feature for (feature) in refLayer.getFeatures ()} pour f dans allfeatures.values ​​(): index.insertFeature(f) indexMade = 1 # Utilisez l'index spatail pour trouver l'intersection fid = None id s = index.intersects(geom.boundingBox()) pour l'identifiant dans les identifiants : fid = id break # N'obtient que la première correspondance. si fid n'est pas 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éé un calque de points correspondant que vous verrez dans l'image finale.

Utilisation des expressions

Notez que 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 surfaciques. Par exemple, vous pouvez utiliser la colonne « AreaNumber », mais devez correspondre au 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 rejoindra que sur le première correspondre. Vous devrez créer une autre logique métier si vos polygones se chevauchaient.


Cela peut être fait en Calculateur de champ avec fonctionagrégat(). Dans la couche de points, créez un nouveau champ avec une expression de calculateur de champ comme celle-ci :

Aggregate( layer:= 'polygon_layer_name', Aggregate:='concatenate', expression:=joining_field_name, concatenator:=', ', filter:=intersects($geometry, geometry(@parent)) )

coucheest le nom de la couche de polygone écrit comme une chaîne,agrégerest la fonction d'agrégat (peut être utilisé aussi la somme, etc.),expressionce champ à partir des valeurs sera pris,concaténateurrejoint la chaîne de caractères (doit être défini, même dans ce cas) etfiltrefiltre les entités en fonction de l'expression (dans ce cas, intersecte la géométrie de la couche avec la géométrie de la couche parent).

Pour plus d'informations, consultez la documentation Aggregates QGIS.

Pour les mises à jour automatiques peut être utilisé champs virtuels ou vous pouvez définir l'expression comme Valeur par défaut dans Formulaire d'attributs paramètres dans Propriétés de la couche (Documentation de configuration de formulaire d'attribut).


Voir la vidéo: Citer les sources (Octobre 2021).