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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB