Annonce
Les inscriptions sont ouvertes ! L'association GeoRezo sera présente
Pages: 1
- Sujet précédent - QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL - Sujet suivant
#1 Tue 18 August 2026 20:33
- Sylvain230
- Juste Inscrit !
- Date d'inscription: 31 Mar 2026
- Messages: 6
QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Bonjour,
J'apprends depuis peu à effectuer des requêtes SQL sur QGIS, et je commence tout juste à croiser les données entre les couches.
Je me heurte à une requête que je n'arrive pas à trouver :
Je souhaite découper la couche "cours d'eau" aux limites d'un département. (Je connais la possibilité "Vecteur/ Outils de géotraitement / Couper") mais je cherche la requête SQL qui permet de faire cela. (Donc découper une couche polylignes par rapport à un polygone). je précise que ma couche département est filtrée sur le département ciblé.
J'ai testé plusieurs options, entre autre :
Code:
SELECT *
FROM "Cours","Departements_EPSG_3857"
WHERE "Departements_Français".'nom'='Ain'
AND st_intersects("Cours".'geometry',"Departements_EPSG_3857".'geometry’);ou cette requête que j'ai adaptée à partir d'une solution trouvée sur le forum
Code:
SELECT "Cours.nom", group_concat(Departements_Français, ', ') "Departements_Français", "Cours".'geometry'
FROM "Cours", "Departements_Français"
WHERE "Departements_Français".'nom'='Ain'
AND st_intersects("Cours".'geometry',"Departements_Français".'geometry')
GROUP BY "Departements_Français".'nom', "Cours".'geometry';Enfin, je précise que j'ai testé, avec succès! la requête suivante : (Là ce sont 2 couches polygones)
Code:
SELECT *
FROM "ContextePiscicole_FXX","Departements_Français"
WHERE "ContextePiscicole_FXX".'CdCtxPisci'='Salmonicole'
AND "Departements_Français".'nom'='Ain'
AND st_intersects("ContextePiscicole_FXX".'geometry',"Departements_Français".'geometry');pour conserver le contexte piscicole souhaité dans le département ciblé.
Si vous avez la solution SQL pour découper ma couche cours d'eau aux limites du département, je suis preneur...
Merci !
Dernière modification par Sylvain230 (Tue 18 August 2026 21:20)
Hors ligne
#2 Sun 23 August 2026 12:29
- Sylvain230
- Juste Inscrit !
- Date d'inscription: 31 Mar 2026
- Messages: 6
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Bonjour,
Je remets un message par rapport à mes "avancées"...
Si j'ai bien compris, St intersect ou intersection permettent de découper des polygones par rapport à des polygones.
La fonction qui permettrait de découper une couche de lignes par rapport à un polygone serait la fonction St_Split
J'ai donc essayé la requête suivante, sans succès...
Code:
SELECT *
FROM "Cours_Eau_EPSG4326_WGS84","Departements_Français"
WHERE "Departements_Français".'nom'='Ain'
AND ST_Split("Cours_Eau_EPSG4326_WGS84".'geometry',"Departements_Français".'geometry');La requête s'exécute, j'ai bien les champs de ma couche "cours d'eau" qui apparaissent dans le résultat en dessous, mais sans aucunes valeurs dans ma table... Et ensuite impossible de charger la couche (QGIS "plante")
Une solution ?
Hors ligne
#3 Mon 24 August 2026 08:43
- Sebastien Wamster
- Juste Inscrit !
- Lieu: Paris
- Date d'inscription: 23 Aug 2026
- Messages: 2
- Site web
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Salut Sylvain,
Le souci vient probablement de ST_Split, ce n'est pas la bonne fonction ici. Elle sert à découper une géométrie A avec une géométrie B, mais elle ne fonctionne pas comme ça dans un join classique, d'où le plantage.
Ce qu'il te faut, c'est ST_Intersection, qui renvoie directement la portion de ligne contenue dans le polygone :
Code:
SELECT
"Cours_Eau_EPSG4326_WGS84".nom,
"Cours_Eau_EPSG4326_WGS84".longueur,
CastToMultiLinestring(
ST_Intersection("Cours_Eau_EPSG4326_WGS84".geometry, "Departements_Français".geometry)
) AS geom
FROM "Cours_Eau_EPSG4326_WGS84", "Departements_Français"
WHERE "Departements_Français".nom = 'Ain'
AND ST_Intersects("Cours_Eau_EPSG4326_WGS84".geometry, "Departements_Français".geometry);Dernière modification par Sebastien Wamster (Tue 25 August 2026 10:42)
Hors ligne
#4 Mon 24 August 2026 20:18
- Sylvain230
- Juste Inscrit !
- Date d'inscription: 31 Mar 2026
- Messages: 6
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Merci beaucoup Sébastien pour votre réponse, je suis en train de tester je vous tiens au courant.
Donc cela veut dire aussi qu'il faut écrire sous le "SELECT" une ligne pour chaque champ que l'on veut dans la requête si je comprends bien ?
Je précise que je passe par l'onglet "gestionnaire de bases de données" "couches virtuelles" et "requêtes SQL" pour écrire mes requêtes.
Les requêtes SQL sont (en tout cas sur mon ordi) extrêmement longues à aboutir qd il s'agit de croiser les couches entre elles (plusieurs heures)...
Je ne sais pas si c'est normal ou pas, et s'il y a un moyen de les accélérer ou pas... ?
La fonction CastToMultilinestring est la fonction SQL qui permet de couper une couche de polylignes aux limites d'un polygone c'est bien ça ?
Dernière modification par Sylvain230 (Mon 24 August 2026 20:25)
Hors ligne
#5 Tue 25 August 2026 10:49
- Sebastien Wamster
- Juste Inscrit !
- Lieu: Paris
- Date d'inscription: 23 Aug 2026
- Messages: 2
- Site web
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Oui, il faut lister chaque champ voulu après le SELECT. En SQLite/Spatialite, il n'existe pas de syntaxe pour faire une exception sur juste une seule colonne.
Pour la lenteur, oui c'est probablement plus rapide avec un index spatial, il faut utiliser CreateSpatialIndex sur la couche, si c'est un GeoPackage ou du Spatialite car ça ne se fait pas nativement.
Pour CastToMultiLinestring il ne sert pas à découper mais à éviter le bug avec le mélange de points et lignes qui fait planter QGIS.
Hors ligne
#6 Hier 09:50
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 1075
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Si je peux me permettre, voici comment j'écrirais la requête de Sébastien proposée dans le message de lundi matin :
Code:
SELECT
ce.nom,
ce.longueur,
CastToMultiLinestring(
ST_Intersection(ce.geometry, df.geometry)
) AS geom
FROM
"Cours_Eau_EPSG4326_WGS84" ce,
"Departements_Français" df
WHERE
df.nom = 'Ain'
AND
ST_Intersects(ce.geometry, df.geometry);C'est beaucoup plus lisible et maintenable en utilisant des alias.
Tout sur les Alias ici : https://sql.sh/cours/alias
Sinon, je confirme aussi que les index spatiaux sont fondamentaux pour ce genre de requêtes spatiales d'intersections. Les temps de traitements sont souvent divisés par 100 ou plus !
Sylvain M.
Hors ligne
#7 Hier 19:49
- Sylvain230
- Juste Inscrit !
- Date d'inscription: 31 Mar 2026
- Messages: 6
Re: QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL
Bonjour,
C'est parfait ! Je m'en suis sorti en adaptant la requête que m'avait proposé Sébastien ![]()
Bon alors pour avoir fait quelques recherches (mais comme je disais je ne suis pas encore très habitué aux requêtes spatiales) l'erreur principale que j'avais faite était d'utiliser une couche "Cours d'eau" qui était en format GeoJson, format qui ne dispose pas d'index spatial et est donc incompatible avec les requêtes spatiales comme celles-ci.
J'ai donc converti ma couche en format Géopackage, bien mis mes couches dans les mêmes EPSG/SCR, adapté la requête que m'avait suggéré Sébastien, et ça a fonctionné !
Merci beaucoup Sébastien !
Et Sylvain j'ai noté aussi, effectivement ça à l'air plus simple, je testerai probablement cette solution aussi.
Merci !
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Decouper couche "Cours d eau" sur un depart. avec requete SQL - Sujet suivant


