Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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 Fri 29 October 2021 09:58

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Distance point le plus proche

Bonjour,

Je dispose d'une grande table spatiale qui contient de nombreux bâtiments de la BD Topo (plus de 18 millions) avec un code insee en France, et en Lambert93. Sur un territoire en particulier, je souhaite obtenir la distance la plus courte qui sépare chaque polygone à un autre.

Pour cela, je me sers de la clause "cross join lateral" qui semble avoir de meilleures performances que "st_distance".

Code:

select c.id, t.dist
from fusion_centroid c cross join lateral (
    select z.id, c.geom <-> z.geom as dist
    from fusion_centroid2 z
    where c.insee_com like '01%' and c.id_parcelle > z.id_parcelle and c.id > z.id
    order by c.geom <-> z.geom
    limit 1
) t
where c.insee_com like '01%'

Cette requete ne se termine jamais (même après 8h).

- En filtrant sur le département de l'Ain (01), je tombe pourtant le nombre d'entités à environ 2 millions.
- Un index spatial existe sur la table.
- Mon pc : processeur i7 10ème génération et 16Gb de RAM.
- J'ai modifié le fichier .conf pour l'optimiser en fonction de mon matos (mais même par défaut, la requête ne se terminait jamais).
- J'ai lancé un "cluster;" dans ma bdd pour la nettoyer ainsi qu'un "vacuum analyze ma_table"

Aurais-je oublié quelque chose ?

Merci.

Dernière modification par preliator (Fri 29 October 2021 10:19)

Hors ligne

 

#2 Fri 29 October 2021 10:13

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Distance point le plus proche

Bonjour,

Je pense que vous essayez de faire un plus proche voisin (KNN) avec l'opérateur distance de postgis, mais vous vous trompez:
vous écrivez st_centroid(c.geom) > st_centroid(z.geom) au lieu de l'opérateur distance  <->
Normal que votre requete ne finisse jamais.

Il y a de nombreux exemples de KNN sur le forum.

Nicolas

Hors ligne

 

#3 Fri 29 October 2021 10:18

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Re: Distance point le plus proche

Oups, j'ai entré la mauvaise requête. C'est bien un "<->" que j'ai entré.

Code:

select c.id, t.dist
from fusion_centroid c cross join lateral (
    select z.id, c.geom <-> z.geom as dist
    from fusion_centroid2 z
    where c.insee_com like '01%' and c.id_parcelle > z.id_parcelle and c.id > z.id
    order by c.geom <-> z.geom
    limit 1
) t
where c.insee_com like '01%'

Hors ligne

 

#4 Fri 29 October 2021 12:03

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Distance point le plus proche

Pourquoi vous faites appel à 2 tables fusion_centroid et fusion_centroid2 dans votre requête ?
Si vous voulez chercher l'objet le plus proche de chaque objet, une seule table suffit.

Je vois aussi que vous faites 2 test sur id et id_parcelle: pas besoin: faites-le juste sur la PK de la table.
Pareil, vous faites 2 fois le test c.insee_com like '01%', c'est inutile.

La requete serait plutot:

Code:

select c.id, t.id2, t.dist
from fusion_centroid c cross join lateral (
    select z.id as id2, c.geom <-> z.geom as dist
    from fusion_centroid z
    where c.id < z.id
    order by c.geom <-> z.geom
    limit 1
    ) t
where c.insee_com like '01%';

Nicolas

Hors ligne

 

#5 Fri 29 October 2021 14:18

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Distance point le plus proche

Le plus rapide, c'est d'extraire de la table principales les objets qui vous interessent et de lancer KNN sur cette table.

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB