Calcul de distance entre deux points géographiques
Le
kael

Bonjour,
Je cherche une formule pour calculer en Python la distance entre deux
points à partir de leurs coordonnées géographiques.
Plus précisément, à partir d'une liste de points définis par un couple
latitude/longitude, je souhaite savoir quels sont les n points les plus
proches d'un point donné.
--
kael
Je cherche une formule pour calculer en Python la distance entre deux
points à partir de leurs coordonnées géographiques.
Plus précisément, à partir d'une liste de points définis par un couple
latitude/longitude, je souhaite savoir quels sont les n points les plus
proches d'un point donné.
--
kael
C'est de la trigonométrie sphérique
http://fr.wikipedia.org/wiki/Trigonom%C3%A9trie_sph%C3%A9rique
Il faut d'abord trouver les distances qui sépares les points, en angles à la
surface de la Terre.
Et ensuite les convertir en distances.
--
Ne pas prévoir, c'est déjà gémir
Léonard de Vinci
Pas nécessairement aussi simple. Il faudrait peut-être savoir le
domaine d'application. S'il s'agit d'un problème d'optimisation des
taxis dans une ville donnée, ce sera un problème simple de géométrie
plane. S'il s'agit d'une centrale de navigation envisageant
éventuellement des routes transocéaniques, il faudra peut-être se poser
la question loxo/ortho. S'il s'agit de sismologie ou autre, ou d'un GPS
pour les taupes, peut-être la distance ne sera pas à prendre ni à cap
constant, ni classiquement sur le grand cercle, mais simplement en
ligne droite, la nuance pour deux points antipodes étant quand même un
rapport 1,57 entre les deux interprêtation.
Ceci dit, la partie informatique du problème sera d'un autre ordre, à
savoir ne pas coder n'importe comment une formule correcte...
--
Pierre Maurette
Le probléme de ce genre de question est que la réponse constitu un véritable
travail, on ne peut que orienter la personne qui pose la question pour qu'il
puisse lui même faire lui même ce travail.
--
Ne pas prévoir, c'est déjà gémir
Léonard de Vinci
Il faut chercher la formule "haversine". Il y a de nombreux exemples de
codage sur le net.
Pour ma part, j'utilise une version qui est une approximation de la
formule et donc pas la distance réelle mais suffit pour l'application
dont j'ai besoin : trouver les codes postaux dans un rayon de n kms
autour d'une commune donnée. Je n'ai pas besoin de la précision au cm!
Sinon : http://en.wikipedia.org/wiki/Haversine_formula
et c'est Geopy : http://exogen.case.edu/projects/geopy/
Cordialement,
Alain
CREATE OR REPLACE FUNCTION haversine(double precision, double precision,
double precision, double precision)
RETURNS double precision AS
'
/*
Retourne la distance Haversine deux points
Appel : Latitude1,Longitude1, Latitude2, Longitude2 en degrés, min.
Retourne : distance en kms.
*/
DECLARE
Latitude1 alias for $1;
Longitude1 alias for $2;
Latitude2 alias for $3;
Longitude2 alias for $4;
distance float8;
BEGIN
distance := 6372.795 * 3.1415926 *
sqrt(
(Latitude1-Latitude2)*(Latitude1-Latitude2)
+
cos(Latitude1/57.29578)*cos(Latitude2/57.29578)*(Longitude1-Longitude2)*(Longitude1-Longitude2)
)
/ 180;
return distance;
END;
'
LANGUAGE 'plpgsql' VOLATILE STRICT;
Bonjour,
Beaucoup de formules utiles de trigo sphérique ici :
http://mathforum.org/library/drmath/sets/select/dm_lat_long.html
val
j'ai du jouer avec ça l'année passée, dans le domaine GSM,
pour calculer quelles antennes "voient" une maison ou une zone
particulière.
je me suis pas mal inspiré de cette page :
http://www.movable-type.co.uk/scripts/latlong.html
beaucoup de plaisir en perspective. :-)
l'idée est aussi de passer dans un systeme de coordonées plan
pour simplifier les calculs lorsque la précision à quelques mètres
suffit.
Olivier
Mmm... je voulais pas intervenir, mais l'ensemble de ces formules est
assez facile à réétablir : en coordonnées sphériques "normalisées", on
a x= cos Lo cos La ,y= sin Lo cos La , z= sin La, où Lo est la
longitude et La la latitude (en radians ou prendre les fonctions trigo
en degrés aussi), et alors la distance de deux points est R alpha (où R
est le rayon terrestre), l'angle alpha les séparant vérifiant cos alpha
= (xx+yy'+zz'). Il est tout à fait inutile de se simplifier encore la
vie avec des formules approchées, puisque n'importe quelle calculette
donnera ces valeurs instantanément.
Mais il y a un énorme mais : la précision est très médiocre,
contrairement à ce que dit le site anglais mentionné plus haut : la
terre est un ellipsoide, et l'aplatissement aux pôles est de près de
1/300, ce qui modifie considérablement ces formules (de près de 100 kms
pour la distance des pôles)...
tout a fait, on peut prendre la formule non simplifiée,
c'est ce que j'avais fait il me semble.
pour mes calculs, je tenais compte de la variation du R selon la
latitude,
j'ai plus la référence ici, mais je peux la retrouver si nécessaire,
tout en calculant des distances "localement" (quelques km).
car bien sur, la Terre est une boule qui n'est pas parfaitement
sphérique.
ces formules sus-mentionnées conviennent néanmoins très bien pour des
calculs
de quelques km, avec une précision de quelques mètres, pour le
problème qui m'occupait...
couverture d'une antenne (un secteur typiquement).
Olivier
Je vous remercie pour vos réponses puisque j'allais poser la même question.
Et comme je vois que "kael" à l'origine de la question n'a jamais cru
bon de vous remercié, je le fais à sa place :)
Je souhaitais faire ça pour des calculs de distance qui ne dépasseront
pas la centaine de km. D'après ce que vous dites, ça devrait donc convenir.