2011-07-09 3 views
0

Je travaille sur un outil qui trouvera la position de latitude/longitude la plus proche d'une liste par rapport à l'emplacement actuel de l'utilisateur. La liste sera assez longue, et elle fonctionnera sur un téléphone intelligent, donc je voudrais faire les calculs aussi simple et rapide que possible. D'après les discussions que j'ai lues, calculer une distance assez précise entre deux emplacements de latitude/longitude est un peu compliqué, et je m'inquiète de la vitesse. Ma question est, puis-je utiliser quelque chose de similaire à ce qui suit pour obtenir un résultat raisonnable pour la position de liste la plus proche et l'utiliser?Latitude/Longitude distance question

$distance = sqrt((($firstLongitude-$secondLongitude)*($firstLongitude-$secondLongitude))+(($firstlLatitude-$secondLatitude)*($firstLatitude-$secondLatitude))); 

Je sais que l'exemple est en PHP, mais la logique devrait être évidente. Donc ma question est, va utiliser la logique ci-dessus pour déterminer l'emplacement le plus proche de l'utilisateur à partir d'une liste de lat/long endroits me donner des résultats corrects, ou y at-il un problème potentiel que je suis manquant?

Cette application ne fonctionne que pour les emplacements aux États-Unis, si cela fait une différence.

NOTE: Je me demandais aussi si je pouvais encore simplifier cela et laisser tomber la partie sqrt car je veux juste voir qui est le plus proche, et non pas comment il est proche.

Répondre

1

Non, Le résultat ne sera pas correct. Le résultat suppose que ces lat/long sont des points normaux mais en réalité ce sont des degrés. Vous devez donc prendre cela en compte dans les calculs.

Utilisez la formule suivante. formules arithmétiques ne sont pas si lourd que comparer à des réseaux ou des activités UI

$1 = lat1 
$2 = long1 
$3 = lat2 
$4 = long2 

case when 
($1 = $3 and $2 = $4) then 0 
else 1609.344 * 60 * 1.1515 * (180/pi()) * acos(sin($1 * pi()/180) * sin($3 * pi()/180) + cos($1 * pi()/180) * cos($3 * pi()/180) * cos(($2 - $4) * pi()/180)) 
4

Voici est exacte si les points sont à 10000 km de chaque autre et si la terre est supposée être sphérique. Utilisez d2 si vous juste voulez comparer les distances. la distance est la distance approximative en km.

deg = pi/180; 
phi1 = lat1 * deg; 
phi2 = lat2 * deg; 
lam12 = (lon2 - lon1) * deg; 

d2 = (cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam12))^2 
+ (cos(phi2) * sin(lam12))^2; 

a = 6371.009; // kilometers 
distance = a * asin(sqrt(d2)); 

Pour plus de précision, vous devez traiter la Terre comme un ellipsoïde; voir ma calculatrice géodésique en ligne au http://geographiclib.sf.net/cgi-bin/Geod et l'écriture à http://arxiv.org/abs/1102.1215.