Une solution approximative (basée sur une projection équirectangulaire), beaucoup plus rapide (il ne nécessite qu'une racine trigonométrique et une racine carrée).
Cette approximation est pertinente si vos points ne sont pas trop éloignés les uns des autres. Elle toujours surestimer par rapport à la distance haversine réelle. Par exemple, il ajoutera pas plus de 0,05382 %. à la distance réelle si le delta de latitude ou de longitude entre vos deux points ne dépasse pas 4 degrés décimaux .
La formule standard (Haversine) est la suivante exact (c'est-à-dire qu'il fonctionne pour tout couple de longitude/latitude sur la terre) mais est beaucoup plus lent car elle nécessite 7 trigonométries et 2 racines carrées. Si vos deux points ne sont pas trop éloignés l'un de l'autre, et que la précision absolue n'est pas primordiale, vous pouvez utiliser cette version approximative (Equirectangulaire), qui est beaucoup plus rapide car elle n'utilise qu'une trigonométrie et une racine carrée.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
Vous pouvez optimiser encore davantage soit par :
-
Suppression de la racine carrée si vous comparez simplement la distance à une autre (dans ce cas, comparez les deux distances au carré) ;
-
Factorisation du cosinus si vous calculez la distance d'un point maître à plusieurs autres (dans ce cas, vous faites la projection équirectangulaire centrée sur le point maître, de sorte que vous pouvez calculer le cosinus une fois pour toutes les comparaisons).
Pour plus d'informations, voir : http://www.movable-type.co.uk/scripts/latlong.html
Il existe une belle implémentation de référence de la formule de Haversine en plusieurs langues à l'adresse suivante : http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe