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é ?

#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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9864
Site web

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9864
Site web

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' wink

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

 

Pied de page des forums

Powered by FluxBB