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

Rencontres QGIS 2025

L'appel à participation est prolongé jusqu'au 29 janvier 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

SANTANNA a écrit:

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

 

Pied de page des forums

Powered by FluxBB