Pages: 1
- Sujet précédent - QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune - Sujet suivant
#1 Aujourd'hui 11:38
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 26
QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Bonjour,
Bonne année à tous ! Et oui, il n'est pas trop tard.
Voici le souci rencontré :
Je rencontre un problème pour obtenir le nom de la commune ayant la plus grande surface d'intersection avec un polygone de la couche T_plandeau. Si mon plan d'eau intersecte deux communes, je souhaite extraire le nom de la commune ayant la plus grande surface d'intersection, que j'affecterai au champ CM_1, tandis que la commune avec la surface d'intersection la plus petite sera affectée au champ CM_2. Les comparaisons se font en fonction des surfaces d'intersection entre T_plandeau et T_commune. J'ai essayé plusieurs formules dans QGIS, mais je n'arrive pas à obtenir le résultat souhaité. Voici les formules que j'ai utilisées :
La première formule :
Code:
array_to_string( array_sort( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, $geometry))) ), area(intersection(@geometry, $geometry)) ), ', ' )
Cette formule permet de concaténer le nom de la commune et la surface de l'intersection, mais je ne parviens pas à filtrer correctement les résultats.
La deuxième formule :
Code:
array_first( array_sort( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, $geometry))) ), area(intersection(@geometry, $geometry)) ) )
Cette version devrait retourner le premier élément après le tri par surface d'intersection, mais elle ne semble pas donner le bon résultat.
La troisième formule :
Code:
left( array_first( array_sort( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, $geometry))) ), area(intersection(@geometry, $geometry)) ) ), strpos( array_first( array_sort( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, $geometry))) ), area(intersection(@geometry, $geometry)) ) ), ':' ) - 1 )
Cette formule est censée extraire le nom de la commune avant le séparateur : dans le résultat de l'intersection, mais elle ne fonctionne pas comme prévu. En réalité, elle extrait la surface des communes intersectées et non la surface de la zone concernée au sein de chaque commune. À titre d'exemple, voici les surfaces des communes :
22 080 235 m² pour Ségrie
11 219 299 m² pour Saint-Christophe-du-Jambet
Sur la capture d'écran, vous pouvez remarquer que 'Saint-Christophe-du-Jambet' apparaît en première position et que 'Ségrie' figure systématiquement en deuxième position.
J'ai pris une capture d'écran du résultat de la formule, mais les résultats ne correspondent pas à ce que j'attendais. Est-ce que quelqu'un aurait une idée pour corriger ou améliorer ces formules afin d'obtenir le nom de la commune correspondant correctement à l'intersection de la surface ?
Merci,
A bientôt
[img]https://image.noelshack.com/minis/2025/04/1/1737370201-pb-intersection-pe-commune-nom.png[/img]
https://image.noelshack.com/fichiers/20 … ne-nom.jpg
Dernière modification par ccam86 (Aujourd'hui 11:50)
Hors ligne
#2 Aujourd'hui 13:13
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3979
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Bonjour,
Si je prends votre première formule, j'ai des doutes sur ce que renvoie dans le array_sort le bloc
Code:
area(intersection(@geometry, $geometry))
En fait @geometry et $geometry sont identiques, donc 1, et par conséquent le tri se fait sur la concatenation "nom: surface" d'où, Saint précédera toujours Ségrie.
Si vous êtes sur QGIS >=3.28, la fonction overlay_intersects intègre déjà un argument sort_by_intersection_size, qui devrait sacrément alléger votre code, et faire le job. Code non testé:
Code:
overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent)))), -- je pense que c'est la bonne écriture ici sort_by_intersection_size:='des')
Vous passez ensuite un index ou un array_get à la liste pour récupérer ce que vous souhaitez.
Hors ligne
#3 Aujourd'hui 14:40
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 26
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Super merci beaucoup je suis sur la version 3.34.14-Prizren.
Voici le code retravaillé que @SANTANNA tu m'a présenté et qui fonctionne à merveille:
Code:
left( array_first( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ) ), strpos( array_first( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ) ), ':' ) - 1 )
Voici la photo du resultat champ "test"
https://image.noelshack.com/fichiers/20 … sql-ok.png
[img][img]https://image.noelshack.com/minis/2025/04/1/1737380073-sql-ok.png[/img][/img]
Merci beaucoup !
J'ai cependant une autre question :
Pourquoi QGIS n'intègre-t-il pas la fonction :
Code:
sort_by_intersection_size:='des')
Je ne l'ai pas trouvée.
des = desc --> j'ai un peu de mal à comprendre ?
Cette fonctionnalité peut-elle également fonctionner avec des polylignes ?
Merci
Hors ligne
#4 Aujourd'hui 15:07
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 26
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Je vient de faire une correction du code :
Pour voir dans le champ CM_1 - La commune avec la plus grande surface intersecté avec T_commune:
Code:
left( array_get( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ), 0 -- Index 0 pour la plus grande surface ), strpos( array_get( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ), 0 ), ':' ) - 1 )
Puis voir la seconde commune - CM_2:
Code:
left( array_get( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ), 1 -- Index 1 correspond à la deuxième valeur (les indices commencent à 0) ), strpos( array_get( overlay_intersects( 'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6', concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'), sort_by_intersection_size := 'desc' ), 1 ), ':' ) - 1 )
Merci beaucoup pour l'aide et la correction.
Je vais essayer de trouvé prochainement un code également pour les polylignes.
Hors ligne
#5 Aujourd'hui 16:07
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3979
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
J'ai cependant une autre question :
Pourquoi QGIS n'intègre-t-il pas la fonction :sort_by_intersection_size:='des')
Je ne l'ai pas trouvée.
des = desc --> j'ai un peu de mal à comprendre ?
J'ai pas compris la question. sort_by_intersection_size est un paramètre de overlay_intersects, documenté dans l'aide de la fonction. Pour des=desc, pour je ne sais quelle raison, le développeur a décidé que pour peu que ça commençait par "des", ça passerait (https://github.com/qgis/QGIS/pull/46683 … r779602681)
Cette fonctionnalité peut-elle également fonctionner avec des polylignes ?
oui
Hors ligne
#6 Aujourd'hui 16:40
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 26
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Fonctionnalité validé pour les polylignes :
Code:
left( array_get( overlay_intersects( 'T_litmajeur_23e96d8e_f61a_476a_9d27_e3129550dab1', concat("IDU", ': ', length(intersection(@geometry, geometry(@parent))) || ' m'), sort_by_intersection_size := 'desc' ), 0 -- Index 0 pour la plus grande longueur d'intersection ), strpos( array_get( overlay_intersects( 'T_litmajeur_23e96d8e_f61a_476a_9d27_e3129550dab1', concat("IDU", ': ', length(intersection(@geometry, geometry(@parent))) || ' m'), sort_by_intersection_size := 'desc' ), 0 ), ':' ) - 1 )
Encore merci @SANTANNA
Dernière modification par ccam86 (Aujourd'hui 16:41)
Hors ligne
#7 Aujourd'hui 16:51
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3979
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Petite question: ça renvoie quoi exactement cette expression? Il y a l'aire de superposition affichée après le nom?
overlay_intersects(
'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6',
concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'),
sort_by_intersection_size := 'desc'
)
Hors ligne
#8 Aujourd'hui 17:12
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 26
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Petite question: ça renvoie quoi exactement cette expression? Il y a l'aire de superposition affichée après le nom?
overlay_intersects(
'T_commune_5898a6b5_b79c_43b6_8990_3eb7b8f856b6',
concat("CM_NOM", ': ', area(intersection(@geometry, geometry(@parent))) || ' m²'),
sort_by_intersection_size := 'desc'
)
Ça ne renvoie rien du tout, ni en prévisualisation, ni en résultat temporaire.
Hors ligne
#9 Aujourd'hui 18:04
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3979
Re: QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune
Euh... "Rien du tout"? rien d'autre que les noms de commune, on est d'accord? Je me demande bien pourquoi mais ça c'est une autre histoire.
Ce sur quoi je voulais attirer l'attention est que si ce sont les noms seuls qui intéressent, la partie de calcul de surface de superposition et les contraintes d'extraction de texte dans le résultat que ça implique (concat, left, strpos...), on peut s'en passer.
Hors ligne
Pages: 1
- Sujet précédent - QGIS/SQL: Outils de saisie - Saisie automatique - Nom de la commune - Sujet suivant