中国地图坐标偏移算法整理
原文地址:http://dijkst.github.io/blog//zhong-guo-di-tu-zuo-biao-pian-yi-suan-fa-zheng-li/(第九快石头博客),有删改。
& & & & &不知道大家注意没有,谷歌地图中国版,百度地图很多时候找出来的坐标差异很大?为什么原因很简单,为了保密需要,所有的坐标都必须经过国家测绘局进行偏移,这里的坐标,包括某个景点的坐标,甚至是整张地图的坐标(地图是由多个建筑、地形坐标构成)!!而偏移算法目前在正规渠道来说是保密的,根据小伙伴们的观察,偏移量是不一定的,我就在想,一个正方形的建筑,经过这种偏移,会不会偏出一个梯形出来…………
& & & & 既然地图是偏移的,并非真实的地图,那么我们往地图上面标注景点或者建筑的时候,甚至标注用户当前位置时,就不能直接用 GPS 输出的真实值,而是得将 GPS 坐标也进行相同算法的偏移,然后放在地图上就感觉没偏移了----大家一起做漂移~
& & & & 所以市面上,就出现了一种现象,水货的 GPS 设备(有的手机也是),做定位的时候输出真实值,而中国市面上的地图,例如 Google 地图、百度地图等,都是必须遵守国家测绘局规定进行偏移的。所以出现了定位不准的问题。而行货 GPS 设备,由于是正规渠道,里面内置了偏移芯片,所以输出的定位坐标是偏移过的,放在 Google 地图上面就正常了!
& & & & 其实,从正常的方式使用,例如买行货,用 Google、百度地图等,都是没偏移问题。如果遇到需要收集景点的坐标,也得用行货 GPS 设备,那么皆大欢喜!然而,有一个悲剧的问题发生了----香港、澳门从坐标上偏离了大陆,Google 还是采用真实的地图,而百度认为是中国,所以采用偏移的地图,这样就混乱了----同一个香港坐标,在百度和 Google 里面看到的差距很大~(这段话作者写得好混乱,没有看懂)
& & & & 当然咯,最好的办法是,在香港和澳门收集坐标的时候,两套坐标都收集……可是事实上,我们经常没办法弄到……
& & & & 这时候就需要转换算法,将两种坐标算法进行互相转换----更悲剧的是,这个算法,真实坐标-&火星坐标是保密的,火星坐标-&真实坐标是不可逆的!!!
& & & &不过,网络上,不知道从哪里出来了一套算法,我试了一下,还挺准的~
// Krasovsky 1940
// a = , 1/f = 298.3
// b = a * (1 - f)
// ee = (a^2 - b^2) / a^2;
const double a = ;
const double ee = 0.;
// World Geodetic System ==& Mars Geodetic System
BOOL outOfChina(CLLocationCoordinate2D coordinate)
& & if (coordinate.longitude & 72.004 || coordinate.longitude & 137.8347)
& & & & return YES;
& & if (coordinate.latitude & 0.8293 || coordinate.latitude & 55.8271)
& & & & return YES;
& & return NO;
double transformLat(double x, 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 * sin(y * M_PI / 30.0)) * 2.0 / 3.0;
static double transformLon(double x, 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;
// 地球坐标系 (WGS-84) -& 火星坐标系 (GCJ-02)
CLLocationCoordinate2D wgs2gcj(CLLocationCoordinate2D coordinate) {
& & if (outOfChina(coordinate)) {
& & double wgLat = coordinate.
& & double wgLon = coordinate.
& & double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
& & double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
& & double radLat = wgLat / 180.0 * M_PI;
& & double magic = sin(radLat);
& & magic = 1 - ee * 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 CLLocationCoordinate2DMake(wgLat + dLat, wgLon + dLon);
// 地球坐标系 (WGS-84) &- 火星坐标系 (GCJ-02)
CLLocationCoordinate2D gcj2wgs(CLLocationCoordinate2D coordinate) {
& & if (outOfChina(coordinate)) {
& & CLLocationCoordinate2D c2 = wgs2gcj(coordinate);
& & return CLLocationCoordinate2DMake(2 * coordinate.latitude - c2.latitude, 2 * coordinate.longitude - c2.longitude);
const double x_M_PI = M_PI * 3000.0 / 180.0;
// 火星坐标系 (GCJ-02) -& 百度坐标系 (BD-09)
CLLocationCoordinate2D bd_encrypt(CLLocationCoordinate2D coordinate) {
& & double x = coordinate.longitude, y = coordinate.
& & double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_M_PI);
& & double theta = atan2(y, x) + 0.000003 * cos(x * x_M_PI);
& & return CLLocationCoordinate2DMake(z * sin(theta) + 0.006, z * cos(theta) + 0.0065);
// 火星坐标系 (GCJ-02) &- 百度坐标系 (BD-09)
CLLocationCoordinate2D bd_decrypt(CLLocationCoordinate2D coordinate) {
& & double x = coordinate.latitude - 0.0065, y = coordinate.longitude - 0.006;
& & double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_M_PI);
& & double theta = atan2(y, x) - 0.000003 * cos(x * x_M_PI);
& & return CLLocationCoordinate2DMake(z * sin(theta), z * cos(theta));
& & & & &&百度坐标系是在火星坐标系上进行二次加密,所以当从真实坐标转换到百度坐标时,需要先转换为火星坐标,再转换为百度坐标。火星坐标转换为真实坐标是大概值,因为算法本身是不可逆的!
可能你对以下的内容也感兴趣:
CopyRight & &老罗的博客(一亩三分地).&&All rights reserved.&&&&蜀ICP备号
本网站由作为空间服务商map选择及map偏移解决方案(一)_移动开发大全_优良自学吧 |
当前位置: >
> map选择及map偏移解决方案(一)优良自学吧提供map选择及map偏移解决方案(一),地图选择及地图偏移解决方案(一)
现在智能机跟移动互联网的飞速发展,给移动开发者带来了前所未有的机遇,大量的移动APP问世,这其中与手机相关性最大的莫过于LBS相关APP了,移动终端与PC最大的区别无非在于:便携移动性所带来的随时随地访问,还有一点就是GPS定位,传统地图选择及地图偏移解决方案(一)
现在智能机跟移动互联网的飞速发展,给移动开发者带来了前所未有的机遇,大量的移动APP问世,这其中与手机相关性最大的莫过于LBS相关APP了,移动终端与PC最大的区别无非在于:便携移动性所带来的随时随地访问,还有一点就是GPS定位,传统的PC只能通过IP来源大致取得用户城市等相关信息,但是移动终端上这得到了解决。
在开发LBS相关APP的过程中,总会遇到这么一个头疼的问题:如何选择地图及地图偏移问题.今天就个人所做项目中总结的经验来给大家分享一下关于这两个问题的解决:
1.地图选择
如何选择地图,个人觉得可以从以下几点考虑:
(1).定位准确度及定位消耗时间,哪个高,哪个快.
定位位置的工作机理是这样,首先通过wifi网络(最准确),基站,GPS定位用户的位置数据(一般是经纬度表示),
然后上传服务器,服务器对比后,下发定位的具体位置(比如迈克龙),然后打包整个信息发送给对方。对方收取
后,拿着位置去地图读数据。位置信息同样拉取(或者前者直接发送位置信息)。
(2).POI位置信息是否提供,数量级?(比如 mapbar地图POI数据3000万)
POI是“Point of Interest”的缩写,可以翻译成“兴趣点”吧,每个POI包含四方面信息,名称、类别、经度、纬度。
不同的地图搜集的POI数量是不同的, 影响的结果就是,在地图上能够显示“迈克龙”,而不是“南六道”。
(3).地图路径算法,哪个地图快,准确.提供的路径方式多.
这个是为了导航使用的,来源取自于导航数据。
(4).是否提供3D或者卫星方式?
提供更多的体验方式
(5).用户体验 ,启动速度,定位精准度。
流畅度,以及地图实现方式,矢量地图or栅格。googlemaps用的是栅格地图,而高德则是使用的矢量。矢量的好处是边下载,边编译,边展示。
(6).api使用难易度(这个貌似现在都差不多了,跟google兼容性比较好,可替换性很强,基本只要换个包就可以了)
(7).地图校正算法(百度地图等国内具有地图资质的地图提供商是不需要做纠偏,但是Google地图是需要的)
(8).包大小(如果一个地图jar或者so库过大,势必给应用带来更大的体积,虽然说不要纠结于几百K的大小,但是本着
能减小包大小就尽量减小的前提,还是有用的,比如Google地图在android手机上是不需要加载包的,相比百度地图可以省200多K)
(9).地图表示范围:是否有国外地图(例如,google地图拥有全球大多数国家的地图数据,而国内的百度地图等仅仅只有
国内的地图数据)
基于以上9点我觉得大家应该可以选择出一个合适的地图,我自己用的时候,是做一款IM产品里边有一个发送位置的功
能,中间有一个发送位置的功能,对于这个产品而言,其有几个特点:
1.APP在没有添加发送位置的情况下,包的大小已经达到7M了,对于android移动APP来说,这个大小已经算很大了,对于移动2G用户升级,或者流量偏少的用户而言,每次升级是一个很痛苦的过程,所以要慎重选择地图库。
2.由于这个APP定位是全球的,或者至少不仅仅是国内,所以基本排除了国内的地图服务提供商,或许有人会说,你怎么不国内选用国内的地图厂商,国外的版本选用国外的地图提供商,这里我只能说,对于开发者而言,能只维护一份代码,比维护多份好。
3.综合比较google地图跟百度地图在android机器上的表现来看,Google地图在整体用户体验上比百度地图好一个档次,包括启动加载速度,地图移动,放大,缩小等操作的流畅度等。
4.也许有人会说Google地图是国外的,Google跟中国政府的关系,会不会有Google地图加载速度比百度地图慢,或者Google地图被封的可能,这里我观察了目前大多数比较有名的移动APP,包括QQ2012,微信(4.0以前版本)等均是采用Google地图,所以这点大家不用担心。
基于以上几点最后选择了Google地图。(附件是个人APP)
关于如何解决Google地图存在的地图偏移,见下一篇。
(本文来自互联网,不代表搜站(/)的观点和立场)本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(),我们会及时处理和回复,谢谢编辑推荐最近更新& 【求助】为什么GPS轨迹在Google地图上偏移几百米,但放到Google Earth 上就很准确?
随缘就好,happy更佳
问题1:我用手机GPS记录的深圳梅林山公园的一段轨迹,通过 (六只脚)网站上传,叠加到google地图上漂移了起码500米,但同一个轨迹文件调入Google Earth却非常准确?(
起点原本在北环南侧的) 问题2:用同一个手机,同一款软件前几天记录的另一个轨迹,深圳马峦山的,不论是通过 (六只脚)网站上传,还是调入Google Earth却都非常准确? 诡异了(
这个很准) 问题3: 很多轨迹,在深圳市区到盐田也偏移数百米,但同一条轨迹到大鹏半岛后半程就很准确了。是人家GPS记录的不准,还是google地图故意做的手脚? 问题4:我问题1,2的轨迹在手机上显示的Baidu地图上,都很准。不是说天朝火星坐标和Google的真实GPS坐标有故意的偏移吗,但为何同一个轨迹文件,在Baidu 和 Google 上又都对了呢? 问题5:若天朝真用火星坐标来防导弹,那不是自欺欺人、掩耳盗铃吗? 关于问题1和2,应该和所谓天朝火星坐标没关系吧?
----------------------------------------
条条大路通拉萨
你最后一句已经自问自答了,火星运行轨道的影响,火星运行的目的就是掩耳盗铃,倒不是自欺,是欺P民.。问题3.4你再想下?想下...
伪驴,伪运动爱好者
电子地图如GOOGLE 地图和百度地图都加偏的了,而GOOGLE 地球是没有加偏的,所以会显示偏,轨迹可以用软件纠偏
----------------------------------------
人生茫茫数十载,出生了,读书了,毕业了,工作了,恋爱了,大肚了,结婚了,当爸了,中年了……
随缘就好,happy更佳
小空空 wrote:电子地图如GOOGLE 地图和百度地图都加偏的了,而GOOGLE 地球是没有加偏的,所以会显示偏,轨迹可以用软件纠偏笼统地说加偏,没法回答问题1,2,3啊
----------------------------------------
条条大路通拉萨
不要纠结了,请看附图,google的深圳湾大桥卫星图和地图交通...硬给你掰到一起的,火星就这样和地球接轨的... 800) this.width=800'/>可以理解你在大鹏湾的记录为何没偏了吧?4楼已说清楚了...深圳湾大桥的图实际上是下面2张这样的...中间这张是google earth,第一张是墙内的maps,第三张是墙外的maps...(三张图全是google的) 800) this.width=800'/> 800) this.width=800'/>
11:08:27 编辑
iPod-iPhone-iPad-iBe ...
加偏是非线性加偏...
特喜欢南澳玩
天朝特色,你懂的FQ后分分钟就明白了
特喜欢南澳玩
国产软件和地图都会把地球坐标转成火星坐标,所以你如果用国产软件记录的火星轨迹放在国产火星地图上看成了正确的国外软件和地图用的是地球坐标,所以你如果用国外软件记录的轨迹放在国产火星地图上看肯定就偏移了注意:GOOGLE MAP天朝地图为了满足天朝人口味特别采用火星坐标地图,GOOGLE EARTH是采用是地球坐标
dj9399 wrote:国产软件和地图都会把地球坐标转成火星坐标,所以你如果用国产软件记录的火星轨迹放在国产火星地图上看成了正确的国外软件和地图用的是地球坐标,所以你如果用国外软件记录的轨迹放在国产火星地图上看肯定就偏移了注意:GOOGLE MAP天朝地图为了满足天朝人口味特别采用火星坐标地图,GOOGLE EARTH是采用是地球坐标呵呵,这解释不能同意更多,贴主该看明白了...
有关KML KMZ的网站加载,你可以试试这个网站
帖子已挪8264网
dj9399 wrote:国产软件和地图都会把地球坐标转成火星坐标,所以你如果用国产软件记录的火星轨迹放在国产火星地图上看成了正确的
国外软件和地图用的是地球坐标,所以你如果用国外软件记录的轨迹放在国产火星地图上看肯定就偏移了
注意:GOOGLE MAP天朝地图为了满足天朝人口味特别采用火星坐标地图,GOOGLE EARTH是采用是地球坐标
因为Google China map的服务器被安在了天朝,所以嘛,也就只好被火星了,Google earth无关天朝,所以是地球人看的坐标。楼上说的很清楚,所有的导航软件只要是国产的,都是被火星的,加一句:别管是爬山还是汽车导航的,都是被火星的。非天朝产的导航软件包括地图,都是地球人看的坐标,这和Google earth一样。加一句:国外爬山导航软件在全世界都能用的,下载地图就是了。
& 【求助】为什么GPS轨迹在Google地图上偏移几百米,但放到Google Earth 上就很准确?
&邀请xuliang1215参加此活动
& 2000 - 2016 www.doyouhike.net
Version 4.7.8 -
19:42:59 +0800
粤ICP备号-2 &查看: 1194|回复: 12
求助,定位很准每次都钉在同一点但偏移所在20米(已解决)
这个很有道理~~只是我所在的几乎就在十字路口,凯立德却很少把我拉到这两条路上,更多的是把我拉到相邻的另一条小路上去了,呵
那个位置应该是一条路上的点,如果离道路不太远(大约50m)KLD都会把你拉到道路上,其他导航软件也有类似功能,只是KLD做得太过头了,也因此KLD老是分不清你是在主路上还是在辅路上。
答非所问,正常卫星漂移5-10米,地上漂移就是50-100米,除非机器在搜星比较不错的情况下,才会有所改变!
这是民用的,不是军用的,有点误差没关系啦。
那个位置应该是一条路上的点,如果离道路不太远(大约50m)KLD都会把你拉到道路上,其他导航软件也有类似功能,只是KLD做得太过头了,也因此KLD老是分不清你是在主路上还是在辅路上。-- by 会员 hbyjcwb (10/21/:28 PM)这个有道理。
我也有过这个情况,用***定位以下,以后就好了, 不过我是PPC手机。
我的飞歌高清也有这情况,但不影响导航,不理它~~,一两个月后又有新的来了。
那些讲道理都是扯蛋~~~不明白LZ意思,以前地图没这个问题。是主程序还是07地图不清楚,没时间去试。
今天换了好几个地点试,结果发现在大多次定位是准确的,即使是有所偏移也是在5米左右,所以在家的钉位不正常应该是受建筑物的影响所以偏移,应该是属正常范围内的定位偏移吧。再次感谢所有释疑的DX
谢谢各位~~~~~~~~昨天我又测了,有时候钉在家这儿,很准确,但今天测的却又钉在前些天出现过的那个点上,我也胡涂了。看来是要找个软件测试一下定位问题了,并感谢提供软件的那位DX
求助,定位很准每次都钉在同一点但偏移所在20米(已解决)
每次在家定位都要距离所在点20米左右,而且基本都是钉在同一个地点,这个定位到底是准还是不准呢,郁闷死了,难道偏差点也固定不变的啊。不管换用哪个主程序都一样,请DX释疑~~~~~ & & &解决原因:一定范围内偏移是正常的,与周边环境也密切相关
有点偏差是正常的,GPS信号的接收偏移为5-10米,你看你的GPS说明书一下吧
说明书上写着小于10米,所以觉得有点....
Powered by