高德地图、百度地图以及CLLocationManager等地图的定位功能,从而得到的经纬度坐标会有些偏差,比如系统的CLLocationManager定位得到的是世界标准地理坐标(WGS-84)、高德SDK定位得到的是火星坐标(GCJ-02)、百度SDK定位得到的是百度地理坐标(BD-09),想要实现经纬度坐标的统一整合,就必须实现经纬度之间的转换。

  • 定义需要用到的经纬度转换算法的一些宏定义:
#define LAT_OFFSET_0(x,y) -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x))
#define LAT_OFFSET_1 (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0
#define LAT_OFFSET_2 (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0
#define LAT_OFFSET_3 (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0#define LON_OFFSET_0(x,y) 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x))
#define LON_OFFSET_1 (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0
#define LON_OFFSET_2 (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0
#define LON_OFFSET_3 (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0#define RANGE_LON_MAX 137.8347
#define RANGE_LON_MIN 72.004
#define RANGE_LAT_MAX 55.8271
#define RANGE_LAT_MIN 0.8293#define jzA 6378245.0
#define jzEE 0.00669342162296594323
  • 判断是否在中国
/**-  @brief  判断是否在中国-  -  @param  location    世界标准地理坐标(WGS-84)-  -  @return 中国国测局地理坐标(GCJ-02)<火星坐标>*/- (BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location {if (location.longitude < 72.004 || location.longitude > 137.8347 || location.latitude < 0.8293 || location.latitude > 55.8271) {return YES;} else {return NO;}
}
  • 世界标准地理坐标(WGS-84) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>
/**-  @brief  世界标准地理坐标(WGS-84) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>-  -  ####只在中国大陆的范围的坐标有效,以外直接返回世界标准坐标-  -  @param  location    世界标准地理坐标(WGS-84)-  -  @return 中国国测局地理坐标(GCJ-02)<火星坐标>*/- (CLLocationCoordinate2D)WGS84ToGCJ02:(CLLocationCoordinate2D)location {return [self GCJ02Encrypt:location.latitude BDLon:location.longitude];
}- (CLLocationCoordinate2D)GCJ02Encrypt:(double)ggLat BDLon:(double)ggLon
{CLLocationCoordinate2D resPoint;double mgLat;double mgLon;if ([self outOfChina:ggLat BDLon:ggLon]) {resPoint.latitude = ggLat;resPoint.longitude = ggLon;return resPoint;}double dLat = [self transformLat:(ggLon - 105.0)BDLon:(ggLat - 35.0)];double dLon = [self transformLon:(ggLon - 105.0) BDLon:(ggLat - 35.0)];double radLat = ggLat / 180.0 * M_PI;double magic = sin(radLat);magic = 1 - jzEE * magic * magic;double sqrtMagic = sqrt(magic);dLat = (dLat * 180.0) / ((jzA * (1 - jzEE)) / (magic * sqrtMagic) * M_PI);dLon = (dLon * 180.0) / (jzA / sqrtMagic * cos(radLat) * M_PI);mgLat = ggLat + dLat;mgLon = ggLon + dLon;resPoint.latitude = mgLat;resPoint.longitude = mgLon;return resPoint;
}- (BOOL)outOfChina:(double)lat BDLon:(double)lon {if (lon < RANGE_LON_MIN || lon > RANGE_LON_MAX)return YES;if (lat < RANGE_LAT_MIN || lat > RANGE_LAT_MAX)return YES;return NO;
}- (double)transformLat:(double)x BDLon:(double)y {double ret = LAT_OFFSET_0(x, y);ret += LAT_OFFSET_1;ret += LAT_OFFSET_2;ret += LAT_OFFSET_3;return ret;
}- (double)transformLon:(double)x BDLon:(double)y {double ret = LON_OFFSET_0(x, y);ret += LON_OFFSET_1;ret += LON_OFFSET_2;ret += LON_OFFSET_3;return ret;
}
  • 中国国测局地理坐标(GCJ-02) 转换成 世界标准地理坐标(WGS-84)
/***  @brief  中国国测局地理坐标(GCJ-02) 转换成 世界标准地理坐标(WGS-84)**  ####此接口有1-2米左右的误差,需要精确定位情景慎用**  @param  location    中国国测局地理坐标(GCJ-02)**  @return 世界标准地理坐标(WGS-84)*/
+ (CLLocationCoordinate2D)GCJ02ToWGS84:(CLLocationCoordinate2D)location {return  [self BD09Encrypt:location.latitude BDLon:location.longitude];
}+(CLLocationCoordinate2D)BD09Encrypt:(double)ggLat BDLon:(double)ggLon {CLLocationCoordinate2D BDPt;double x = ggLon, y = ggLat;double z = sqrt(x * x + y * y) + 0.00002 * sin(y * M_PI);double theta = atan2(y, x) + 0.000003 * cos(x * M_PI);BDPt.longitude = z * cos(theta) + 0.0065;BDPt.latitude = z * sin(theta) + 0.006;return BDPt;
}
  • 世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)
