Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Mon 03 August 2015 12:11

GlaDal
Participant assidu
Date d'inscription: 30 Aug 2013
Messages: 996

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: 3805

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: 996

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: 3805

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

 

Pied de page des forums

Powered by FluxBB