Suite

Comment afficher les attributs d'entités coupant l'entité Atlas dans une étiquette Print Composer ?


Est-il possible d'éditer des étiquettes avec python ou une expression ?

J'ai une couche d'atlas et une forme avec les pays. la couche de l'atlas comporte plusieurs entités et chaque entité recoupe plusieurs pays.

Je veux une étiquette sur ma carte pdf qui récupère le nom du pays (attribut dans la couche country) en fonction de l'intersection de la couche atlas. est-ce que quelque chose comme ça est possible?

Exemple : La caractéristique 1 de la couche Atlas s'étend sur 3 pays (C1, C2, C3). Je veux une étiquette sur ma carte qui dit : "C1, C2, C3". La caractéristique 1 de la couche Atlas couvre 2 pays (C5, C6). Je veux une étiquette sur ma carte qui dit : "C5, C6".


En tant que variante de Comment compter les points dans la fonctionnalité actuelle de l'atlas Print composer dans QGIS 2.8? essaye ça:

Créez un script d'expression dans l'éditeur de fonction d'expression avec ce code :

de qgis.core import * de qgis.gui import * de qgis.utils import iface @qgsfunction(args="auto", group="Custom") def getAttribudeIntersectAtlasFeature(intersectLayername, intersectFieldname, geomAtlas, feature, parent): # Si geomAtlas est vide, renvoie une chaîne vide si (geomAtlas est Aucun) : return"# Récupère la référence du calque à partir du nom du calque intersectLayer = QgsMapLayerRegistry.instance().mapLayersByName(intersectLayername)[0] # Augmente si le calque n'est pas trouvé si intersectLayer est Aucun : soulève l'exception( "Couche introuvable : " + intersectLayername) # Point de comptage dans l'entité actuelle de l'Atlas countryname =" pour ft in intersectLayer.getFeatures() : intersectGeom = ft.geometry() if (intersectGeom is None) : continuez si intersectGeom.intersects(geomAtlas) : countryname += ft[intersectFieldname] + ',' return countryname[:-1]

Utilisez ensuite la fonction personnalisée dans une expression d'étiquette dans le composeur d'impression :

[% getAttribudeIntersectAtlasFeature( 'monde', 'pays', $atlasgeometry )%]

Où 'world' est le tableau avec les pays, 'country' est le nom de la colonne avec le nom du pays et $atlasgeometry est la géométrie actuelle de l'atlas.

Carte:

Atlas 1 :

Atlas 2 :


Également comme variante d'une réponse à Comment compter les points dans la fonctionnalité actuelle de l'atlas du composeur d'impression dans QGIS 2.8? , à partir de QGIS 2.16, vous pouvez répertorier les attributs coupant une entité de l'atlas dans l'éditeur d'expression, en utilisant leagrégat()fonctionner avec leenchaînercalcul etdans($geometry,@atlas_geometry)comme filtre.

Cliquez sur le bouton "Insérer une expression" dans les propriétés de votre zone de texte et utilisez une expression comme celle ci-dessous, en remplaçant l'attribut/le nom de la couche/le concaténateur (,) comme demandé.:

agrégat('LAYER_NAME','concaténer',"ATTRIBUTE", intersecte($geometry,@atlas_geometry), ',')

SiATTRIBUTfield est un type de données numérique que vous devrez peut-être utiliserto_string("ATTRIBUT")au lieu de tout simplement"ATTRIBUT"pour permettre la concaténation.

En prime, vous pouvez ajouter des filtres supplémentaires dans la même expression, par ex.dans($geometry,@atlas_geometry) ET "PPP" > 50000pour les pays de la géométrie de l'atlas, où le PPP est également supérieur à 50k.


QGIS 3.8 et versions ultérieures: En utilisant des fonctions de tableau d'agrégats supplémentaires dans QGIS 3, vous avez plus de flexibilité pour afficher les attributs.

Pour que votre liste d'attributs concaténés soit triée par nom d'attribut (voir aussi cette réponse), n'affichant que des valeurs uniques, vous pouvez utiliser :

Aggregate('LAYER_NAME','concatenate_unique',"ATTRIBUTE", intersecte($geometry,@atlas_geometry), ',', "ATTRIBUTE")

Les tableaux vous permettront de découper et de découper la liste, ce qui est utile si vous avez un espace limité. L'expression ci-dessous renverra une liste séparée par des virgules de l'attribut sélectionné à partir du premier Trois caractéristiques d'intersection (0,2).

array_to_string( array_slice(aggregate('LAYER','array_agg',"ATTRIBUT", intersects($geometry,@atlas_geometry)) ,0,2) ,',')

Si vous souhaitez obtenir des attributs à partir d'entités coupant le étendue d'un élément de carte de mise en page (mais pas nécessairement en intersection avec la géométrie de l'atlas) - par exemple si votre couche de couverture est une couche de points, ou si vous avez une zone tampon de 10 % autour de votre entité atlas dans les paramètres Atlas - au lieu de@atlas_geometryvous pouvez extraire l'étendue de l'élément de carte de mise en page en utilisantéléments_variables()comme ci-dessous :

aggregate('LAYER_NAME','concatenate_unique',"ATTRIBUTE", intersecte($geometry, map_get(item_variables('LAYOUT_MAP_NAME'),'map_extent')), ',', "ATTRIBUTE")

Notez que vous devrez peut-être modifier le nom de votre élément de carte de mise en page par rapport au nom par défaut (par ex.Carte 1)

Voir l'exemple ci-dessous montrant les attributs et le nombre d'entités linéaires coupant leinsertsélément de carte -map_get(item_variables('inserts'),'map_extent')- même si l'atlas lui-même est piloté par une couche de points (et @atlas_geometry ne serait d'aucune utilité ici).