/***  @brief  世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)**  @param  location    世界标准地理坐标(WGS-84)**  @return 百度地理坐标(BD-09)*/
+ (CLLocationCoordinate2D)WGS84ToBD09:(CLLocationCoordinate2D)location {CLLocationCoordinate2D GCJ02Pt = [self GCJ02Encrypt:location.latitudeBDLon:location.longitude];return [self BD09Encrypt:GCJ02Pt.latitude BDLon:GCJ02Pt.longitude];
}
  • 百度地理坐标(BD-09) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>
/***  @brief  百度地理坐标(BD-09) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>*  *  @param  location    百度地理坐标(BD-09)*  *  @return 中国国测局地理坐标(GCJ-02)<火星坐标>*/* (CLLocationCoordinate2D)BD09ToGCJ02:(CLLocationCoordinate2D)location {return [self BD09Decrypt:location.latitude BDLon:location.longitude];
}* (CLLocationCoordinate2D)BD09Decrypt:(double)BDLat BDLon:(double)BDLon {CLLocationCoordinate2D GCJPt;double x = BDLon - 0.0065, y = BDLat - 0.006;double z = sqrt(x * x + y * y) - 0.00002 * sin(y * M_PI);double theta = atan2(y, x) - 0.000003 * cos(x * M_PI);GCJPt.longitude = z * cos(theta);GCJPt.latitude = z * sin(theta);return GCJPt;
}
  • 百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)
/***  @brief  百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)**  ####此接口有1-2米左右的误差,需要精确定位情景慎用**  @param  location    百度地理坐标(BD-09)**  @return 世界标准地理坐标(WGS-84)*/
+ (CLLocationCoordinate2D)BD09ToWGS84:(CLLocationCoordinate2D)location {CLLocationCoordinate2D GCJ02 = [self BD09ToGCJ02:location];return [self GCJ02Decrypt:GCJ02.latitude gjLon:GCJ02.longitude];
}+ (CLLocationCoordinate2D)GCJ02Decrypt:(double)gjLat gjLon:(double)gjLon {CLLocationCoordinate2D  gPt = [self GCJ02Encrypt:gjLat BDLon:gjLon];double dLon = gPt.longitude - gjLon;double dLat = gPt.latitude - gjLat;CLLocationCoordinate2D pt;pt.latitude = gjLat - dLat;pt.longitude = gjLon - dLon;return pt;
}

