iOS中的大圆距离公式

Posted

技术标签:

【中文标题】iOS中的大圆距离公式【英文标题】:Great Circle Distance Formula in iOS 【发布时间】:2015-11-24 11:29:57 【问题描述】:

我需要使用大圆公式计算纬度和经度之间的距离。

我知道的一种方法是使用以下方法:

 CLLocation *locA = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];

 CLLocation *locB = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2];

 CLLocationDistance distance = [locA distanceFromLocation:locB];

但是,我不确定它是否使用大圆距离算法进行计算。有人对此有任何想法吗?非常感谢您的帮助。

【问题讨论】:

谷歌地图使用大圆距离公式,苹果按照地球曲率公式求距离 【参考方案1】:

distanceFromLocation: 的文档很清楚:

此方法通过追踪它们之间的一条沿地球曲率的线来测量两个位置之间的距离。生成的弧线是一条平滑曲线,没有考虑两个位置之间的特定高度变化。

是的,这是Great Circle Distance 算法。

【讨论】:

【参考方案2】:
+ (CGFloat)directMetersFromCoordinate:(CLLocationCoordinate2D)from toCoordinate:(CLLocationCoordinate2D)to 

static const double DEG_TO_RAD = 0.017453292519943295769236907684886;  
static const double EARTH_RADIUS_IN_METERS = 6372797.560856;  

double latitudeArc  = (from.latitude - to.latitude) * DEG_TO_RAD;
double longitudeArc = (from.longitude - to.longitude) * DEG_TO_RAD;
double latitudeH = sin(latitudeArc * 0.5);
latitudeH *= latitudeH;
double lontitudeH = sin(longitudeArc * 0.5);
lontitudeH *= lontitudeH;
double tmp = cos(from.latitude*DEG_TO_RAD) * cos(to.latitude*DEG_TO_RAD);
return EARTH_RADIUS_IN_METERS * 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH));

来源:Distance between two points on Globe

【讨论】:

以上是关于iOS中的大圆距离公式的主要内容,如果未能解决你的问题,请参考以下文章

大圆距离公式:T-SQL

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。