#1 Tue 09 June 2020 10:22
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Cross lateral join - Centroides
Bonjour,
Je dispose de 2 tables.
- La première, nommée Tab1, est un récapitulatif sans géométrie décrivant une commune de départ et une commune d'arrivée avec leur code insee
Image : https://zupimages.net/viewer.php?id=20/24/gkot.png
- La seconde, nommée Tab2, est une table géométrique de polygone de communes, comportant les même codes insee que la première table.
Image : https://zupimages.net/viewer.php?id=20/24/4pmz.png
Je voudrais, pour chaque ligne décrivant un départ et une arrivée de Tab1 avoir la distance qui sépare les centroides des deux communes. Je me suis testé à un code qui malheureusement dure indéfiniment. C'est l'autojointure de Tab2 qui doit mal se passer :
Code:
with tab1 as (select commune, dcran from migration where commune <> dcran group by commune, dcran) select p.insee_com, t.insee_com, t.dist from tab2 p cross join lateral( select r.insee_com, st_centroid(p.geom) <-> st_centroid(r.geom) as dist from tab2 r order by st_centroid(p.geom) <-> st_centroid(r.geom) limit 1) as t, tab1 where p.insee_com = commune and t.insee_com = dcran
Merci.
Hors ligne
#2 Tue 09 June 2020 11:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Cross lateral join - Centroides
Bonjour,
Les tables montrées en image ne correspondent pas à votre requête. (au passage, c'est plus simple de mettre la structure des tables sous forme de texte dans le message plutot qu'une capture d'ecran des lignes)
Votre requête est bien compliquée: Il ne faut pas utiliser l'opérateur KNN order by geom <-> geom dans votre cas: vous voulez la distance entre deux objets que vous connaissez, pas les n plus proches voisins d'un objet.
C'est plutot st_distance(comme_depart, commune_arrivee) qu'il faut utiliser:
Code:
select tab1.id, tab1.commune_depart, tab1.commune_arrivee, st_distance(st_centroid(c1.geom), st_centroid(c2.geom)) as dist from tab1 join tab2 c1 on tab1.commune_depart = c1.code_insee join tab2 c2 on tab1.commune_arrivee = c2.code_insee
Nicolas
Hors ligne
#3 Tue 09 June 2020 11:53
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: Cross lateral join - Centroides
Bonjour et merci pour votre réponse.
Effectivement, après réflexion, utiliser Cross join dans mon exemple n'a pas de sens. Effectivement, st_distance répond complètement à mon besoin.
Merci beaucoup.
Hors ligne