在代码中使用以下等式

时间:2013-07-26 12:18:39

标签: ios objective-c math

在我的应用程序中,我想计算具有纬度和经度的两个点之间的距离。我设法从这个网站(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应该是最终结果。

3 个答案:

答案 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)

sinfcosf例程的输入以弧度为单位。在调用它们之前,必须将角度从度数转换为弧度。为此,将角度乘以π/180º。

答案 2 :(得分:2)

纬度和经度(最有可能)以十进制度给出,例如52.09878和10.897934。但是sinf等函数使用了辐射。

尝试将distanceLongitudedistanceLatitude转换为radiants,然后继续使用= ...

radiantLongitudeDistance = degreeLongitudeDistance * M_PI / 180.0