Pages: 1
- Sujet précédent - QGIS: Requete spatiale - centroide a l'interieur de la couche - Sujet suivant
#1 Wed 30 March 2016 14:35
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour à tous,
Sauf erreur, il me semble qu'un mode de requête / jointure spatiale est absent de QGis : la requête "entités de la couche A ayant leur centroïde à l'intérieur de la couche B"
Ce mode de requête spatiale est très utile, par exemple avec des couches de polygones n'ayant pas la même topologie.
Exemple : sélectionner les communes GeoFla (couche A) à l'intérieur d'un périmètre administratif calé sur la Bd-Topo (couche B).
Avant que je n'en fasse la demande sur le Hub QGis, pouvez-vous me confirmer que c'est actuellement impossible ?
NB : Sur PostGreSQL, cela reviendrait à faire une requête de ce genre :
Code:
SELECT * FROM A, B WHERE ST_Intersects(ST_Centroid(A.geom), B.geom)
Merci à vous.
Sylvain M.
Sylvain M.
Hors ligne
#2 Wed 30 March 2016 16:37
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Depuis la version 2.14 il est possible de faire du SQL (de spatialite) avec n'importe quelle couche.
https://www.qgis.org/fr/site/forusers/v … ual-layers
Hors ligne
#3 Wed 30 March 2016 16:46
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Sympa ça !
Je suis encore en 2.8, mais ça donne envie de mettre à jour.
Merci pour l'info.
(et du coup, je n'ouvre pas de ticket d'amélioration QGis !)
A+
Sylvain M.
Sylvain M.
Hors ligne
#4 Tue 03 May 2016 14:27
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour à vous,
Je reviens sur cette question.
J'ai bien noté (même si pas encore pratiqué) que QGis 2.14 permettait de faire des requêtes SQL spatiales avec n'importe quelle couche.
Pour le géomaticien que je suis c'est une très bonne nouvelle :-)
Mais pour mes collègues utilisateurs de QGis, le SQL spatial n'est pas encore à leur portée. :-/
Hors, une requête de type "les communes qui sont dans le périmètre administratif Truc" me semble être une opération basique qui devrait être à leur portée.
Je n'y suis pas parvenu avec des données pourtant cohérentes d'un point de vue topologique (issue du même millésime de GeoFla Communes).
La capture d'écran ci-jointe sera plus parlante.
La seule solution que j'ai trouvé (et utilisé), c'est de créer une couche des centroïdes des communes, pour faire la sélection sur une couche de points (intersection).
N'y aurait-il pas plus simple ? (dans ArcGis Basic, on a bien une sélection spatiale de type "les entités de la couche cible ont leur centroïde dans les entités de la couche source")
Merci à vous.
Sylvain M.
SOURCE :
[img]http://georezo.net/forum/attachment.php?item=6983&download=1[/img]
RÉSULTATS DE SÉLECTIONS :
[img]http://georezo.net/forum/attachment.php?item=6984&download=1[/img]
Dernière modification par Sylvain M. (Tue 03 May 2016 14:49)
Sylvain M.
Hors ligne
#5 Tue 03 May 2016 18:50
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Sylvain, les périmètres agrégés (Pays? Comcom?) c'est toi qui les as créés ou est-ce fourni? Si ce n'est pas le cas, pourrais tu les recréer sous QGIS et refaire le test pour voir? Le résultat du chevauchement laisse penser que QGIS n'affecte pas la même précision (dans le cas bien sûr où c'est lui qui a été utilisé) en fusion qu'en recherche et de mon point de vue il y aurait des améliorations à envisager. Mais bon...
Par contre, tu parles bien de l'outil menu vecteur --> Recherche -->Sélection spatiale? Je n'ai pas trop compris si c'était de lui que tu parlais ou si t'avais SQLisé.
Hors ligne
#6 Mon 09 May 2016 09:43
- thibault.sylvain
- Participant occasionnel
- Lieu: Alençon
- Date d'inscription: 19 Sep 2007
- Messages: 12
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
J'ai été confronté à ce problème car je voulais lister les communes qui se trouvaient à l'intérieur d'une CDC. Les résultats obtenus étaient erronés à cause de l'imprécision de mes géométries.
J'ai réussi à contourner le problème en utilisant la fonction suivante :
Code:
select * from public.t_commune JOIN public.t_epci ON st_within(ST_centroid(t_commune.geom) , t_epci.geom)
Cette requête SQL permet donc de retourner les données des deux tables et la liaison entre les deux tables se fait sur la fonction st_within(ST_PointOnSurface(t_commune.geom) , t_epci.geom) qui permet dans un premier temps de récupérer le centroïde de la commune(ST_centroid) et dans un second temps de vérifier la présence de ce centroïde à l'intérieur de l'EPCI (st_within)
Cordialement,
Sylvain THIBAULT
Sylvain THIBAULT
Hors ligne
#7 Wed 11 May 2016 10:34
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour à vous,
Excusez moi, mais j'avais zappé vos réponses !
C'est bien moi qui ait créé les périmètres agrégés : ils sont donc parfaitement topologiques avec la couche des communes source.
La requête SQL est parfaite pour mes usages, mais je souhaiterais que mes collègues non géomaticiens, qui pratiquent le SIG de manière ponctuelle, puissent réaliser ce genre de sélection sans passer par du code SQL qui va les rebuter.
Par contre, tu parles bien de l'outil menu vecteur --> Recherche -->Sélection spatiale?
Oui, sauf que moi c'est "Menu vecteur --> Requête spatiale --> Requête spatiale" (QGis 2.8.1)
Théoriquement, quel serait selon vous le mode de sélection à utiliser pour ce besoin ?
- à l'intérieur
- chevauche
- contient
- est disjoint
- est égal
- intersecte
- touche
J'aurais dit "à l'intérieur", mais il ne prend dans ce cas pas les entités qui intersectent...
D'où je pense la nécessité d'ajouter une option "ont leur centroïde dans" (c'est bien présent dans ArcGis, et mes collègues savent l'utiliser, contrairement au SQL : donc si on pouvait avoir ça dans QGis, ça faciliterait la bascule !).
A+
Sylvain M.
Dernière modification par Sylvain M. (Wed 11 May 2016 10:34)
Sylvain M.
Hors ligne
#8 Wed 11 May 2016 12:26
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Salut,
Oui, sauf que moi c'est "Menu vecteur --> Requête spatiale --> Requête spatiale" (QGis 2.8.1)
On ne parle donc pas des mêmes outils, ce sont tous des extensions Core (le mien sous Ftools, le tien. On pourrait même y rajouter un troisième dans le menu Traitement (select by location). Il y a peut-être un ménage à faire de ce côté...
Essaie donc les deux autres (d'ailleurs avec une interface assez proche tous les trois) et tiens-nous informés des résultats.
Hors ligne
#9 Wed 11 May 2016 14:29
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Je viens de tester :
- Select by location (menu traitements) => résultats Idem
- Menu vecteur > Outils de recherche > Sélection par localisation => résultats Idem, mais options différentes (uniquement "Intersection" disponible, mais avec option d'inclusion ou non d'entités qui "touchent", "chevauchent" ou "sont entièrement contenues").
Bref, impossible de récupérer la liste des communes des entités administratives (zones de compétences d'un réseau de partenaires privés).
C'est pourtant pas bien compliqué comme requête spatiale !
Je vais installer la dernière version de QGis, pour voir si ça change quelque chose.
A+
Sylvain M.
Sylvain M.
Hors ligne
#10 Wed 11 May 2016 15:01
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Pour info, je viens d'installer QGis 2.14
- la requête en SQL Spatial [ST_centroid()] sur couches virtuelles marche nickel : pour moi c'est top.
- les différentes requêtes spatiales "presse-bouton" ne permettent toujours pas de faire cette sélection "basique"
Si quelqu'un veut tester, je peux lui envoyer mes données en MP, pour vérifier si c'est moi qui suis pas bien réveillé
A+
Sylvain M.
Sylvain M.
Hors ligne
#11 Fri 13 May 2016 16:45
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Petite relance avant de partir en week-end : pensez-vous, comme moi, que ce mode de sélection spatiale doive faire l'objet d'une demande d'évolution de QGis ?
(en prenant en compte le fait que c'est possible en SQL spatial, mais que ce n'est pas approprié aux géomaticiens en herbe)
Je veux bien votre avis sur la pertinence de cette demande, avant de la faire.
A+
Sylvain M.
Sylvain M.
Hors ligne
#12 Sun 15 May 2016 20:12
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Salut Sylvain,
Tu peux toujours faire la demande mais je ne pense pas qu'elle couvrirait forcément le besoin. Peut-être dans ce cas-ci mais quid si une commune avait une forme telle que son centroide n'était pas en son intérieur (st_centroid vs st_pointonsurface) et que cette commune était en limite de territoire agrégé? Par exemple, le bout d'île au nord de La Manche? tu pourrais ne pas la sélectionner celle-là, s'il s'agit d'une commune en deux parties et que le centroïde tombe en pleine mer.
Perso, je préférerais une solide comparaison entre géométries polygonales (ou de base), plutôt qu'avec un centroïde.
J'ai donc aussi fait des tests avec geofla et une couche dep normands générée virtuellement à partir des communes avec
Code:
select CODE_DEP, NOM_DEP, CODE_REG, NOM_REG, ST_UNION(geometry) as geom from (select * from COMMUNES where CODE_REG='NORMANDIE') group by CODE_DEP, NOM_DEP, CODE_REG, NOM_REG
Et mes tests de sélection (avec l'outil du menu Recherche, une option à la fois) m'amènent, sans avoir consulté le code des fonctions toutefois, à ces règles:
- "intersectent" renvoie toutes les communes qui partagent une surface ou une limite avec un département (ici, même chose que toi)
- "touchent" concerne les communes qui partagent une limite avec un département sans partage de surface, donc les communes limitrophes de la Normandie
- "chevauchent" : une partie de la surface (mais pas toute) de la commune est contenue dans un département, soit aucune commune renvoyéevu que tout est topologiquement nickel
- "contenues" renvoie les communes qui ont toute leur surface à l'intérieur d'un département, soit bien TOUTES les communes du département ou de la région Normandie.
Je n'ai pas testé "Requête Spatiale" car extrêmement long (j'ignore si c'est ma config qui en est la cause, et je sais être patient mais là j'abandonne l'idée de reprendre les tests dessus- il n'y a pas photo entre les deux outils, d'autant que tu ne peux même pas annuler la requête). Quelqu'un pourrait me confirmer cet état afin que je signale aux devs, svp? Merci.
J'en viens donc à m'interroger sur la qualité topologique de tes données. Pourrais-tu utiliser le vérificateur topologique de QGIS pour voir les relations spatiales entre les deux couches? Et en relisant tes premiers messages, tu parles de superposer Geofla et bd-Topo qui n'ont pas la même précision et, si c'est ce que tu fais, cela renverra logiquement des résultats imprévisibles.
Hors ligne
#13 Thu 19 May 2016 09:46
- Xavier Julian
- Participant assidu
- Lieu: Orange
- Date d'inscription: 19 Jan 2015
- Messages: 218
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Je mets mon grain de sel dans cette discussion intéressante.
Je crois que personne n'a évoqué le plugin realcentroid, qui force les centroïdes à l'intérieur des polygones.
Dans la documentation fournie, il apparait que le code est similaire au "ST_PointOnSurface" de PostGIS.
http://www.agt.bme.hu/gis/qgis/realcentroid/
++
Dernière modification par Xavier Julian (Thu 19 May 2016 09:49)
Hors ligne
#14 Tue 24 January 2017 16:09
- Elminster
- Participant occasionnel
- Date d'inscription: 9 Jun 2008
- Messages: 47
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Je me permet de relancer le sujet. Un peu comme Sylvain, j'aimerai sélectionner des communes qui sont à l'intérieur des entités de ma couche EPCI afin de renseigner automatiquement mes ma table commune. Sauf qu'il semble y avoir un léger décalage entre ma couche commune et ma couche EPCI.
La fonction within ne marche pas correctement dans mon cas. En lisant votre message, j'ai donc combiner les fonctions ST_Within et ST_Centroid sur pour une couche virtuelle.
Mais la couche virtuelle ne permet pas de faire des modifications.
Si quelqu'un a une solution, je suis preneur.
Pour info, j'ai un message presque similaire sur le forumsig qui pour l'instant n'a pas trouvé de réponse: http://www.forumsig.org/showthread.php/ … e-spatiale
Si ça change, je vous tiendrai au courant.
Merci d'avance!
Cordialement,
Elminster
Hors ligne
#15 Tue 24 January 2017 16:18
- Elminster
- Participant occasionnel
- Date d'inscription: 9 Jun 2008
- Messages: 47
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Pour faire suite au problème de Sylvain, j'aimerai mettre à jour une table commune à partir d'une table EPCI. Sauf qu'il y a un très léger décalage entre les 2 tables.
Les outils de requête spatial, ne semblent pas répondre à mon problème. La couche virtuelle pourrait presque y répondre en combinant ST_Within et ST_Centroid, sauf qu'on ne peut pas faire de modification sur la couche vitruel...
Si quelqu'un a une solution je suis preneur.
Pour info, j'ai posté un message similaire sur le forumsig: http://www.forumsig.org/showthread.php/ … e-spatiale
Je vous tiendrai au courant si j'ai une réponse sur le forumsig.
Cordialement,
Elminster
Hors ligne
#16 Tue 24 January 2017 17:36
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
sauf qu'on ne peut pas faire de modification sur la couche vitruel...
Non, mais tu pourrais ensuite mettre à jour ta couche d'origine via une jointure attributaire à ta couche virtuelle ?
Mais, comme toi, je suis toujours aussi intéressé par un mode de jointure spatiale basée sur le centroïde de la couche source.
A+
Sylvain M.
Dernière modification par Sylvain M. (Tue 24 January 2017 17:36)
Sylvain M.
Hors ligne
#17 Wed 25 January 2017 11:13
- Elminster
- Participant occasionnel
- Date d'inscription: 9 Jun 2008
- Messages: 47
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Merci Sylvain!
Je n'ai pas fait de jointure attributaire avec ma couche virtuelle, mais une requête spatiale qui me permettait de sélectionner mes communes pour les mettre à jour.
Mais dommage qu'il n'existe pas une solution simple sur ce problème alors que sous MapInfo, on peut faire une sélection avec "Within" ou "Entirly Within".
Et désolé pour le double post précédent, mais je pensais voir eu un bug lors de la publication de mon 1er message (qui ne me semblait pourtant pas être mon 1er message sur le forum)
Hors ligne
#18 Wed 25 January 2017 13:40
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Mais dommage qu'il n'existe pas une solution simple sur ce problème alors que sous MapInfo, on peut faire
+1
Et sous ArcGis aussi d'ailleurs, de manière très simple : c'est la dernière option des méthodes de sélection spatiale ("selon l'emplacement") : "entités de la couche cible ont leur centroïde dans l'entité de la couche source"
Sylvain M.
Hors ligne
#19 Mon 13 January 2020 12:28
- MLaure19
- Participant occasionnel
- Date d'inscription: 10 Jan 2020
- Messages: 40
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Nouvelle sur Georezo, je rencontre un problème similaire mais je n'arrive pas à m'en sortir.
Je travaille avec QGIS 3.4.14. J'ai deux couches :
- une qui s'appelle "EMD"
- une qui s'appelle "IRIS"
J'ai placé les centroïdes au centre de mes IRIS et je souhaite voir à quelles zones EMD les centroïdes appartiennent.
Je suis allée dans Base de données - Gestionnaire de bases de données - Couches virtuelles - Couches du projet et j'ai essayé de rentrer ce code SQL mais cela ne marche pas :
select * from IRIS JOIN EMD ON st_within(ST_centroid(IRIS) , EMD)
J’obtiens l’erreur suivante : Query preparation error on PRAGMA table_info(_tview): no
Si quelqu'un avait la solution à mon problème ça serait génial.
Merci beaucoup, Marie-Laure
Hors ligne
#20 Mon 13 January 2020 13:08
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Bonjour,
Utilisez l'algorithme de sélection par localisation ou son comparse "extraction par localisation", accessible depuis la boîte à outils du menu Traitement.
Hors ligne
#21 Tue 14 January 2020 11:55
- MLaure19
- Participant occasionnel
- Date d'inscription: 10 Jan 2020
- Messages: 40
Re: QGIS: Requete spatiale - centroide a l'interieur de la couche
Merci beaucoup SANTANNA !
Grâce à toi, j'ai réussi à extraire les données avec la fonction "Joindre les attributs par localisation" sans passer par un code SQL complexe
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Requete spatiale - centroide a l'interieur de la couche - Sujet suivant