Как рассчитать расстояние двух координат в объективе c?
Как заголовок как? Я пробовал код из Google Earth, но кажется, что результат отличается с результатом расчета карты Google. ниже предоставил код, который я сделал
-(double)GetDistance:(double)lat1 long1:(double)lng1 la2:(double)lat2 long2:(double)lng2 {
//NSLog(@"latitude 1:%.7f,longitude1:%.7f,latitude2:%.7f,longtitude2:%.7f",lat1,lng1,lat2,lng2);
double radLat1 = [self rad:lat1];
double radLat2 = [self rad:lat2];
double a = radLat1 - radLat2;
double b = [self rad:lng1] -[self rad:lng2];
double s = 2 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
s = s * EARTH_RADIUS;
s = round(s * 10000) / 10000;
return s;
}
-(double)rad:(double)d
{
return d *3.14159265 / 180.0;
}
значение EARTH_RADIUS составляет 6378,138
с помощью этой функции при условии двух координат результат составляет 4,5 км, но когда я использую карту Google, получаю направление между двумя одинаковыми координатами, он показывает мне, что расстояние составляет около 8 км.
Кто-нибудь может помочь указать на проблему моего кода?
5 ответов
Так как это тегированный iPhone, почему бы не использовать встроенную функцию расстояния вместо того, чтобы катить свою собственную? location1 и location2 являются объектами CLLocation.
CLLocationDistance distance = [location1 getDistanceFrom:location2];
Вот простой код (предположим, у вас есть только широта и долгота двух точек)
CLLocation *startLocation = [[CLLocation alloc] initWithLatitude:startLatitude longitude:startLongitude];
CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:endLatitude longitude:endLongitude];
CLLocationDistance distance = [startLocation distanceFromLocation:endLocation]; // aka double
Не забудьте добавить MapKit Framework в свой проект и импортировать MapKit в свой файл:
#import <MapKit/MapKit.h>
Карты Google, скорее всего, дадут вам проезжаемое расстояние, в то время как уравнение большого круга, которое вы перечислили, будет расстоянием от поверхности прямой линии. Если бы была прямая дорога с прямой линией непосредственно из точки А в точку Б, Google Карты, скорее всего, дали бы вам то же расстояние, что и уравнение, которое у вас есть.
Вы должны иметь возможность напрямую использовать API Google для расчета большого круга или расстояния вождения в зависимости от потребностей вашего приложения.
Увидеть GLatLong::distanceFrom
а также GDirections::getDistance
,
Поскольку
getDistanceFrom:
isDeprecated Попробуйте использовать
[newLocation distanceFromLocation:oldLocation