Ceci est un « improvment » à la solution ci-dessus. Il ajoute des informations d'altitude. Il semble que l'altitude que la pomme renvoie soit en mètres. Ne convient pas pour voler ou orbite ou comme cela, mais fonctionnera si quelqu'un est de 15 étages directement au-dessus de l'autre personne, sur une montagne à proximité, etc. Pas largement testé. Il suppose que vous ne vous souciez pas de l'altitude pour quelque chose de plus de 20 km. Il se nourrit ensuite d'une correction d'altitude lorsque vous êtes plus près de l'autre personne. Donc, pour deux personnes à 20 mètres l'une de l'autre, mais 100m plus haut, vous obtenez une distance d'environ 102 mètres. Juste à la fin je passe en km pour le retour. Aussi trouvé un bug nan dans le code original.
#define DEG2RAD(degrees) (degrees * 0.01745329251)
#define RADIUS_OF_EARTH 6371000.0
// km
+ (double)getDistanceFromStartCoords:(CLLocationCoordinate2D)start altStart:(double)altStart andEndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd;
{
double argument = (cos(DEG2RAD(start.latitude))*
cos(DEG2RAD(end.latitude))*
cos((-1*DEG2RAD(end.longitude))-
(-1*DEG2RAD(start.longitude)))) +
(sin(DEG2RAD(start.latitude))*
sin(DEG2RAD(end.latitude)));
double dist = 0.0;
if (argument < 1.0 && argument > -1.0) // acos will return nan for very small (0) distance
dist = acos(argument)*RADIUS_OF_EARTH;
// else
// NSLog(@"found bug, %f", acos(argument));
// Altitude hack.
// blend in an altitude correction (blend for smoothness)
// add in altitude difference
double altDiff = fabs(altStart - altEnd); // altdiff
double factor = 1.0 - dist/20000.0;
if (factor < 0.0)
factor = 0.0;
dist += sqrt(dist*dist + factor*altDiff*altDiff);
//NSLog(@"distance found, %f", dist);
return dist/1000.0; // return km
}
Je ne peux pas analyser votre question. Pourriez-vous ajouter de la ponctuation? – mik01aj