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 上没有依赖项。
let package = Package(
dependencies: [
.package(url: "https://github.com/dastrobu/vincenty.git", from: "1.1.2"),
]
)
确保在 Podfile 中设置了有效的部署目标并添加
pod 'vincenty', '~> 1'
这是 Vincenty 公式的一个简单实现。 它不是最准确或最稳定的算法,但是易于实现。 有更复杂的实现,例如,参见 geodesic。
收敛性和结果的准确性可以通过两个参数来控制。
try distance((lat: 0,lon: 0), (lat: 0, lon: 0), tol: 1e-10, maxIter: 200)
默认情况下,使用 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))