首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DMS计算轴承

用DMS计算轴承
EN

Stack Overflow用户
提问于 2018-03-02 21:16:16
回答 2查看 650关注 0票数 0

我很难把这件事办好。我尝试了许多不同的公式,结果总是一样。根据相同的数据(坐标),我可以计算距离。但不是方位。我用尽了所有的想法和关键词来找到一个可行的公式。

谢谢大家的帮助!

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-03 17:39:08

考虑到注释中的示例,您似乎只会遇到一个符号错误:

CYWG =N 49 54 6 W097 14 4,CYYQ = N58 44 4 W094 03 9,我应该有一个11度的正标题。

代码语言:javascript
复制
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。用我自己的文森蒂公式实现检查,得到精确的方位角

代码语言:javascript
复制
let (d, az, raz) = vincentyInverse(p1, to: p2, ellipsoid: .wgs84)
az.toDegrees // 10.61078843895496

因此,看起来你的公式的所有错误就是从tLng中减去了fLng,而不是反之亦然。在您使用fLng - tLng的两个地方用tLng - fLng替换它,您将得到10.58的答案。

当然,如果你想要精确的轴承,你应该使用Vincenty或Robbins或者其他考虑地球非球面形状的公式--你使用的公式只有在一个完美的球体上才是准确的.

票数 0
EN

Stack Overflow用户

发布于 2018-03-09 11:27:10

非常感谢格里姆森。我对这个很有信心。我也能够回答我的最后一个问题。

代码语言:javascript
复制
        if bearing < 0 {
      HeadingHolder = (bearing * 180.0 / Double.pi) + 360
    }else{
       HeadingHolder = (bearing * 180.0 / Double.pi)
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49077548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档