#1 Wed 19 April 2023 16:40
- tireau_maylis
- Juste Inscrit !
- Date d'inscription: 19 Apr 2023
- Messages: 8
Sélection objets
Bonjour,
Je travaille sur deux couches : Referentiel foncier public et la BD TOPO. Je souhaite sélectionner les bâtiments de la BD TOPO qui se situent sur le RFP grâce à une requête SQL car il y a beaucoup de données. Mais les bâtiments de la BD TOPO dépassent un petit peu des limites duRFP.
Je ne peux pas utiliser st_intersect car il va me sélectionner tous les bâtiments qui intersectent mais pas forcément ceux sur la couche RFP. Je ne peux pas non utiliser st_contains puisqu'ils ne me les sélectionnent pas.
Quelle commande SQL pourrais je utiliser pour avoir seulement les bâtiments qui sont sur le RFP ?
Merci par avance
Hors ligne
#2 Wed 19 April 2023 18:03
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 994
Re: Sélection objets
Bonjour Maylis,
pour avoir seulement les bâtiments qui sont sur le RFP ?
J'ai personnellement du voir les bâtiments que vous souhaitez et ceux que vous ne souhaitez pas : vous pourriez peut-être faire un petit dessin pour illustrer ceux qui sortent avec ST_Intersect que vous ne voulez pas ?
Sinon, les fonctions de relations spatiales sont illustrées ici :
http://postgis.net/workshops/postgis-in … ships.html
Sylvain M.
Hors ligne
#3 Wed 19 April 2023 19:01
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1542
Re: Sélection objets
Bonsoir,
Ce qui se fait parfois pour identifier des polygones contenus dans d'autres alors que les couches sont mal calées (donc intersection entre les deux couches) est de faire l'intersection entre les objets des deux couches et de regarder le % d'intersection d'un objet vs un autre:
un batiment "un peu a cheval" va avoir 99% de sa surface en intersection avec un RFP => il est dans ce RFP.
Il faut décider d'une valeur (plus de x% de la surface en intersection) pour choisir quel polygone associer avec un polygone de l'autres couche.
Nicolas
Hors ligne
#4 Thu 20 April 2023 14:44
- tireau_maylis
- Juste Inscrit !
- Date d'inscription: 19 Apr 2023
- Messages: 8
Re: Sélection objets
Oui c'est exactement ce que j'ai pensé à faire mais je n'arrive pas à trouver la formule sql.
Bonsoir,
Ce qui se fait parfois pour identifier des polygones contenus dans d'autres alors que les couches sont mal calées (donc intersection entre les deux couches) est de faire l'intersection entre les objets des deux couches et de regarder le % d'intersection d'un objet vs un autre:
un batiment "un peu a cheval" va avoir 99% de sa surface en intersection avec un RFP => il est dans ce RFP.
Il faut décider d'une valeur (plus de x% de la surface en intersection) pour choisir quel polygone associer avec un polygone de l'autres couche.
Nicolas
Hors ligne
#5 Thu 20 April 2023 14:47
- tireau_maylis
- Juste Inscrit !
- Date d'inscription: 19 Apr 2023
- Messages: 8
Re: Sélection objets
Sur la première photo, j'ai utilisé "intersecter" les bâtiments sélectionnés en jaune dépassent sur la couche RFP mais ne se situent pas dessus.
Sur la seconde photo, j'ai utilisé "contient" mais les bâtiments ne sont pas sélectionnés puisqu'ils dépassent
Bonjour Maylis,
pour avoir seulement les bâtiments qui sont sur le RFP ?
J'ai personnellement du voir les bâtiments que vous souhaitez et ceux que vous ne souhaitez pas : vous pourriez peut-être faire un petit dessin pour illustrer ceux qui sortent avec ST_Intersect que vous ne voulez pas ?
Sinon, les fonctions de relations spatiales sont illustrées ici :
http://postgis.net/workshops/postgis-in … ships.html
Dernière modification par tireau_maylis (Thu 20 April 2023 14:57)
Hors ligne
#6 Thu 20 April 2023 15:24
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 994
Re: Sélection objets
Je vois mieux la problématique.
La solution proposée par Nicolas est la plus propre : il faut calculer la surface de la zone d'intersection des bâtis avec le RFP, via quelque chose comme :
ST_Area(ST_Intersection(bati.geom,rfp.geom))
(à diviser par la surface d'origine du bâti, pour connaitre le pourcentage dans la RFP).
Mais dans ce cas, ce qui marche souvent est de se baser non pas sur la géométrie des bâtiments, mais uniquement sur leur centroide, via ST_Centroid(bati.geom), ou ST_PointOnSurface(bati.geom) (et donc => ST_Intersects(ST_PointOnSurface(bati.geom),rfp.geom) )
En faisant l'intersection dessus, ça marche dans 99.9% des géométries, et c'est plus rapide que la découpe des géométries intersectées (si le volume de données est important par exemple).
A+
Sylvain M.
Hors ligne
#7 Thu 20 April 2023 15:53
- tireau_maylis
- Juste Inscrit !
- Date d'inscription: 19 Apr 2023
- Messages: 8
Re: Sélection objets
Je n'ai pas bien compris quand j'utilise ST_Intersects(ST_PointOnSurface(bati.geom),rfp.geom) , faut-il que je divise par la surface d'origine du bâti, pour connaitre le pourcentage dans la RFP ou je divise seulement si j'utilise la première fonction (st_area) ?
Merci de votre réponse
Maylis
Dernière modification par tireau_maylis (Thu 20 April 2023 15:55)
Hors ligne
#8 Thu 20 April 2023 16:17
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: Sélection objets
Bonjour.
La solution de Sylvain est la plus simple, il suffit de croiser le centre de gravité(ST_pointonsurface) de l'objet graphique d'origine (le bati) avec les emprises du RFP. Inutile de chercher à connaître les pourcentages de surface à l'intérieur ou à l'extérieure.
JP
Hors ligne
#9 Thu 20 April 2023 18:09
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 994
Re: Sélection objets
En effet, je me suis peut-être mal exprimé.
Voici la requête complète, à adapter aux noms de vos tables/champs :
Code:
SELECT bati.* FROM bati JOIN rfp ON ST_Intersects(ST_PointOnSurface(bati.geom), rfp.geom)
Sylvain M.
Hors ligne
#10 Fri 21 April 2023 09:12
- tireau_maylis
- Juste Inscrit !
- Date d'inscription: 19 Apr 2023
- Messages: 8
Re: Sélection objets
merci !
Hors ligne