iOS之高德地图定位偏移以及经纬度之间的转换相关推荐

  1. Vue Cli4 使用高德地图定位 获取当前经纬度信息以及周边定位

    以上是最终效果图 下面开始代码分享 第一步 在index,html引入高德地图模块 ` <!-- 高德地图 --><script type="text/javascript ...

  2. reactjs中使用高德地图计算两个经纬度之间的距离

    第一步下载依赖 npm install --save react-amap 第二步,在组件中使用 import React, { Component } from 'react' import { L ...

  3. 高德,百度,Google地图定位偏移以及坐标系转换

    本文引用地址 一.地图坐标系解释 在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Go ...

  4. vue项目引入高德地图(定位、搜索、经纬度解析地址)

    1.npm 安装 npm install vue-amap --save 2.main.js文件引入vue-amap import VueAMap from 'vue-amap' Vue.use(Vu ...

  5. vue 高德地图 定位插件 地图实例插件 获取点击的地方的经纬度和具体地址

    npm 安装 推荐 npm 安装. npm install vue-amap --saveimport VueAMap from 'vue-amap';Vue.use(VueAMap); VueAMa ...

  6. 高德地图定位传值经纬度坐标为null,null

    高德地图定位传值经纬度坐标为null,null 因为传null导致切割字符串时崩溃,所以要加上非空判断 if (amapLocation.getLatitude() != 0 && a ...

  7. android 高德地图定位获取经纬度

    android 高德地图定位获取经纬度 之前开发定位都是集成百度的,领导说要用高德的,没办法干吧,官方的文档太详细了看着真累. 我们得先去官网注册开发者账号,创建应用,填写自己项目的包名和SHA1, ...

  8. 安卓开发 高德地图定位的封装 十分钟上手

    前言 地图作为开发中三方sdk中较常遇到的一项,集成起来并不麻烦但是不小心踩坑可能会浪费较多时间,如果项目中多处使用还容易造成代码大量冗余,今天我们来将高德地图定位功能集成一个功能化模块,只需两分钟应 ...

  9. vue-amap 实现高德地图定位 + 搜索 +回显

    1.注册成为开发者  -> 申请秘钥key 调用高德api 高德地图开放平台:https://lbs.amap.com/?ref=https://console.amap.com/dev/ind ...

最新文章

  1. pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...
  2. IDEA中maven项目所有文件都识别不了,明明存在的类提示找不到,原来只需一键解决。。。
  3. 根据按钮的状态显示hover
  4. html加上百度统计,vue单页面应用加入百度统计
  5. linux7保存防火墙规则,centos7中没有service iptables save指令来保存防火墙规则
  6. CSS 内边距 和尺寸(收藏)
  7. 云小店商城源码修复30套模板支持一键对接各大系统
  8. VBA实现Excel模块筛选高级应用场景!
  9. RemCom.XFDTD.Bio-Pro.v6.3.8.4
  10. 媒体查询之响应式布局
  11. 解决PyQt5程序报错Process finished with exit code -1073740791 (0xC0000409)
  12. VUE项目实现表格导出EXCEL表格(自定义样式及多级表头)
  13. 排序算法(5) -- 快速排序
  14. Windows Server 2008 R2使用WDS服务实现批量安装操作系统演示
  15. 解决Class “xxx“ can not access a member of class “xxx“ with modifiers “private“
  16. 崩坏3服务器维护2月8号,新版本上线!《崩坏3》2月8日新版本更新内容一览
  17. PHP修改图片上的文字,怎么用ps改图片上的字
  18. 自定义 View 之联系人字母索引及定位效果
  19. Cheat Sheet的意思
  20. c9计算机专业考研哪个容易,22考研:C9上岸学姐告诉你!考研到底需要准备多久?...

热门文章

  1. vi / vim 字符替换详解
  2. 第三方控件DevExpress的TreeList绑定XML文件
  3. python基础-2
  4. 《Do Neural Dialog Systems Use the Conversation History Effectively? An Empirical Study》
  5. Python 标准库 —— uuid(生成唯一 ID)
  6. linux web服务器系统优化,Ubuntu WEB服务器参数优化
  7. mysql5.17免安装教程_详细介绍MySql5.7.17免安装配置教程的示例代码
  8. java中常量有初始化值吗,java的变量和常量
  9. Java黑皮书课后题第5章:5.26(计算e)下面的数列可以近似计算e,编写程序显示i=10000、20000、30000…100000时值
  10. Java黑皮书课后题第2章:*2.19(几何:三角形面积)编写程序,提示用户输入三角形的三个点(x1, y1)(x2, y2)(x3, y3),然后显示它的面积