计算Swift中两个CLLocation点之间的方位

我试图计算两个CLLocation点之间的方式在快速唯一的代码。 我遇到了一些困难,并认为这是一个非常简单的function。 堆栈溢出似乎没有列出任何东西。

func d2r(degrees : Double) -> Double { return degrees * M_PI / 180.0 } func RadiansToDegrees(radians : Double) -> Double { return radians * 180.0 / M_PI } func getBearing(fromLoc : CLLocation, toLoc : CLLocation) { let fLat = d2r(fromLoc.coordinate.latitude) let fLng = d2r(fromLoc.coordinate.longitude) let tLat = d2r(toLoc.coordinate.latitude) let tLng = d2r(toLoc.coordinate.longitude) var a = CGFloat(sin(fLng-tLng)*cos(tLat)); var b = CGFloat(cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(fLng-tLng)) return atan2(a,b) } 

我得到一个关于左值cgfloat的atan2调用错误…

这是一个Objective-C解决scheme

  • 用于计算带有半阴茎function的轴承的CL位置类别

它可以很容易地转换成Swift:

 func degreesToRadians(degrees: Double) -> Double { return degrees * .pi / 180.0 } func radiansToDegrees(radians: Double) -> Double { return radians * 180.0 / .pi } func getBearingBetweenTwoPoints1(point1 : CLLocation, point2 : CLLocation) -> Double { let lat1 = degreesToRadians(degrees: point1.coordinate.latitude) let lon1 = degreesToRadians(degrees: point1.coordinate.longitude) let lat2 = degreesToRadians(degrees: point2.coordinate.latitude) let lon2 = degreesToRadians(degrees: point2.coordinate.longitude) let dLon = lon2 - lon1 let y = sin(dLon) * cos(lat2) let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon) let radiansBearing = atan2(y, x) return radiansToDegrees(radians: radiansBearing) } 

结果types是Double因为这是所有位置坐标的存储方式( CLLocationDegreesDouble的types别名)。

这并不完全准确,但是您可能正在寻找以下内容:

 func XXRadiansToDegrees(radians: Double) -> Double { return radians * 180.0 / M_PI } func getBearingBetweenTwoPoints(point1 : CLLocation, point2 : CLLocation) -> Double { // Returns a float with the angle between the two points let x = point1.coordinate.longitude - point2.coordinate.longitude let y = point1.coordinate.latitude - point2.coordinate.latitude return fmod(XXRadiansToDegrees(atan2(y, x)), 360.0) + 90.0 } 

我挪用了这篇NSHipster文章中的代码,详细介绍了这个问题。 基本的问题是,它使用的坐标,好像世界是平坦的(这是不是,对吧?)。 Mattt的文章可以告诉你如何使用MKMapPoint而不是CLLocation来获得真正的方向。