Это «улучшение» вышеупомянутого решения.Это добавляет информацию о высоте.Кажется, что высота, которую возвращает яблоко, - в метрах.Не подходит для полета или орбиты или тому подобного, но сработает, если кто-то находится на 15 этажах прямо над другим человеком, на соседней горе и т. Д. Не прошел тщательного тестированияПредполагается, что вы не заботитесь о высоте для чего-то более 20 км.Затем он корректирует высоту, когда вы находитесь ближе к другому человеку.Таким образом, для двух человек на расстоянии 20 метров друг от друга, но на 100 метров выше, вы получите расстояние около 102 метров.Прямо в конце я переключаюсь на км для возвращения.Также обнаружена ошибка в исходном коде.
#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
}