iOS根據兩點經緯度座標計算指南針方位角

Dast1發表於2023-01-10

需求

在地圖導航時,始終保持當前路段豎直超前。

設計

因地圖暴露的方法中只有設定地圖相對於正北的方向角的方法。因此,需要實現“根據兩點經緯度座標計算指南針方位角”的演算法,這樣在每次切換路段時,呼叫演算法計算新路段指南針方位角,然後設定地圖相對於正北的方向角即可實現需求。
示意圖如下:
截圖2023-01-10 15.57.34

演算法實現原理詳見文末引用。下面貼出基於 OC 語言的程式碼實現。

程式碼實現

新建CLLocation 分類方法

#import <CoreLocation/CoreLocation.h>

+ (double)ca_getCompassAngleFromCoor1:(CLLocationCoordinate2D)coor1 coor2:(CLLocationCoordinate2D)coor2 {
    double long1 = coor1.longitude;
    double lat1 = coor1.latitude;
    double long2 = coor2.longitude;
    double lat2 = coor2.latitude;
         
    double φ1 = [CLLocation toRadius:lat1];
    double φ2 = [CLLocation toRadius:lat2];
    double Δλ = [CLLocation toRadius:(long2 - long1)];
    
    double x = cos(φ1) * sin(φ2) - sin(φ1) * cos(φ2) * cos(Δλ);
    double y = sin(Δλ) * cos(φ2);
    double θ = atan2(y, x);
    
    double bearing = [CLLocation toDegrees:θ];
    return bearing;
}

+ (double)toDegrees:(double)radius {
    return radius * 180.0 / M_PI;
}

+ (double)toRadius:(double)degree {
    return degree * M_PI / 180.0;
}

呼叫示例

double bearing = [CLLocation ca_getCompassAngleFromCoor1:(CLLocationCoordinate2DMake(20, 20)) coor2:(CLLocationCoordinate2DMake(20, 140))];
NSLog(@"bearing:%.2f", bearing);
//設定地圖方位角...

結論

經測試,上面演算法可以滿足需求,且效果正確!

https://www.movable-type.co.uk/scripts/latlong.html

相關文章