#1 Mon 01 December 2008 11:41
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Distance PostGIS
Bonjour,
j'utilise la fonction st_distance() pour calculer la distance entre deux géometries de deux tables différentes.
Savez-vous si on peut calculer la distance entre deux enregistrements d'une même table en fonction de leur nom?
merci beaucoup
Hors ligne
#2 Mon 01 December 2008 12:47
Re: Distance PostGIS
Bonjour,
je suppose qu'en faisant un FROM toto as T, toto as S WHERE st_distance(t.the_geom,s.the_geom) AND t.attrib='valeur1' AND s.attribut='valeur2' cela devrait fonctionner.
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Mon 01 December 2008 17:27
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Re: Distance PostGIS
Bonjour Yves,
effectivement, cela fonctionne, mais je tiens à vous préciser ma requête :
Code:
create view commune_5000m_nom as SELECT t.the_geom, t.nom FROM commune as S, commune as T where st_distance(s.the_geom, t.the_geom) < 5000 and s.nom = 'nom';
donc c'est une requête pour trouver les communes qui sont à moins de 5000 m d'une autre commune.
cependant cela à généré quelques interrogations :
la réalisation de la requête à été longue, est-ce normale (je précise que j'utilise déjà un index GIST) y a-t-il moyen de l'accélérer ?
j'ai lu quelque part qu'en utilisant un opérateur spatial (box3d) plutôt qu'une fonction, la requête serait plus rapide. je n'ai pour l'instant pas eu le temps de tester et surtout, la syntaxe ne m'est pas familière.
le problème vient surtout de l'affichage sur mon SIG client, c'est très long dès que je zoom/dézoom
avez-vous des suggestions ???
en tout cas merci déjà.
Hors ligne
#4 Mon 01 December 2008 17:29
Re: Distance PostGIS
Bonjour,
Je ne voie pas en quoi l'utilisation d'une Box3D serait plus rapide, st_distance() utilise déjà automatiquement l'index spatial que tu as crée !
Par contre il est peut être judicieux de créer un index sur le champ attributaire 'nom'
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#5 Mon 01 December 2008 17:43
- Guillaume Sueur
- Participant assidu
- Lieu: Toulouse
- Date d'inscription: 23 Sep 2005
- Messages: 331
- Site web
Re: Distance PostGIS
Essaie ça :
SELECT t.the_geom, t.nom
FROM com as t
where t.the_geom && (select the_geom from com where nom = 'TOULOUSE') AND st_distance(t.the_geom, (select the_geom from com where nom = 'TOULOUSE')) < 5000;
Guillaume
Hors ligne
#6 Mon 01 December 2008 18:28
- NyPon
- Participant actif
- Date d'inscription: 3 Nov 2008
- Messages: 111
Re: Distance PostGIS
Bonsoir Yves, bonsoir Guillaume
j'ai lu ça sur la doc de postgis, mais en fait ça sélectionne pas les mêmes choses.
http://www.postgis.fr/node/190
pour info, la première requête à mis 408773ms et m'a sélectionné 29 communes.
la seconde à mis 665ms et m'a sélectionné 8 communes.
est-ce que l'une considère que la commune doit être complètement incluse dans les 5000m alors que l'autre considère qu'elle doit juste toucher les 5000 m ???
cordialement,
nicolas
Dernière modification par NyPon (Mon 01 December 2008 18:30)
Hors ligne
#7 Mon 01 December 2008 18:44
- Guillaume Sueur
- Participant assidu
- Lieu: Toulouse
- Date d'inscription: 23 Sep 2005
- Messages: 331
- Site web
Re: Distance PostGIS
la distance décrit un cercle, tandis que la bbox est carrée. cela doit expliquer les différences puisque l'utilisation de la bbox contraint les résultat à se trouver dans l'intersection de celle-ci.
Pour optimiser, faire un && sur un buffer de la commune source égal à la distance de recherche.
Hors ligne