在我的应用程序中,我想计算具有纬度和经度的两个点之间的距离。我设法从这个网站(http://andrew.hedges.name/experiments/haversine/)得到用于计算它的方程式,这里是方程式:
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2( sqrt(a), sqrt(1-a) )
d = R * c (where R is the radius of the Earth
所以我将它们翻译为代码,这里是:
float distanceLongitude = lon2 - lon1;
float distanceLatitude = lat2 - lat1;
float a = powf(sinf((distanceLatitude/2)), 2) + cosf(lat1) * cosf(lat2) * powf((sinf(distanceLongitude/2)),2);
float c = 2 * atan2f(sqrtf(a), sqrtf(1-a));
float d = 6373 * c; //6373 radius of earth
我尝试使用以下坐标的代码: lat1 = 33.854025 lon1 = 35.506923 lat2 = 33.856835 lon2 = 35.506324
根据网站,结果是0.317公里或0.197英里。但是,我的代码输出给了我18.143757。我怎么能解决这个问题? (请检查网站上的转换器,了解我在说什么。注意:d应该是最终结果。
答案 0 :(得分:4)
为什么不使用Apple API计算此距离?您可以执行以下操作:
CLLocation *locA = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];
CLLocation *locB = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2];
CLLocationDistance distance = [locA distanceFromLocation:locB];
请注意,CLLLocationDistance它只是float的typedef,而distance变量的值是以米为单位。
答案 1 :(得分:3)
sinf
和cosf
例程的输入以弧度为单位。在调用它们之前,必须将角度从度数转换为弧度。为此,将角度乘以π/180º。
答案 2 :(得分:2)
纬度和经度(最有可能)以十进制度给出,例如52.09878和10.897934。但是sinf等函数使用了辐射。
尝试将distanceLongitude
和distanceLatitude
转换为radiants,然后继续使用= ...
radiantLongitudeDistance = degreeLongitudeDistance * M_PI / 180.0