Pages: 1
- Sujet précédent - QGIS 2.10 : Symbologie avec expression, fonction Intersects - Sujet suivant
#1 Mon 03 August 2015 12:11
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1087
QGIS 2.10 : Symbologie avec expression, fonction Intersects
Bonjour à tous !
Je travaille sur une couche vecteur de type polygonal avec 2 valeurs différentes "valeurA" et "valeurB" dans un champ "TYPE" de la table attributaire.
Je souhaiterais attribué à ma couche vecteur une symbologie différente dans le cas où mes polygones "valeurA" intersectent mes polygones "valeurB" et où mes polygones "valeurA" n'intersectent pas mes polygones "valeurB".
J'imagine qu'il faut utiliser une fonction conditionnelle de type CASE ELSE et la fonction géométrique "intersects" mais n'ayant encore jamais utilisé cette dernière fonction, je ne sais pas comment l'utiliser.
Si quelqu'un pouvait m'aider...
Merci d'avance !
Gladal
Hors ligne
#2 Mon 03 August 2015 19:10
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3940
Re: QGIS 2.10 : Symbologie avec expression, fonction Intersects
Salut,
après quelques tests, je ne vois pas comment pondre une requête qui permette d'itérer sur les entités de la couche à partir des fonctions de base de la calculatrice. La plupart des fonctions dont j'ai compris le fonctionnement font une recherche et ramène le premier résultat, pas moyen de faire une boucle dedans par exemple. Dans ton cas notamment, il faudrait vérifier qu'il y a intersection et que l'autre entité est bien de type B. Or elle pourrait aussi être de type A ou il pourrait y en avoir plusieurs en croisement d'où besoin de vérifier chaque situation.
Je vois toutefois deux options:
A/ créer une couche qui soit le filtrat des valeurs B de la couche de base. Je pense qu'une simple couche sous-ensemble (Propriétés > Général) pourrait le faire, histoire d'éviter de dupliquer de la donnée.
- Utiliser l'extension nnjoin entre les deux couches pour récupérer sur la couche d'origine, la plus petite distance entre ses entités et la couche filtrat (B)
- étiqueter avec "case when" les entités de type A dont le champ distance est = 0
B/ Écrire une fonction python avec l'éditeur de fonctions qui se charger pour chaque entité (A) de ta couche de vérifier s'il n'y a pas une entité B qui la touche.
Hors ligne
#3 Wed 05 August 2015 10:52
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1087
Re: QGIS 2.10 : Symbologie avec expression, fonction Intersects
Salut SANTANNA et merci pour ta réponse !
Argh, je pense que je vais le faire à l'ancienne et faire une requête spatiale avec deux couches (puisqu'il faut que je les crée de toute manière à la fin de mon projet) et rentrerai le résultat de la requête (intersection 0/1) dans un champ de la table attributaire.
Mais à la base, j'espérais pouvoir lancer une symbologie qui se mette à jour en fonction des données que j'ajoute quotidiennement dans ma couche pour éviter de devoir faire ma requête spatiale à chaque nouvelle mise à jour.
Mais, je suis sûr que Qgis pourra le faire un jour !
Hors ligne
#4 Wed 05 August 2015 11:42
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3940
Re: QGIS 2.10 : Symbologie avec expression, fonction Intersects
Salut
A priori, aucune de mes propositions n'est en contradiction avec ce que tu dis, sauf que je ne te fais pas créer la seconde couche. Une seule couche à gérer/modifier et s'il te faut en fin de parcours en créer une autre, libre à toi.
NNJoin crée un champ virtuel donc mettra à jour la distance (et donc intersection/touches si valeur =0) au fil des modifs/ajouts d'entités. Et d'ailleurs, en y regardant de près, l'extension SpatialJoin me semble plus adaptée car le type de jointure est plus précis (overlaps, touches,...) avec possibilité de jointure dynamique.
Quand tu créeras tes entités dans la couche d'origine, si elles ont pour valeur B, elles seront directement aussi balancées dans la couche filtrée "special B" et SpatialJoin fera la jointure et ton étiquetage conditionnel sera mise à jour.
Hors ligne
#5 Wed 05 August 2015 12:05
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: QGIS 2.10 : Symbologie avec expression, fonction Intersects
Salut,
Une approche avec l’éditeur de fonction:
Code:
from qgis.core import * from qgis.gui import * from qgis.utils import iface @qgsfunction(args='auto', group='Custom') def intersectB(geom, feature, parent): layer = iface.activeLayer() for feat in layer.getFeatures(): if feat['valeur'] == 'B' and geom.intersects(feat.geometry()): return True
A utiliser avec une symbologie par règle avec l'expression
Code:
"valeur" = 'A' AND intersectB($geometry)
mais si la couche comporte beaucoup d'entité j'ai peur que ce soit très lent.
On peut aussi utiliser cette fonction pour calculer un nouveau champs avec par exemple l'expression
Code:
CASE WHEN "valeur" ='A' AND intersectB($geometry) THEN 1 ELSE 0 END
sur lequel on pourra se baser pour faire la symbologie.
Hors ligne
Pages: 1
- Sujet précédent - QGIS 2.10 : Symbologie avec expression, fonction Intersects - Sujet suivant