关于高德百度地图坐标系问题
目前市面上比较常见的互联网地图的坐标系主要有这样几种:GCJ-02、BD-09、WGS84、CGCS2000。WGS84,原始坐标体系。主要有Google Earth在用,。GCJ-02是由国测局制定的互联网地图坐标系,又叫火星坐标,最常见的互联网地图坐标系,在中国能见到的互联网
地图基本都是这种坐标了,比如高德地图、腾讯地图、百度地图、Google地图(中国范围)。BD-09是百度地图独有的坐标系,是在GCJ-02的基础之上进行二次加密的地图坐标,比GCJ-02坐标偏了几百米
的样子。CGCS2000是国家2000坐标系,是一个地心坐标系,目前的话应该就只有天地图在用了,所以目前的互联网地图就
只有天地图使用的是真实坐标,其他都是使用的加密坐标。CGCS2000、WGS84都是地心坐标系,地心与参心不同,参心坐标系是以参考椭球为基准建立的坐标系,不同的国
家有着自己的参考椭球标准,所以会存在一些差异性,而地心坐标系是以地球的质量中心为基准建立的坐标系统,
所以,2000与84基本是重合的,只有高程基准面会存在差异,天地图的定位API就是直接读取的手机GPS坐标,不
加密直接显示到地图上。
//地球坐标系转火星坐标系方法
const double a = 6378245.0;
const double ee = 0.00669342162296594323; + (CLLocation *)transformToMars:(CLLocation *)location { //是否在中国大陆之外 if ([[self class] outOfChina:location]) { return location; } double dLat = [[self class] transformLatWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0]; double dLon = [[self class] transformLonWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0]; double radLat = location.coordinate.latitude / 180.0 * M_PI; double magic = sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI); dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI); return [[CLLocation alloc] initWithLatitude:location.coordinate.latitude + dLat longitude:location.coordinate.longitude + dLon];
} + (BOOL)outOfChina:(CLLocation *)location { if (location.coordinate.longitude < 72.004 || location.coordinate.longitude > 137.8347) { return YES; } if (location.coordinate.latitude < 0.8293 || location.coordinate.latitude > 55.8271) { return YES; } return NO;
} + (double)transformLatWithX:(double)x y:(double)y { double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0; ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0; ret += (160.0 * sin(y / 12.0 * M_PI) + 320.0 * sin(y * M_PI / 30.0)) * 2.0 / 3.0; return ret;
} + (double)transformLonWithX:(double)x y:(double)y { double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0; ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0; ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0; return ret;
}
// GCJ-02 坐标转换成 BD-09 坐标
+ (CLLocationCoordinate2D)MarsGS2BaiduGS:(CLLocationCoordinate2D)coordinate
{ double x_pi = PI * 3000.0 / 180.0; double x = coordinate.longitude, y = coordinate.latitude; double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi); double theta = atan2(y, x) + 0.000003 * cos(x * x_pi); double bd_lon = z * cos(theta) + 0.0065; double bd_lat = z * sin(theta) + 0.006; return CLLocationCoordinate2DMake(bd_lat, bd_lon);
} // BD-09 坐标转换成 GCJ-02 坐标
+ (CLLocationCoordinate2D)BaiduGS2MarsGS:(CLLocationCoordinate2D)coordinate
{ double x_pi = PI * 3000.0 / 180.0; double x = coordinate.longitude - 0.0065, y = coordinate.latitude - 0.006; double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi); double theta = atan2(y, x) - 0.000003 * cos(x * x_pi); double gg_lon = z * cos(theta); double gg_lat = z * sin(theta); return CLLocationCoordinate2DMake(gg_lat, gg_lon);
}
// WGS-84 坐标转换成 BD-09 坐标
+ (CLLocationCoordinate2D)WorldGS2BaiduGS:(CLLocationCoordinate2D)coordinate
{ CLLocationCoordinate2D mars = [ALDGeocoder WorldGS2MarsGS:coordinate]; CLLocationCoordinate2D baidu = [ALDGeocoder MarsGS2BaiduGS:mars]; return baidu;
} // BD-09 坐标转换成 WGS-84 坐标
+ (CLLocationCoordinate2D)BaiduGS2WorldGS:(CLLocationCoordinate2D)coordinate
{ CLLocationCoordinate2D mars = [ALDGeocoder BaiduGS2MarsGS:coordinate]; CLLocationCoordinate2D world = [ALDGeocoder MarsGS2WorldGS:mars]; return world;
}
// WGS-84 坐标转换成 Sogou 坐标
+ (CLLocationCoordinate2D)WorldGS2SogouGS:(CLLocationCoordinate2D)coordinate
{ const double ee = 0.082271854224939184; double lon = coordinate.longitude; double lat = coordinate.latitude; double dlon = [ALDGeocoder rad:CLIP(lon, -360, 360)]; double dlat = [ALDGeocoder rad:CLIP(lat, -90, 90)]; dlon = 6378206.4 * dlon; double sinphi = sin(dlat); double temp1, temp2; if((temp1 = 1.0 + sinphi) == 0.0){ dlat = -1000000000; }else if((temp2 = 1.0 - sinphi) == 0.0){ dlat = 1000000000; }else{ double esinphi = ee * sinphi; dlat = 3189103.2000000002 * log((temp1 / temp2) * pow((1.0 - esinphi) / (1.0 + esinphi), ee)); } return CLLocationCoordinate2DMake(dlat, dlon);
} // Sogou 坐标转换成 WGS-84 坐标
+ (CLLocationCoordinate2D)SogouGS2WorldGS:(CLLocationCoordinate2D)coordinate
{ const double ee = 1.5707963267948966; const double aa = 0.0033938814110493522; double lon = coordinate.longitude; double lat = coordinate.latitude; double dlon = lon / 6378206.4; double temp = -lat / 6378206.4; double chi; if(temp < -307){ chi = ee; }else if(temp > 308){ chi = -ee; }else{ chi = ee - 2 * atan(exp(temp)); } double chi2 = 2 * chi; double coschi2 = cos(chi2); double dlat = chi + sin(chi2) * (aa + coschi2 * (1.3437644537757259E-005 + coschi2 * (7.2964865099246009E-008 + coschi2 * 4.4551470401894685E-010))); double rlon = CLIP([ALDGeocoder deg:dlon], -360, 360); double rlat = CLIP([ALDGeocoder deg:dlat], -90, 90); return CLLocationCoordinate2DMake(rlat, rlon);
}
//WGS-84 坐标转换成 墨卡托 坐标
+ (CLLocationCoordinate2D)WorldGS2Mercator:(CLLocationCoordinate2D)coordinate
{ double lon = coordinate.longitude*20037508.34/180; double lat = log(tan((90+coordinate.latitude)*M_PI/360))/(M_PI/180); lat = lat*20037508.34/180; return CLLocationCoordinate2DMake(lat, lon);
} //墨卡托 坐标转换成 WGS-84 坐标
+ (CLLocationCoordinate2D)Mercator2WorldGS:(CLLocationCoordinate2D)mercator
{ double lon = mercator.longitude/20037508.34*180; double lat = mercator.latitude/20037508.34*180; lat = 180/M_PI*(2*atan(exp(lat*M_PI/180))-M_PI/2); return CLLocationCoordinate2DMake(lat, lon);
}
关于高德百度地图坐标系问题相关推荐
- android 高德卫星地图数据,白马地图 Bmap for Android v7.3.81 强大高德百度地图应用|张小北...
Bmap for Android 是一款集成高德地图百度地图为一体的第三方地图应用APP,Bmap for Android 又叫白马地图,采用高德/百度地图数据引擎,可任意切换百度地图.高德地图数据源 ...
- 高德地图——浏览器定位+点击获取经纬度+去除高德百度地图左下角logo
高德地图--浏览器定位+点击获取经纬度+去除高德百度地图左下角logo 1.代码 <!doctype html> <html> <head><meta cha ...
- react-native原生GPS与高德地图坐标,百度地图坐标系的转换
问题 今天用react-native原生GPS拿到得定位信息,如图: 之前高德地图取到的定位数据为(显示带有longtitude,latitude===的log)准确的 121.518828125,3 ...
- 天气 经纬度 高德_天地图与高德 百度地图的经纬度转换
https://lbs.amap.com/api/javascript-api/guide/transform/convertfrom http://m.gpsspg.com/maps.htm 1.首 ...
- 【批量地点检索-高德百度地图地理编码对比】
批量地点检索 基于python地理位置描述转经纬度坐标 前提: 需要安装部署python环境 安装导入模块: import requests import json import math 发送请求 ...
- 百度地图坐标系相关学习总结
百度地图API详解之地图坐标系统 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要 一个转换过程,这个过程就叫做投影(Projection).在地球上我们通过 ...
- vue2.0 唤起百度地图app_开车选高德,出门靠百度,高德百度地图APP对比
高德和百度是在电子地图领域竞争的对手,但是,在同一领域他们的发展方向的侧重也存在差异.那么,他们究竟有什么不同呢?当然,他们的开发人员必须是不同的,肯定不用考虑.此外,在某些数据和功能上,它们也是不同 ...
- 高德百度地图如何获取附近小区酒店银行等?
概述 实现以下功能:根据当前定位,查找附近小区 实现步骤 高德,百度地图实现方式相同,步骤都是如下: 1.获取当前位置的经纬度 2.查询poitype编码. (小区,写字楼,银行,酒店等等每个类别都有 ...
- 高德(百度)地图驾车路线规划和清除
高德地图: 带途径点的路径规划: var markerList=[{lng:116.379028,lat:39.865042},{lng:116.379028,lat:39.885042, },{ln ...
- 使用高德(百度)地图API
以高德地图为例: 高德地图API官网申请key; 在index.html中引入: 如果是Vue-cli2,在build/webpack.base.conf.js中的module.exports={}中 ...
最新文章
- Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
- Tomcat 下构建 Web 应用时,常犯的一些通用错误
- CoreAnimation —— CAReplicatorLayer(拷贝图层)
- dotNET Core实现分布式环境下的流水号唯一
- Spring Boot Actuator监控关闭
- div 位于屏幕正中间_折叠屏已经不新鲜了,明天你可能会用上“伸缩屏幕”!...
- 【转载】Kali-linux安装之后的简单设置
- RDIFramework.NET(.NET快速信息化系统开发框架) Web版介绍
- Java从入门到精通 第12章 类的封装、继承与多态
- 190706每日一句
- 如何安装VS2011Beta版
- Input Director使用一个键盘和鼠标即可控制多台Windows计算机
- 大学心理学课本_大学心理学的教材依次(全部)都有哪些?
- python基础之语句_python基础之条件语句
- 和讯博客知名博主《猎杀黑马》作者王宁签售会圆满结束
- 怎么把电脑上的python软件卸载干净_怎么把一个软件卸载干净 把一个软件卸载干净的两种方法...
- STM32片上Flash读写的一些重要知识
- 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题
- mysql数据库编程题题_mysql数据库编程题测试
- HTML 四十六 HTML5 语义
热门文章
- 扇贝编程python骗局-原来用Python薅羊毛这么简单!后悔错过了那么多机会
- Python在线编程网站
- OPC 通讯 Demo
- delphi 2010 mysql_Delphi 2010和MySQL
- 2017电子设计大赛论文:滚球控制系统
- Codejock.Xtreme.Toolkit.Pro.v15.3.1 for MFC 15种皮肤切换
- CCNA学习指南-----1-3章笔记
- 心语家园系统维护工具箱v1.0
- 【中文信息处理】实验一_语料库统计_基于词表的分词
- font-family 各字体一览表