vincenty

Swift Version Platform Build

Swift 中用于解决逆大地测量问题的求解器。

逆大地测量问题必须被解决,才能计算扁球面(或更广义的椭球体)上两点之间的距离。 这里不进一步考虑推广到非扁球面椭球体的情况,因此“椭球体”一词将与“扁球面”同义使用。

两点之间的距离也称为 Vincenty 距离

这是一个计算 WGS 84 椭球体上两点(在本例中为两极)之间距离的示例。

import vincenty
let d = try distance((lat: Double.pi / 2,lon: 0), (lat: -Double.pi / 2, lon: 0))

计算方位角(也称为初始和最终方向角)

let (d, (a, b)) = try solveInverse((lat: Double.pi / 2,lon: 0), (lat: -Double.pi / 2, lon: 0))

其中 (a, b) 是方位角。

目录

安装

依赖项

至少需要 clang-3.6。在 Linux 上可能需要显式安装它。 在 macOS 上没有依赖项。

Swift Package Manager

let package = Package(
    dependencies: [
        .package(url: "https://github.com/dastrobu/vincenty.git", from: "1.1.2"),
    ]
)

Cocoa Pods

确保在 Podfile 中设置了有效的部署目标并添加

pod 'vincenty', '~> 1'

实现细节

这是 Vincenty 公式的一个简单实现。 它不是最准确或最稳定的算法,但是易于实现。 有更复杂的实现,例如,参见 geodesic

收敛性和容差

收敛性和结果的准确性可以通过两个参数来控制。

try distance((lat: 0,lon: 0), (lat: 0, lon: 0), tol: 1e-10, maxIter: 200)

WGS 84 和其他椭球体

默认情况下,使用 WGS 84 椭球体,但可以指定不同的参数,例如 GRS 80 椭球体

try distance((lat: Double.pi / 2, lon: 0), (lat: -Double.pi / 2, lon: 0), 
             ellipsoid (a: 6378137.0, f: 1/298.257222100882711))