vincenty
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 包管理器
let package = Package(
dependencies: [
.package(url: "https://github.com/dastrobu/vincenty.git", from: "1.1.0"),
]
)
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))