高德经纬度用的是wgs 还是wgs84 gcj02 在线转换

(转)关于百度地图和高德地图,关于地图坐标系 - 演绎者 - ITeye技术网站
博客分类:
原文作者: 深白Andy
原文地址:
众所周知地球是一个不规则椭圆体,GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定。 基准面是利用特定椭球体对特定地区地球表面的逼近,因此每个国家或地区均有各自的基准面。基准面是在椭球体基础上建立的,椭球体可以对应多个基准面,而基准面只能对应一个椭球体。 意思就是无论是谷歌地图、搜搜地图还是高德地图、百度地图区别只是针对不同的大地地理坐标系标准制作的经纬度,不存在准不准的问题,大家都是准的只是参照物或者说是标准不一样。
谷歌地图采用的是WGS84地理坐标系(中国范围除外),谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,为什么不统一用WGS84地理坐标系这就是国家地理测绘总局对于出版地图的要求,出版地图必须符合GCJ02坐标系标准了,也就是国家规定不能直接使用WGS84地理坐标系。所以定位大家感觉不准确很多又叫出版地图为火星地图其实只是坐标系不一样而已。
这就是为什么设备采集的经纬度在地图上显示的时候经常有很大的偏差,远远超出民用GPS 10米偏移量的技术规范,于是我们就有了谷歌地图纠偏 腾讯搜搜纠偏 混合地图纠偏 百度谷歌互转存在的价值。
那如何对谷歌地图纠偏、搜搜soso地图纠偏或者对百度地图纠偏呢,如果用算法目前没有太好的算法直接转换,所以大家采用的都是比对的方法吧地球划分成若干个小块找到地图的偏差量记录下来,然后根据任意经纬度找寻最接近的偏差量加上偏差量就可以实现不同地图之间的经纬度转换。现在有0.01度纠偏经纬度信息,可以提供任意格式,可以直接把经纬度偏移量调整回来。
百度地图纠偏信息包含中国海域一共29,699,997条纠偏数据,谷歌地图只包含中国陆地一共12,597,551条纠偏数据,基站数据移动和联通的共340万数据。
移动联通基站数据字段说明: MCC:国家 (460是中国) MNC:0是移动,1是联通 LAC:小区号 CELL:基站号 LNG:纬度 LAT:经度 O_LNG:纠偏后的纬度(用于google地图显示) O_LAT:纠偏后的经度(用于google地图显示)PRECISION:基站半径范围单位米 ADDRESS:详细地址中文描述 REGION:省份 CITY:城市 COUNTRY:国家
之所以说这个是因为前些日子做的项目有这样的一个需求,展示的是百度地图,然后想利用百度地图上取到经纬度的点,用高德地图的api逆地理编码获取当前位置的文字信息。一开始以为全球的经纬度都是确定值的嘛,大家共用的。其实不然,由于每个地图使用的坐标系不同,我伟大的祖国为了保密需要,规定不能直接使用WGS84地理坐标系,于是应用于中国的各个地图就会在原来坐标的基础上经过一个加密的加偏算法,把加偏过的坐标呈现给你,而不同地图的加偏算法又是不一样的,有的甚至是多次加偏。也就是说同样你是在人民广场,用百度地图和谷歌地图取到的坐标值是不一样的。
经研究发现,百度地图的坐标系为BD09,高德地图坐标为GCJ02,这样就存在不同坐标系的坐标之间转换的问题了,查api吧,然后又发现无论百度地图还是高德地图,api列表里都没有提这个事情。但是上网一查,还是发现了他们都有个隐藏类:CoordinateConvert,但是这个类只提供了转向他们自己坐标系的方法,比如说:
CoordinateConvert.fromGcjToBaidu(GeoPoint geoPoint);
//从gcj02坐标系转到bd09坐标系
CoordinateConvert.fromWgs84ToBaidu(GeoPoint geoPoint);
//从wgs84坐标系转到bd09坐标系
//从wgs84坐标系转到gcj02坐标系
CoordinateConvert.fromGpsToAMap(double arg0, double arg1);
CoordinateConvert.fromSeveralGpsToAMap(String arg0);
CoordinateConvert.fromSeveralGpsToAMap(String arg0);
而因为我是展示的百度地图,有要获取百度地图上的中心点的经纬度然后在作为参数调用高德地图api的需求,而百度地图并未提供bd09坐标系转出的api(也可以理解,因为如果这样的话,相当于没加密啊,自己将加密算法写出来,再给个解密的api不是有毛病么,不能不把国家的规定放眼里嘛,百度也说有深层次的需求要以公司名义给他们发邮件什么的,但是一般来说一个小安卓项目客户不会那么兴师动众,而且据群众反映,邮件的效果也不怎么好),所以一时做了罢。
但是柳暗花明又一村了,虽然无法将百度地图上的任意点转为gcj02坐标系的点,但是百度地图还是在他们的定位api里提供了方法,使得应用在获取当前位置的时候,可以获取以“gcj02”为坐标系的点:
LocationClientOption option = new LocationClientOption();
option.setCoorType("gcj02");//设置坐标类型
这样以来,就可以用高德地图获取位置信息了,虽然说只能有当前位置这一个点是取成gcj02坐标的点是比较囧的o(╯□╰)o ,还有,别忘了,取得的当前点要转化成bd09的坐标系之后,再展示在百度地图上,不然是会有偏差的。
另外比较一下百度地图和高德地图(因为害怕谷歌地图在大陆地区的服务受限问题等等,所以没考虑使用谷歌地图,也就没怎么研究)。
百度地图在页面上的展示方面做的还是很好的,包括页面的缩放,信息的标注等等,相比之下高德地图就会在某些安卓版本的某些机器上出现在放缩的时候地图信息展示的不够清晰不够明确的情况,而且在定位时,百度的地位相对准确,因为我们公司的网络服务器不在公司办公所在地,所以高德地图有时候定位就定位到服务器的地址去了,百度从我使用至今还没出现过这样的错误。
但是百度地图在poi搜索这一块,在我看来是相对薄弱的,百度地图的poi搜索在不输入关键字的时候,是不能做模糊搜索的,而且也不能根据类型搜索(比如仅搜索饮食,搜索学校之类的),而在高德地图里这些就做到了。而且在逆地理编码时,高德地图获取的结果是相对比百度地图更丰富的。
最后,此篇文章仅基于我个人在最近的短时间内的研究,如有遗漏或者错误之处,还请看到文章的各位指出,大家共同进步,谢谢!
jacky-zhang
浏览: 233964 次
来自: 成都
xiajy 写道他妈的都该名字了,更可恶的金山手机助手是:sj ...
关闭tadb.exe,重启eclipse搞定
感谢,真是帮了大忙!腾讯
他妈的都该名字了,更可恶的金山手机助手是:sjk_daemon ...&>&&>&&>&&>&高德系地图纠偏数据库 适用于谷歌地图,soso地图,mapabc等
高德系地图纠偏数据库 适用于谷歌地图,soso地图,mapabc等
上传大小:8.48MB
前2个字段是经纬度范围
中间2个是偏移像素 最大所发级别开始每级递进除以2就是最终的便宜像素
最后2个字段是便宜经纬度加上减去就可以进行纠偏和转换。
wgs84和GCJ02地图体系之间的转换
适用于谷歌地图 腾讯的soso地图 mapabc等高德系地图
access数据库可以导入其他数据库中使用
综合评分:3.8(42位用户评分)
所需积分:10
下载次数:147
审核通过送C币
创建者:baiyuzhong2012
创建者:baiyuzhong2012
创建者:baiyuzhong2012
课程推荐相关知识库
上传者其他资源上传者专辑
行业热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
高德系地图纠偏数据库 适用于谷歌地图,soso地图,mapabc等
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
sky6714686
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:1245人阅读
一。在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系:
1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;
2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;
3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)
二。为什么会发生偏移?
1.由于坐标系之间不兼容,如在百度地图上定位的经纬度拿到高德地图上直接描点就肯定会发生偏移;只考虑国内的情况,高德地图和Google地图是可以不经过转换也能够准确显示的(在国内用的都是GCJ-02坐标系);下面是收录了网上的WGS-84,GCJ-02,百度坐标系(bd-09)之间的相互转换的方法,经,是转换后相对准确可用的:
2.在国内定位的经纬度,然后在国外网络下显示也会发生偏移(谷歌和高德会依据网络的情况选择使用WGS-84坐标还是GCJ-02坐标,百度地图则一直使用bd-02坐标系)
3.定位方式,在定位的经纬度是通过GPS获取的,在则可以通过网络或GPS获取经纬度。通过地图SDK定位获取的经纬度,地图SDK会自动选择加密的方式(如Google地图会根据国内国外选择不同的坐标系)然后再将点显示在地图上,这个时候是没有偏移的;如果直接将经纬度在地图上显示,可能就会因为地域或网络的问题导致使用的坐标系不同,进而发生来偏移。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:361113次
积分:4624
积分:4624
排名:第5526名
原创:91篇
转载:76篇
评论:76条
(4)(2)(1)(1)(1)(1)(1)(1)(1)(1)(4)(1)(1)(2)(11)(2)(7)(3)(6)(3)(10)(17)(1)(8)(3)(1)(3)(9)(11)(3)(1)(3)(1)(2)(1)(2)(7)(7)(1)(2)(11)(9)java web(100)
http://blog.csdn.net/a/article/details/
一。在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系:
1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;
2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;
3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)
二。为什么会发生偏移?
1.由于坐标系之间不兼容,如在百度地图上定位的经纬度拿到高德地图上直接描点就肯定会发生偏移;只考虑国内的情况,高德地图和Google地图是可以不经过转换也能够准确显示的(在国内用的都是GCJ-02坐标系);下面是收录了网上的WGS-84,GCJ-02,百度坐标系(bd-09)之间的相互转换的方法,经,是转换后相对准确可用的:
2.在国内定位的经纬度,然后在国外网络下显示也会发生偏移(谷歌和高德会依据网络的情况选择使用WGS-84坐标还是GCJ-02坐标,百度地图则一直使用bd-02坐标系)
3.定位方式,在定位的经纬度是通过GPS获取的,在则可以通过网络或GPS获取经纬度。通过地图SDK定位获取的经纬度,地图SDK会自动选择加密的方式(如Google地图会根据国内国外选择不同的坐标系)然后再将点显示在地图上,这个时候是没有偏移的;如果直接将经纬度在地图上显示,可能就会因为地域或网络的问题导致使用的坐标系不同,进而发生来偏移。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:95790次
积分:2473
积分:2473
排名:第13186名
原创:99篇
转载:267篇
评论:10条
(8)(2)(21)(44)(18)(18)(18)(12)(16)(15)(17)(28)(13)(22)(22)(43)(35)(25)(6)1.&中国国测局地理坐标(GCJ-02)&即火星坐标&
  谷歌中国地图、搜搜中国地图、高德地图采用的是GCJ02(其中苹果地图在大陆的数据源是高德)地理坐标系
