我很难把这件事办好。我尝试了许多不同的公式,结果总是一样。根据相同的数据(坐标),我可以计算距离。但不是方位。我用尽了所有的想法和关键词来找到一个可行的公式。
谢谢大家的帮助!
let fLat = d2r(degrees: lat)
let fLng = d2r(degrees: long)
let tLat = d2r(degrees: lat2)
let tLng = d2r(degrees: long2)
let a = CGFloat(sin(fLng - tLng) * cos(tLat))
let b = CGFloat(cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(fLng-tLng))
let bearing = atan2(a,b)
func d2r(degrees : Double) -> Double {
return degrees * Double.pi / 180.0
}发布于 2018-03-03 17:39:08
考虑到注释中的示例,您似乎只会遇到一个符号错误:
CYWG =N 49 54 6 W097 14 4,CYYQ = N58 44 4 W094 03 9,我应该有一个11度的正标题。
let lat = 49.0 + 54.0 / 60.0 + 6.0 / 3600.0
let long = -(97.0 + 14.0 / 60.0 + 4.0 / 3600.0)
let lat2 = 58.0 + 44.0 / 60.0 + 4.0 / 3600.0
let long2 = -(94.0 + 3.0 / 60.0 + 9.0 / 3600.0)
let fLat = d2r(degrees: lat)
let fLng = d2r(degrees: long)
let tLat = d2r(degrees: lat2)
let tLng = d2r(degrees: long2)
let a = sin(fLng - tLng) * cos(tLat)
let b = cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(fLng - tLng)
let bearing = atan2(a,b)
bearing * 180.0 / Double.pi // -10.58473709161037所以你的代码的答案是~ -11。用我自己的文森蒂公式实现检查,得到精确的方位角
let (d, az, raz) = vincentyInverse(p1, to: p2, ellipsoid: .wgs84)
az.toDegrees // 10.61078843895496因此,看起来你的公式的所有错误就是从tLng中减去了fLng,而不是反之亦然。在您使用fLng - tLng的两个地方用tLng - fLng替换它,您将得到10.58的答案。
当然,如果你想要精确的轴承,你应该使用Vincenty或Robbins或者其他考虑地球非球面形状的公式--你使用的公式只有在一个完美的球体上才是准确的.
发布于 2018-03-09 11:27:10
非常感谢格里姆森。我对这个很有信心。我也能够回答我的最后一个问题。
if bearing < 0 {
HeadingHolder = (bearing * 180.0 / Double.pi) + 360
}else{
HeadingHolder = (bearing * 180.0 / Double.pi)
}https://stackoverflow.com/questions/49077548
复制相似问题