Jeef - 1 year ago 131

iOS Question

I'm trying to calculate a bearing between two CLLocation points in swift-only code. I've run into some difficulty and was assuming this is a pretty simple function. Stack overflow didn't seem to have anything listed.

`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)

}

I'm getting an error with my atan2 call about lvalue cgfloat or something...

Answer Source

Here is an Objective-C solution

which can easily be translated to Swift:

```
func degreesToRadians(degrees: Double) -> Double { return degrees * M_PI / 180.0 }
func radiansToDegrees(radians: Double) -> Double { return radians * 180.0 / M_PI }
func getBearingBetweenTwoPoints1(point1 : CLLocation, point2 : CLLocation) -> Double {
let lat1 = degreesToRadians(point1.coordinate.latitude)
let lon1 = degreesToRadians(point1.coordinate.longitude)
let lat2 = degreesToRadians(point2.coordinate.latitude)
let lon2 = degreesToRadians(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(radiansBearing)
}
```

The result type is `Double`

because that is how all location coordinates are
stored (`CLLocationDegrees`

is a type alias for `Double`

).