#1 Wed 24 March 2021 15:01
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
QGIS: Jointure spatiale pour chaque entite
Bonjour,
J'ai une couche de tronçons de lignes électriques et une couche fusionnée de 14 couches (dont celle des communes). J'ai utilisé la jointure spatiale pour rapatrier les données de la couche fusionnée sur celle des tronçons de lignes électriques.
La couche de tronçons de lignes a au départ 29 entités. La jointure spatiale crée une nouvelle entité à chaque intersection spatiale. Après la jointure spatiale avec la couche issue de la fusion de 14 autres couches, la nouvelle couche contient 361 entités. Le champ issu de l'intersection avec les communes représente 52 entités, le reste étant vide. Je voudrais que tout le champ des communes soit rempli avec un nom de commune. est-ce possible?
Merci.
Hors ligne
#2 Wed 24 March 2021 15:45
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1103
Re: QGIS: Jointure spatiale pour chaque entite
Bonjour,
Pourquoi ne pas passer par une expression qui fera le job sur votre champ correspondant au nom de votre commune ? Du style :
Code:
aggregate( layer:= 'COMMUNE', aggregate:='max', expression:="NOM", filter:=intersects($geometry, geometry(@parent)) )
Hors ligne
#3 Wed 24 March 2021 16:45
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Merci, mais que ce soit avec aggregate:='max' ou aggregate:='min', le report du nom des communes n'est pas fiable à 100%.
D'ailleurs quel est la fonction de max ou min dans cette expression?
Hors ligne
#4 Thu 25 March 2021 09:12
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
En fait ce qui se passe : lorsque j'ai fait la jointure spatiale, cela m'a rapatrié, entre les 14 couches qui ont été fusionnées, les parcelles. Lorsque j'entre l'expression pour les communes, certaines parcelles n'ont pas la commune appropriée.
Où peut se situer l'erreur?
Hors ligne
#5 Tue 30 March 2021 16:18
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Bonjour,
Je reprends le post. Pour pallier aux erreurs de correspondance entre ma couche de ligne électrique et celle des communes (couche 'Communes_trace'), j'ai découpé mes tronçons de ligne non seulement entre chaque commune, mais aussi calé la ligne électrique sur les limites communales, lorsque la ligne électrique passe le long d'une limite entre deux communes.
Je fais "joindre les attributs par localisation" pour joindre les autres couches, sauf celles des communes.
Je crée un champ NOM_COM_M dans cette couche issue de la jointure spatiale et j'y joins par aggrégation, la commune avec l'expression de Gladal:
aggregate(
layer:= 'Communes_trace',
aggregate:='min',
expression:="NOM_COM_M",
filter:=intersects($geometry, geometry(@parent))
)
Mais vous vous en doutez bien ce n'est pas satisfaisant si je vous écris
Je joins une capture d'écran pour montrer un exemple.
Le tronçon en jaune fluo doit avoir pour communes jointes Solesmes et Briastre : il n'y a que Briastre avec aggregate:='min'
il n'y a que Viesly avec aggregate:='max'
Merci pour vos retours.
Hors ligne
#6 Tue 30 March 2021 17:07
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Peut-être que la fonction aggregate n'est pas l'appropriée?
Hors ligne
#7 Wed 31 March 2021 10:10
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
En fait, d'après ce que j'ai pu comprendre, dans l'expression, "min" signifie qu'il va récupérer les communes intersectées en début de ligne, et "max", les communes intersectées en fin de ligne. Ne peut-on pas remplacer "min" ou "max", par le centre de la ligne?
Hors ligne
#8 Wed 31 March 2021 11:22
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS: Jointure spatiale pour chaque entite
Bonjour,
Ne peut-on pas remplacer "min" ou "max", par le centre de la ligne
Je ne suis pas sûr de comprendre votre suggestion (le lien entre min/max et la géométrie) mais je vous invite à regarder les différents paramètres d'agrégats de la fonction aggregate, sachant que quasiment chacune de ces valeurs possibles fait l'objet d'une fonction particulière (plus bas dans la page). Il y a certainement quelque chose qui correspondrait à votre situation.
Hors ligne
#9 Wed 31 March 2021 12:06
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Je ne suis pas sûr de comprendre votre suggestion (le lien entre min/max et la géométrie)
Comme dans l'exemple en PJ, avec min (côté extrême droit de la ligne) il ne va sélectionner ni la commune de Briastre ni celle de Solesmes. Avec max (côté extrême gauche de la ligne=), il va sélectionner la commune de Viesly.
Or ce que je veux c'est qu'il rapatrie les communes de Solesmes et Briastre, les communes limitrophes de cette ligne.
Hors ligne
#10 Wed 31 March 2021 14:42
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
C'est pour cela qu'en mettant le centre de la ligne et non "min" pour le côté droit et "max" pour le côté gauche, il rapatrierait sûrement les communes espérées.
Hors ligne
#11 Wed 31 March 2021 20:31
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
je vous envoie deux couches simples, une polygonale et une ligne. La couche polygonale a quatre entités : A, B, C et D. La ligne comporte deux entités qui sont superposées et à la limite de l'entité A et B de la couche polygonale. Je voudrais avec l'expression "aggregate" (ou autre!) que soient donc joints les entités A et B à la couche ligne et non C ou D. si qqn pourrait faire le test et donner son avis. Merci.
les fichiers sont en pièce jointe.
Hors ligne
#12 Thu 01 April 2021 09:51
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1103
Re: QGIS: Jointure spatiale pour chaque entite
Avec l'exemple, c'est plus clair. Je regarde.
Hors ligne
#13 Sat 03 April 2021 14:51
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Je pense avoir trouvé la réponse. En fait, il ne faut pas faire "joindre les attributs par localisation" ou l'expression "aggregate", aux résultats trop aléatoires. Ce que j'ai fait :
- découpé la couche de lignes par les limites communales (29 tronçons)
- calé les limites communales sur celles de la couche de lignes
- crée un nouveau champ dans la couche des lignes, et saisi quelles sont les communes qui touchent les tronçons
- si un tronçon suit une limite entre deux communes, je saisis une des deux communes, je duplique ce tronçon et y saisis l'autre commune, ce qui génère à la fin une couche de lignes de 82 tronçons.
- Ensuite je peux joindre les attributs par localisation des autres couches.
Hors ligne
#14 Wed 07 April 2021 07:30
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS: Jointure spatiale pour chaque entite
Bonjour,
En fait, il ne faut pas faire "joindre les attributs par localisation" ou l'expression "aggregate", aux résultats trop aléatoires.
Je ne suis pas du tout d'accord. Les fonctions renvoient ce qu'on leur demande (il n'y a rien d'aléatoire, là-dedans) pourvu qu'on prenne le temps de comprendre la fonction, la formule et d'identifier les bons paramètres pour le besoin.
Votre méthode manuelle pour juste rapatrier des noms de communes sur du linéaire me semble chronophage, sujette à erreurs (un segment oublié, une commune mal rentrée) et génère un certain nombre de (pseudo-)doublons (on passe de 29 à 82, je crois) alors que la fonction aggregate, utilisée avec concatenate ou concatenate_unique devrait faire le boulot, comme indiqué dans la doc précédemment suggérée.
PS: min et max ne renvoient pas les communes à gauche ou à droite mais le premier et dernier (par ordre alphabétique) des communes traversées/touchées par le tronçon linéaire.
Hors ligne
#15 Wed 07 April 2021 09:41
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1670
Re: QGIS: Jointure spatiale pour chaque entite
Bonjour,
Merci pour votre réponse mais j'y vois deux inconvénients :
- la fonction concatenete ou concatenate_unique renvoie les communes jointes sur une seule ligne, alors que mon souhait est d'avoir une seule commune par ligne
- le résultat n'est pas précis car comme le montre mon exemple joint, il renvoie trois communes (Verchain-Maugré, Sommaing et Querenaing) au lieu de deux communes qu'il devrait (Verchain-Maugré et Sommaing).
Hors ligne