Pages: 1
- Sujet précédent - QGIS: Extraction automatique de points specifiques dans des surfaces - Sujet suivant
#1 Sun 01 March 2020 19:46
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
QGIS: Extraction automatique de points specifiques dans des surfaces
Bonjour à tous,
Je cherche un géotraitement qui permettrait d'extraire des points à partir d'objets surfaciques sous des contraintes de distances par rapport à un objet spécifique.
Je m'explique : nous souhaitons extraire des points à partir d'obstacles surfaciques à la navigation aérienne à proximité d'un aéroport. Le centroide est pas rarement approprié, nous préférerions extraire de chaque surface un point qui serait le plus proche de la piste de cet aéroport.
Merci d'avance!
Hors ligne
#2 Sat 07 March 2020 12:25
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Bonjour à tous,
J'ai avancé sur le sujet.
J'ai extrait les sommets de chaque polygone (obstacles surfaciques) et j'ai créé un attribut distance avec NNJoin, calculant la distance mini entre tous ces sommets et les 4 sommets de la piste de l'aéroport.
En tout j'ai 2399 polygones.
Quelle est la requête à lancer pour extraire pour chaque polygone le point qui a la distance mini? (sachant que mon attribut distance s'appelle "dist" et que l'identifiant de chaque polygone s'appelle "Id-Polygone").
J'ai essayé Min ("dist", "Id-Polygone"), mais ça n'a pas marché.
Merci d'avance.
Hors ligne
#3 Sat 07 March 2020 16:56
- GeoSignature
- Participant occasionnel
- Lieu: Saint-Pierre-des-Nids
- Date d'inscription: 12 Nov 2019
- Messages: 34
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Bonjour Odjac33,
Si dans ta table de points, tu as toujours la référence au polygones sources (id_poly par ex), tu peux le faire en SQL en faisant
Code:
SELECT ts.* FROM ( SELECT id_poly, min(distance) as distmin FROM table_sommets GROUP BY id_poly ) tsmin INNER JOIN table_sommets ts ON (ts.id_poly = tsmin.id_poly AND ts.distance = tsmin.distmin);
Hors ligne
#4 Sat 07 March 2020 17:00
- GeoSignature
- Participant occasionnel
- Lieu: Saint-Pierre-des-Nids
- Date d'inscription: 12 Nov 2019
- Messages: 34
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Peut-être plus lisible comme cela (Common Table Expressions)
Code:
WITH tsmin AS (SELECT id_poly, min(distance) as distmin FROM table_sommets GROUP BY id_poly) SELECT ts.* FROM tsmin INNER JOIN table_sommets ts ON (ts.id_poly = tsmin.id_poly AND ts.distance = tsmin.distmin);
Hors ligne
#5 Sun 08 March 2020 11:45
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Merci de votre réponse,
Je ne suis pas un pro du SQL et je n'arrive pas à exécuter votre requête dans l'éditeur de requête de QGIS.
Prenons un exemple simplifié avec ces données pour différents sommets de 2 polygones (4 sommets pour le 3201 et 5 sommets pour 3202) :
Id-Polygone - Distance :
3201 - 324
3201 - 321
3201 - 343
3201 - 346
3202 - 876
3202 - 856
3202 - 870
3202 - 833
3202 - 867
Quelle est la requête QGIS qui sélectionne le 2° sommet du polygone 3201 (qui est à la distance 321, donc la plus petite des 4 (324, 321, 343 et 346)) et, de la même manière, le 4° sommet du polygone 3202 (833)?
Merci d'avance.
Hors ligne
#6 Sun 08 March 2020 18:30
- GeoSignature
- Participant occasionnel
- Lieu: Saint-Pierre-des-Nids
- Date d'inscription: 12 Nov 2019
- Messages: 34
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Quelle est la requête QGIS [...]
Voici un exemple de requête SQL :
Code:
WITH tsmin AS (SELECT Id-Polygone, min(Distance) as distmin FROM table GROUP BY Id-Polygone) SELECT t.* FROM tsmin INNER JOIN table t ON (t.Id-Polygone = tsmin.Id-Polygone AND t.distance = tsmin.distmin);
La seule chose à changer dans cette requête, c'est le nom de la table des sommets (que j'ai nommée "table", abrégé "t" *)
* cf. la notion d'alias dans les requêtes SQL : https://sql.sh/cours/alias
PS. : si tu envoies la table des sommets, je pourrais le faire et je te ferai une capture d'écran pour que ce soit plus explicite
Dernière modification par GeoSignature (Sun 08 March 2020 18:32)
Hors ligne
#7 Tue 10 March 2020 10:56
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Merci à toi,
J'ai modifié ton code en mettant le nom de la couche (Distsurfpiste1) à la place de "t" et dist à la place de distance . (Id-Polygone de vient Id-Polygon).
Ca donne ça:
WITH tsmin AS (SELECT Id-Polygon, min(Dist) as distmin FROM table GROUP BY Id-Polygon)
SELECT Distsurfpiste1.*
FROM tsmin
INNER JOIN table Distsurfpiste1 ON (Distsurfpiste1.Id-Polygon = tsmin.Id-Polygon AND Distsurfpiste1.dist = tsmin.distmin)
Je lance cette requête dans l'éditeur de requête de QGIS, icône epsilon (sélectionner les entités en utilisant une expression) dans la table attributaire.
Est-ce bien ici que l'on peut lancer une requête SQL dans QGIS? J'en doute car l'expression est systématiquement invalide.
Je joins la table des sommets (un extrait du fichier d'origine).
Encore merci.
Hors ligne
#8 Tue 10 March 2020 16:57
- Olivier Pompier
- Participant occasionnel
- Date d'inscription: 8 Sep 2013
- Messages: 49
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Bonjour,
Il ne faut pas que tu passes par la sélection par expression (icone epsilon) mais par la fenêtre sql du Gestionnaire de base de donnée (onglet DB Manager)
et sélectionner les couches virtuelles de ton projet Qgis.
Bien cordialement,
Hors ligne
#9 Wed 11 March 2020 10:36
- GeoSignature
- Participant occasionnel
- Lieu: Saint-Pierre-des-Nids
- Date d'inscription: 12 Nov 2019
- Messages: 34
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
Salut Odjac,
En effet, comme le conseille Olivier, il faut passer passer par le Gestionnaire de bases de données de QGis, qui permet d’exécuter des requêtes SQL sur ses couches.
Voici donc ce que ça donne sur ta table (cf. captures d'écran ci-jointes).
Attention : tu as utilisé un caractère spécial (le tiret du 6 : "-") dans le nom de champ "Id-Polygone". Du coup, j'ai dû passer entre guillemets ce champs car la requête ne fonctionnait pas sinon.
Et voici donc la requête mise à jour :
Code:
WITH tsmin AS (SELECT "Id-Polygon" as id, min(dist) as distmin FROM Distsurfpiste1 GROUP BY "Id-Polygon") SELECT t.* FROM tsmin INNER JOIN Distsurfpiste1 t ON (t."Id-Polygon" = tsmin.id AND t.dist = tsmin.distmin)
N'hésite pas si tu ne comprends pas quelque chose (et penche toi sur la notion des alias : "SELECT table AS t " est la même chose que "SELECT table t")
A+
Dernière modification par GeoSignature (Wed 11 March 2020 10:36)
Hors ligne
#10 Wed 11 March 2020 15:20
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Extraction automatique de points specifiques dans des surfaces
OK, un grand merci à vous 2. Ca fonctionne.
J'avoue très honnêtement que je ne connaissais pas du tout l'interface SQL du DB Manager.
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Extraction automatique de points specifiques dans des surfaces - Sujet suivant