该项目的最新进展包括地图共享模块,android同事集团开始,使用百度地图sdk,我开始回,运用iOS SDK的mapkit做,之后,问题是,用纬度和经度坐标iOS端和Android端出现了比較大偏差。查了下资料苹果地图在大陆的数据源是高德的,查了下高德採用GCJ-02, 百度map sdk 採用的是BD-09。仅仅好写了个类在发送和接收时做好转换,稍微蛋疼。Github上有人写了一个现成的转换类,能够參考參考传送门 。其主要代码见下:

头文件:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface JZLocationConverter : NSObject/***  @brief 世界标准地理坐标(WGS-84) 转换成 中国国測局地理坐标(GCJ-02)<火星坐标>**  ####仅仅在中国大陆的范围的坐标有效,以外直接返回世界标准坐标**   @param     location    世界标准地理坐标(WGS-84)**  @return    中国国測局地理坐标(GCJ-02)<火星坐标>*/
+ (CLLocationCoordinate2D)wgs84ToGcj02:(CLLocationCoordinate2D)location;/***   @brief 中国国測局地理坐标(GCJ-02) 转换成 世界标准地理坐标(WGS-84)**  ####此接口有1-2米左右的误差,须要精确定位情景慎用**  @param     location    中国国測局地理坐标(GCJ-02)**   @return    世界标准地理坐标(WGS-84)*/
+ (CLLocationCoordinate2D)gcj02ToWgs84:(CLLocationCoordinate2D)location;/***   @brief 世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)** @param     location    世界标准地理坐标(WGS-84)**  @return    百度地理坐标(BD-09)*/
+ (CLLocationCoordinate2D)wgs84ToBd09:(CLLocationCoordinate2D)location;/***    @brief 中国国測局地理坐标(GCJ-02)<火星坐标> 转换成 百度地理坐标(BD-09)**  @param     location    中国国測局地理坐标(GCJ-02)<火星坐标>**   @return    百度地理坐标(BD-09)*/
+ (CLLocationCoordinate2D)gcj02ToBd09:(CLLocationCoordinate2D)location;/***    @brief 百度地理坐标(BD-09) 转换成 中国国測局地理坐标(GCJ-02)<火星坐标>**  @param     location    百度地理坐标(BD-09)**  @return    中国国測局地理坐标(GCJ-02)<火星坐标>*/
+ (CLLocationCoordinate2D)bd09ToGcj02:(CLLocationCoordinate2D)location;/***    @brief 百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)**  ####此接口有1-2米左右的误差,须要精确定位情景慎用** @param     location    百度地理坐标(BD-09)**  @return    世界标准地理坐标(WGS-84)*/
+ (CLLocationCoordinate2D)bd09ToWgs84:(CLLocationCoordinate2D)location;@end

实现文件

#import "JZLocationConverter.h"
#import <CoreLocation/CoreLocation.h>
#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
// jzA = 6378245.0, 1/f = 298.3
// b = a * (1 - f)
// ee = (a^2 - b^2) / a^2;
#define jzA 6378245.0
#define jzEE 0.00669342162296594323@implementation JZLocationConverter+ (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;
}+ (BOOL)outOfChina:(double)lat bdLon:(double)lon
{if (lon < RANGE_LON_MIN || lon > RANGE_LON_MAX)return true;if (lat < RANGE_LAT_MIN || lat > RANGE_LAT_MAX)return true;return false;
}+ (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;
}+ (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;
}+ (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;
}+(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;
}+ (CLLocationCoordinate2D)wgs84ToGcj02:(CLLocationCoordinate2D)location
{return [self gcj02Encrypt:location.latitude bdLon:location.longitude];
}+ (CLLocationCoordinate2D)gcj02ToWgs84:(CLLocationCoordinate2D)location
{return [self gcj02Decrypt:location.latitude gjLon:location.longitude];
}+ (CLLocationCoordinate2D)wgs84ToBd09:(CLLocationCoordinate2D)location
{CLLocationCoordinate2D gcj02Pt = [self gcj02Encrypt:location.latitudebdLon:location.longitude];return [self bd09Encrypt:gcj02Pt.latitude bdLon:gcj02Pt.longitude] ;
}+ (CLLocationCoordinate2D)gcj02ToBd09:(CLLocationCoordinate2D)location
{return  [self bd09Encrypt:location.latitude bdLon:location.longitude];
}+ (CLLocationCoordinate2D)bd09ToGcj02:(CLLocationCoordinate2D)location
{return [self bd09Decrypt:location.latitude bdLon:location.longitude];
}+ (CLLocationCoordinate2D)bd09ToWgs84:(CLLocationCoordinate2D)location
{CLLocationCoordinate2D gcj02 = [self bd09ToGcj02:location];return [self gcj02Decrypt:gcj02.latitude gjLon:gcj02.longitude];
}@end