2.&世界标准地理坐标(WGS-84)
  谷歌地图采用的是WGS84地理坐标系(中国范围除外)。
3.&百度地理坐标(BD-09)
  百度定位SDK可以返回三种坐标系,分别是bd09, bd09ll(默认)和gcj02,其中bd09ll能无偏差地显示在百度地图上。
而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,所以我们要根据得到的经纬度的坐标类型和地图厂商类型在地图上标点,否则会出现获取的位置误差。
后缀ll=经纬度球面坐标,mc=墨卡托平面坐标。当定位SDK中输入gcj02时,默认为经纬度坐标,输入bd09时,默认为墨卡托平面坐标。
百度地图api中采用两种坐标体系,经纬度坐标系和墨卡托投影坐标系。前者单位是度,后者单位是米,具体定义可以参见百科词条解释:&和&。
以百度地图为例
  百度地图采用的是自己的BD09坐标。如果我们通过GPS获取的坐标,也就是WGS84坐标,那么我们首先要将WGS坐标转换成BD09坐标。
转换成百度坐标下的经纬度即可有在地图上标点,当然,百度获取的文字详情不如高德,有时想要获取位置详情,需要调用高德的接口,而高德采用的标准是 GCJ02,因此,如果拿到百度地图的经纬度或是GPS经纬度,则要转成国测局的标准,以获取位置详细信息。
相互间的单位转换如下:
(1)世界标准地理坐标(WGS-84) 转换成 中国国测局地理坐标(GCJ-02)&火星坐标&
1 public static float[] gcj02Encrypt(double ggLat, double ggLon) {
float[] resPoint = new float[2];
double mgL
double mgL
double dLat = transformLat(ggLon - 105.0, ggLat - 35.0);
double dLon = transformLon(ggLon - 105.0, ggLat - 35.0);
double radLat = ggLat / 180.0 * Math.PI;
double magic = Math.sin(radLat);
magic = 1 - jzEE * magic *
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((jzA * (1 - jzEE)) / (magic * sqrtMagic) * Math.PI);
dLon = (dLon * 180.0) / (jzA / sqrtMagic * Math.cos(radLat) * Math.PI);
mgLat = ggLat + dL
mgLon = ggLon + dL
resPoint[0] = (float) mgL
resPoint[1] = (float) mgL
return resP
(2)中国国测局地理坐标(GCJ-02) 转换成 世界标准地理坐标(WGS-84)
  *******接口有1-2米左右的误差,需要精确定位情景慎用*****
1 public static float[] gcj02Decrypt(double gjLat, double gjLon) {
float[] gPt = gcj02Encrypt(gjLat, gjLon);
double dLon = gPt[1] - gjL
double dLat = gPt[0] - gjL
float[] pt = new float[2];
pt[0] = (float) (gjLat - dLat);
pt[1] = (float) (gjLon - dLon);
(3)世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)
1 // 首先转换获取到GCJ-02的坐标
2 float[] gcj02Pt = gcj02Encrypt(latitude,longitude);
1 // 传入中国国测局地理的坐标
2 public static float[] bd09Encrypt(double ggLat, double ggLon) {
float[] bdPt = new float[2];
double x = ggLon, y = ggL
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
bdPt[1] = (float) (z * Math.cos(theta) + 0.0065);
bdPt[0] = (float) (z * Math.sin(theta) + 0.006);
return bdPt;
(4)中国国测局地理坐标(GCJ-02)&火星坐标& 转换成 百度地理坐标(BD-09)
1 // 用以上办法
2 public static float[] bd09Encrypt(double ggLat, double ggLon)
(5)百度地理坐标(BD-09) 转换成 中国国测局地理坐标(GCJ-02)&火星坐标&
1 public static float[] bd09Decrypt(double bdLat, double bdLon) {
float[] gcjPt = new float[2];
double x = bdLon - 0.0065, y = bdLat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
gcjPt[1] = (float) (z * Math.cos(theta));
gcjPt[0] = (float) (z * Math.sin(theta));
return gcjPt;
(6)百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)
  *******接口有1-2米左右的误差,需要精确定位情景慎用*****
1 // 先将百度坐标 转换成 中国国测局坐标
2 float[] gcj02 = bd09ToGcj02(latitude,longitude);
1 // 再传入 中国国测局坐标 返回 世界标准地理坐标
2 gcj02Decrypt(gcj02[0], gcj02[1]);
阅读(...) 评论()}

我要回帖

更多关于 wgs84togcj02 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信