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

GEODATA DAYS 2024

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


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

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)


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

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

 

Pied de page des forums

Powered by FluxBB