CLLocation`distanceFromLocation:`考虑了地球的椭球形状

时间:2012-09-14 15:21:40

标签: cllocation cllocationdistance

我似乎无法在Docs描述中看到它,但有人知道上述方法是否考虑了地球的椭球形状或是否基于球形?

我认为确实如此,我只需要知道!

提前致谢。

2 个答案:

答案 0 :(得分:0)

是的,看来CLLocation.distance(from:)确实使用了某种椭圆形地球模型

使用此Swift代码

func testRadius(lat1: CLLocationDegrees, lon1: CLLocationDegrees, lat2: CLLocationDegrees, lon2: CLLocationDegrees, angularDistance: CLLocationDegrees) {
    let loc1 = CLLocation(latitude: lat1, longitude: lon1)
    let loc2 = CLLocation(latitude: lat2, longitude: lon2)
    
    let angularDistanceRadians = angularDistance * .pi / 180
    let meterDistance = loc2.distance(from: loc1)
    let earthRadius = meterDistance / angularDistanceRadians  // assumes circle!
    
    func coordAsString(_ loc: CLLocation) -> String {
        "(\(loc.coordinate.latitude), \(loc.coordinate.longitude))"
    }
    
    print(earthRadius, coordAsString(loc1), coordAsString(loc2))
}


// Meridians at longitudes 0°, 90°, 180° and -90°. Poles aren't well-behaved, thus ±89° instead of ±90°
testRadius(lat1: -89, lon1:   0, lat2:  89, lon2:   0, angularDistance: 178)
testRadius(lat1: -89, lon1:  90, lat2:  89, lon2:  90, angularDistance: 178)
testRadius(lat1: -89, lon1: 180, lat2:  89, lon2: 180, angularDistance: 178)
testRadius(lat1: -89, lon1: -90, lat2:  89, lon2: -90, angularDistance: 178)

// Equator from longitudes 0° to 180° and from 90° to -90°
testRadius(lat1:   0, lon1:   0, lat2:   0, lon2: 180, angularDistance: 180)
testRadius(lat1:   0, lon1:  90, lat2:   0, lon2: -90, angularDistance: 180)

您可以沿着一些子午线和赤道测试地球的半径。这导致:

6367088.045696135 (-89.0, 0.0) (89.0, 0.0)
6367088.045696135 (-89.0, 90.0) (89.0, 90.0)
6367088.045696135 (-89.0, 180.0) (89.0, 180.0)
6367088.045696135 (-89.0, -90.0) (89.0, -90.0)
6378137.000000001 (0.0, 0.0) (0.0, 180.0)
6378137.000000001 (0.0, 90.0) (0.0, -90.0)

因此,赤道半径为6,378,137> m ,并且-因为我们在此处使用pi和弧度,而不是椭圆偏心率的“周长因子”(我们不知道),所以- strong>“平均纵向”半径约为6,367,088 m 。

这些与也在GPS中使用的常用参考椭球WGS-84相匹配,这很有意义,因为CoreLocation是访问iPhone GPS数据的API。

答案 1 :(得分:-1)

您是否阅读了参考文献?

  

此方法通过跟踪测量两个位置之间的距离   它们之间的一条线跟随地球的曲率。该   产生的弧线是一条平滑的曲线并没有考虑在内   两个地点之间的特定高度变化。