#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: 1544
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: 1544
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: 1544
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