经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS根据两点经纬度坐标计算指南针方位角
来源:cnblogs  作者:Dast1  时间:2023/1/11 8:40:34  对本文有异议

需求

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

设计

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

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

代码实现

新建CLLocation 分类方法

  1. #import <CoreLocation/CoreLocation.h>
  2. + (double)ca_getCompassAngleFromCoor1:(CLLocationCoordinate2D)coor1 coor2:(CLLocationCoordinate2D)coor2 {
  3. double long1 = coor1.longitude;
  4. double lat1 = coor1.latitude;
  5. double long2 = coor2.longitude;
  6. double lat2 = coor2.latitude;
  7. double φ1 = [CLLocation toRadius:lat1];
  8. double φ2 = [CLLocation toRadius:lat2];
  9. double Δλ = [CLLocation toRadius:(long2 - long1)];
  10. double x = cos1) * sin2) - sin1) * cos2) * cos(Δλ);
  11. double y = sin(Δλ) * cos2);
  12. double θ = atan2(y, x);
  13. double bearing = [CLLocation toDegrees:θ];
  14. return bearing;
  15. }
  16. + (double)toDegrees:(double)radius {
  17. return radius * 180.0 / M_PI;
  18. }
  19. + (double)toRadius:(double)degree {
  20. return degree * M_PI / 180.0;
  21. }

调用示例

  1. double bearing = [CLLocation ca_getCompassAngleFromCoor1:(CLLocationCoordinate2DMake(20, 20)) coor2:(CLLocationCoordinate2DMake(20, 140))];
  2. NSLog(@"bearing:%.2f", bearing);
  3. //设置地图方位角...

结论

经测试,上面算法可以满足需求,且效果正确!

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

原文链接:https://www.cnblogs.com/Dast1/p/17041011.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号