前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS根据两点经纬度坐标计算指南针方位角

iOS根据两点经纬度坐标计算指南针方位角

原创
作者头像
woopDast1
发布2023-01-10 17:57:42
8630
发布2023-01-10 17:57:42
举报
文章被收录于专栏:iOSer

需求

在地图导航时,始终保持当前路段竖直超前。

设计

因地图暴露的方法中只有设置地图相对于正北的方向角的方法。因此,需要实现“根据两点经纬度坐标计算指南针方位角”的算法,这样在每次切换路段时,调用算法计算新路段指南针方位角,然后设置地图相对于正北的方向角即可实现需求。

示意图如下:

截屏2023-01-10 15.57.34
截屏2023-01-10 15.57.34

算法实现原理详见文末引用。下面贴出基于 OC 语言的代码实现。

代码实现

新建CLLocation 分类方法

代码语言:swift
复制
#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;
}

调用示例

代码语言:swift
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 设计
  • 代码实现
    • 新建CLLocation 分类方法
      • 调用示例
      • 结论
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档