1

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

4

3 回答 3

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 它只是一个浮点类型定义,距离变量的值将以米为单位。

于 2013-07-26T12:24:08.393 回答
3

sinf和例程的输入以cosf弧度表示。在调用它们之前,您必须将角度从度数转换为弧度。为此,请将角度乘以 π/180º。

于 2013-07-26T12:26:54.087 回答
2

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

尝试将您的distanceLongitude和转换distanceLatitude为辐射,然后继续使用 = ...

radiantLongitudeDistance = degreeLongitudeDistance * M_PI / 180.0 
于 2013-07-26T12:27:21.110 回答