iOS根据两点经纬度坐标计算指南针方位角
需求
在地图导航时,始终保持当前路段竖直超前。
设计
因地图暴露的方法中只有设置地图相对于正北的方向角的方法。因此,需要实现“根据两点经纬度坐标计算指南针方位角”的算法,这样在每次切换路段时,调用算法计算新路段指南针方位角,然后设置地图相对于正北的方向角即可实现需求。
示意图如下:

算法实现原理详见文末引用。下面贴出基于 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);
//设置地图方位角...
结论
经测试,上面算法可以满足需求,且效果正确!
iOS根据两点经纬度坐标计算指南针方位角的更多相关文章
- java 根据经纬度坐标计算两点的距离算法
/** * @Desc 根据经纬度坐标计算两点的距离算法<br> * @Author yangzhenlong <br> * @Data 2018/5/9 18:38 */ p ...
- 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ
通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ...
- Java 根据两个经纬度坐标计算距离
public class Distance{ private static final double EARTH_RADIUS = 6378137; private static double ...
- 通过两个位置的经纬度坐标计算距离(C#版本)
/// <summary> /// 通过地图上的两个坐标计算距离(C#版本) /// Add by 成长的小猪(Jason.Song) on 2017/11/01 /// http://b ...
- 根据经纬度坐标计算距离-python
一.两个坐标之间距离计算 参考链接: python实现 1.Python 根据地址获取经纬度及求距离 2.python利用地图两个点的经纬度计算两点间距离 LBS 球面距离公式 美团app筛选“离我最 ...
- PHP 根据两点的坐标计算之间的距离
define('PI',3.1415926535898); define('EARTH_RADIUS',6378.137); //计算范围,可以做搜索用户 function GetRange($lat ...
- 用墨卡托和GPS坐标计算距离时误差测试
iOS墨卡托和GPS坐标计算距离时误差测试,测试结果: 墨卡托和gps坐标来回转换没有误差. 墨卡托坐标计算出的距离比gps坐标计算出的距离大,100/92*100 = 108米,每100米多算出8米 ...
- mysql 下 计算 两点 经纬度 之间的距离(转)
公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2* ...
- mysql 下 计算 两点 经纬度 之间的距离
公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2* ...
- mysql 下 计算 两点 经纬度 之间的距离 计算结果排序
根据经纬度计算距离公式 公式 对上面的公式解释如下: Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung ...
随机推荐
- 【C++】GoogleTest进阶之gMock
gMock是什么 当我们去写测试时,有些测试对象很单纯简单,例如一个函数完全不依赖于其他的对象,那么就只需要验证其输入输出是否符合预期即可. 但是如果测试对象很复杂或者依赖于其他的对象呢?例如一个函数 ...
- Linux 文件操作接口
目录 Linux 文件操作接口 C语言文件操作接口 C语言文件描述 fopen() r模式打开文件 w模式打开文件 a模式打开文件 其他模式类似 fclose() fwrite() fread() 系 ...
- day12-Servlet02
Servlet02 6.GET和POST请求的分发处理 开发Servlet,通常编写doGet,doPost方法.来对表单的get和post请求进行分发处理 例子 在web文件夹下面创建一个html页 ...
- 2022ICPC区域赛参后感悟
第一次参加正式的大类赛事,在某种程度上挺激动的.我呢,可以说是刚步入竞赛一年,在此期间遇见了一些志同道合的朋友,最重要的是遇见了我的队友. 开始前,我幻想过我们小队可以超常发挥,拿取学校中第一个区域赛 ...
- 5种GaussDB ETCD服务异常实例分析处理
摘要:一文带你细数几种ETCD服务异常实例状态. 本文分享自华为云社区<[实例状态]GaussDB ETCD服务异常>,作者:酷哥 . 首先确认是否是虚拟机.网络故障 虚拟机故障导致ETC ...
- 记一次mybatis性能问题分析过程
说明 今天发现个2个问题,一是mybatisplus执行一条某个字段值比较长(约1.8M的文本)的INSERT语句耗时要90s+;二是读取这个1.8M文本返回给前端耗时6min.查查查查了半天搞不清楚 ...
- 系统内置APK并签名并配置AndroidStudio
前言 最近在集成内置APK的时候遇到了些问题,遂整理一份文档以记录. 一,APP内置进系统固件 将APK源码或编译出的apk文件放在package或vendor等目录下,并且编写相应的android, ...
- Codeforces Round #836 (Div. 2) A-D
比赛链接 A 题意 给一个字符串 \(s\) ,对其加倍,即每个字符后面追加一个相同字符. 加倍后可以重排列,要求构造一个回文串. 题解 知识点:构造. 既然可以重排列了,那顺序是随意的了,直接翻转加 ...
- 使用Python实现多线程、多进程、异步IO的socket通信
多线程实现socket通信服务器端代码 import socket import threading class MyServer(object): def __init__(self): # 初始化 ...
- 【每日一题】【小根堆&边出队边入队后续节点&注意判空】23. 合并K个升序链表-211128/220213
给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 答案1(参数是数组): /** * Definition for singly-linked li ...