測试用例:

    CLLocationCoordinate2D gcj02 = CLLocationCoordinate2DMake(114.21892734521,29.575429778924);CLLocationCoordinate2D bd09 = [JZLocationConverter gcj02ToBd09:gcj02];NSLog(@"%f,%f", bd09.latitude, bd09.longitude); // http://developer.baidu.com/map/index.php?title=webapi/guide/changeposition// JZLocationConverter 測试数据: 114.21892734521,29.575429778924  ; 转化结果: 114.224960,29.581853// 百度api  測试数据: 114.21892734521,29.575429778924  ; 百度api转换结果: 114.22539195429,29.581585367458

整体来说,存在一点偏差,但跟处理前的效果比一下。相对能够接受了些。

參考:

http://blog.csdn.net/jiajiayouba/article/details/25140967

http://developer.baidu.com/map/index.php?

title=webapi/guide/changeposition

http://blog.csdn.net/winnyrain/article/details/22233559

http://www.kuaifenxiang.net/article/17

http://blog.csdn.net/coolypf/article/details/8569813

http://www.cppblog.com/socketref/archive/2011/06/29/149713.html

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4792462.html

iOS在地图上WGS84、GCJ-02、BD-09互转解决方案相关推荐

  1. iOS 在地图上绘制出你运动的轨迹

    iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...

  2. iOS 在地图上绘制运动轨迹

    iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...

  3. iOS开发之在地图上绘制出你运行的轨迹

    iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有 用,比如汽车的gprs追踪.人员追踪.快递追踪等等.这篇 ...

  4. iOS开发之在地图上绘制出你运动的轨迹

    iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...

  5. 坐标转换 | EXCEL中WGS84转GCJ02,并在地图上标注

    1 前言 本文介绍的坐标方法,不需要写代码,不需要专业GIS软件.只需要有OFFICE办公软件,在EXCEL表格里直接进行数据处理. 本文使用的软件: OFFICE:2010版及以上. 小O地图EXC ...

  6. iOS 国外地图开发 谷歌地图坐标放到苹果地图上坐标不准确

    首先请允许我发一个牢骚.苹果地图这个坑... 一 .我们要开发一个国外定点展示房屋信息的地图应用.效果图如下: . 二.第一反应用苹果原生地图Mapkit做.我们的坐标点都是从谷歌地图上取出来的. 功 ...

  7. iOS 百度地图之坐标转换

    iOS系统定位是采用的是gps坐标,如果想在百度地图上展示有两种方式 1.百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标. ...

  8. iOS — 百度地图 使用

    前言,关于百度地图的环境集成,请自行前往百度地图API首页参考百度地图Api文档自行解决. 1.定位功能 导入头文件 <BaiduMapAPI_Location/BMKLocationServi ...

  9. 根据手机指南针经纬度在地图上找到其位置

    使用手机指南针获取经纬度,然后在地图上找到位置. 1.使用手机指南针获取经纬度: 2.将度分秒转换为度: 分/60+秒/3600+整数度数,得到以度为单位的数值 手机经纬度:117.1291666,3 ...

最新文章

  1. android apk 反编译工具,安卓apk反编译神器
  2. python自动执行脚本
  3. 分享Qt的面试题目(或许未来的我能用的上呢)_vortex_新浪博客
  4. 面向对象设计与构造课程作业 _第三单元总结 _北京航空航天大学计算机学院 2019春季...
  5. python中的pandas库如何读数据_Python之Pandas库学习(二):数据读写
  6. Akka Actors入门案例解析
  7. 年审是当月还是当天_车辆年检可以在到期当月进行吗
  8. 公云等相关应用怎样用
  9. manjaro 亮度调节
  10. myeclipse10注册机详细使用方法
  11. 2022医院三基考试加血提分每日一练及答案
  12. 爱测未来安全-浅淡流量劫持及应对措施
  13. 一篇关于不同进制之间的转换、比如二进制、八进制、十进制、十六进制等
  14. zookeeper的应用和原理
  15. bu yong di san fang jiao huan liang ge shu zi
  16. Virtual-Network--—DHCP协议学习以及对应报文分析
  17. 【record】新系统软件无法打开,缺少dll
  18. CSS样式解决英文换行断词问题
  19. MediaPlayer的使用
  20. java 虚拟机设置 Xms Xmx PermSize MaxPermSize

热门文章

  1. NopCommerce 2.5的部署
  2. 用记事本开始写自己的第一个WebService
  3. Microsoft Visual Studio 2005中使用水晶报表
  4. java并发编程之缓存一致性问题
  5. ios 内存管理的理解(一) 简述
  6. RecyclerView(六)设置下拉刷新
  7. sitemesh3.0的配置以及在静态html中的使用
  8. ubuntu安装禅道
  9. linux的nohup命令
  10. ArrayBlockingQueue使用