微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

寻找朝向坐标的方向

如何解决寻找朝向坐标的方向

我有我的位置(坐标)和航向(罗盘),并正在尝试计算朝着给定其他坐标的航向,以便可以在屏幕上显示指向该位置的箭头。我正在构建的基本上是一个荣耀的罗盘,它并不指向北,而是指向特定的坐标,因此它需要考虑到该坐标的方位角和用户的指南针方向。

我期望CoreLocation包含必要的构造块,但是除了获得两个坐标之间的距离之外,似乎没有任何东西。

不幸的是,我手动计算的尝试并未取得丰硕的成果,很难猜测出我要去哪里了。此后,我一直尝试改编我发现的here,并且在那里的示例数据得到相同的结果,但是一旦使用我自己的坐标,它就会完全出错。

extension Double {
    var radians: Double {
        self * .pi / 180
    }
}


let A = CLLocationCoordinate2D(latitude: 51.0295437,longitude: 13.7277793)
let B = CLLocationCoordinate2D(latitude: 51.026819,longitude: 13.726348)

let ΔL = abs(A.longitude) - abs(B.longitude)
let X = cos(B.latitude.radians) * sin(ΔL.radians)
let Y = cos(A.latitude.radians) * sin(B.latitude.radians) - sin(A.latitude.radians) * cos(B.latitude.radians) * cos(ΔL.radians)
let bearing = atan2(X,Y)
let heading = bearing - userheading

一旦我将设备的标题并入其中(末尾减去),就好像我的值沿WE轴(以左而不是右,反之亦然)翻转了,但NS轴似乎是正确的。轴承的计算必须以某种方式关闭。 我真的对地理坐标系不了解。

解决方法

让我们这样尝试。首先,我需要建立一些转换:

extension Double {
    var toRadians : Double {
        var m = Measurement(value: self,unit: UnitAngle.degrees)
        m.convert(to: .radians)
        return m.value
    }
    var toDegrees : Double {
        var m = Measurement(value: self,unit: UnitAngle.radians)
        m.convert(to: .degrees)
        return m.value
    }
}

现在,我将公式化; a是我的位置,b是我想要的方位的远点:

let a = // some CLLocationCoordinate2D
let b = // some CLLocationCoordinate2D

let deltaL = b.longitude.toRadians - a.longitude.toRadians
let thetaB = b.latitude.toRadians
let thetaA = a.latitude.toRadians
let x = cos(thetaB) * sin(deltaL)
let y = cos(thetaA) * sin(thetaB) - sin(thetaA) * cos(thetaB) * cos(deltaL)
let bearing = atan2(x,y)
let bearingInDegrees = bearing.toDegrees
print(bearingInDegrees) // sanity check

现在,我将测试一些实际的轴承。我将给出ab,然后给出打印的内容(bearingInDegrees)。我将从获取公式的页面开始:

let a = CLLocationCoordinate2D(latitude: 39.099912,longitude: -94.581213)
let b = CLLocationCoordinate2D(latitude:  38.627089,longitude: -90.200203)
// 96.51262423499941,yep,that's the answer given on example page

好的,那行得通。现在,我将尝试一下自己,并从各个方向尝试一些要点:

let a = CLLocationCoordinate2D(latitude: 34.439931,longitude: -119.263984)
let b = CLLocationCoordinate2D(latitude: 34.489290,longitude: -119.221670)
// 35 degrees,about right

let a = CLLocationCoordinate2D(latitude: 34.439931,longitude: -119.263984)
let b = CLLocationCoordinate2D(latitude: 34.484479,longitude: -119.308273)
// -40 degrees,about right
        
let a = CLLocationCoordinate2D(latitude: 34.439931,longitude: -119.263984)
let b = CLLocationCoordinate2D(latitude: 34.376978,longitude: -119.329645)
// -139,about right

好的,让我们在经度值为正的其他位置尝试一下:

let a = CLLocationCoordinate2D(latitude: 52.518044,longitude: 13.374602) // Berlin
let b = CLLocationCoordinate2D(latitude: 53.444748,longitude: 14.534668) // Szczecin
// 36,looks good to me

好!现在,让我们填写难题的最后一部分,即给定我实际面对的方位。我认为是度数,所以让我们继续使用度数。我将以最后的结果为例。我在柏林,但现在正对东方。将我的设备顶部设为零。针应该指向哪个角度才能指向什切青?

let myHeading = 90.0 // (I'm facing east)
let bearingFromMe = bearingInDegrees - myHeading
print(bearingFromMe) // -53,sounds good

-53表示向前和向左。果然,我正对着东方,这就是我们想要去的方向。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。