Ios 找到朝向坐标的方向

Ios 找到朝向坐标的方向,ios,swift,core-location,Ios,Swift,Core Location,我有我的位置(坐标)和方向(指南针),并试图计算朝向给定其他坐标的方向,以便我可以在屏幕上显示指向该位置的箭头。我正在构建的基本上是一个美化的指南针,它不指向北方,而是指向一个特定的坐标,所以它需要考虑指向该坐标的方位和用户的指南针航向 我希望CoreLocation包含必要的构建块,但是除了获得两个坐标之间的距离外,那里似乎没有任何东西 不幸的是,我的手动计算并没有取得很大的成效,很难猜测我错在哪里。后来我尝试调整我的发现,对那里的样本数据我得到了相同的结果,但一旦我使用自己的坐标,结果就完全

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

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

不幸的是,我的手动计算并没有取得很大的成效,很难猜测我错在哪里。后来我尝试调整我的发现,对那里的样本数据我得到了相同的结果,但一旦我使用自己的坐标,结果就完全错了

双分机{
弧度:双{
自*.pi/180
}
}
设A=CLLocationCoordinate2D(纬度:51.0295437,经度:13.7277793)
设B=CLLocationCoordinate2D(纬度:51.026819,经度:13.726348)
设ΔL=abs(A.经度)-abs(B.经度)
设X=cos(B纬度弧度)*sin(ΔL弧度)
设Y=cos(A.纬度.弧度)*sin(B.纬度.弧度)-sin(A.纬度.弧度)*cos(B.纬度.弧度)*cos(ΔL.弧度)
让轴承=atan2(X,Y)
设航向=方位-航向
一旦我将设备的标题合并到这个(末尾的减法)中,我的值似乎是沿着W-E轴翻转的(指向左侧而不是右侧,反之亦然),但N-s轴似乎是正确的。轴承的计算必须以某种方式进行。
我真的不太了解地理坐标系。

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

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
现在我将测试一些实际的方位。我将给出
a
b
,然后是打印的内容(
bearingdegrees
)。我将从我们从中获得公式的页面开始:

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
很好!现在让我们来填写拼图的最后一块,即我实际面对的方向。我以度为单位思考,所以让我们继续使用度。我将以最后一个结果为例。我在柏林,但现在我面向东方。将我的设备顶部呼叫零。针应该指向什么角度才能指向Szczecin

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

-53
表示向前和向左。没错,我正朝东,所以这就是我们要去的方向。

我想你已经将
userHeading
转换成弧度了?我已经转换了,是的。在这里计算之后,我使用了SwiftUI的
角度
类型,但是是的。你从哪里获得
用户标题
?这是属于
MKMapCamera
heading
属性中存储的值还是
CLLocationManager
实例的
heading
属性中存储的值?它是来自
CLLocationManager
的值。这些数值看起来绝对正确,并且显示了我的指南针航向。“这些数值看起来绝对正确,并且显示了我的指南针航向”那么到底是什么问题呢?我的意思是,基本上你只是想建立一个普通的罗盘,除了指针指向某个给定的方位,而不是零。建造一个普通的指南针很容易。你说你知道你想要的方位。你们都准备好了。我刚刚在一个小样本应用程序中复制了这个,一切似乎都正常。但这是。。。和我一直在做的一样,不是吗?我疯了吗?嗯,有一件事,你定义的ΔL
是完全错误的。-但这里的关键是我的方法论;(a) 我没有注意到你写的东西,(b)我做了很多心智测试。如果我做得对,那就是原因。我不能保证这是对的,但至少到目前为止我似乎得到了很多正确的答案。啊,你说得对。我一定要研究我解决问题的方法,一路上检查每件事听起来都很明智。再次感谢