百度坐标转换成WGS84坐标

admin0条评论 302 次浏览


需求:将百度坐标转换成WGS84坐标
实现:
首先介绍一下国内诸多繁杂的坐标系,众所周知,美国GPS使用的是WGS84坐标,但是在中国,国家出于安全的考虑,在地图发布和出版的时候,对84坐标进行了一次非线性加偏,得到的坐标我们称之为GCJ02坐标系,俗称火星坐标。另外,国内许多地图公司,可能是由于业务的需求,或者是商业竞争的某些原因,在火星坐标的基础上又进行了一次非线性加偏,得到了自己的坐标系统。百度就是这么一家公司。百度在GCJ02的基础上进行了BD-09二次非线性加偏,得到了自己的百度坐标系统。这样对于百度自己公司来说,或许是有利的,但是对于我们开发人员来说,简直是烦透了。
下面简单介绍一下国内的一些地图服务提供商使用的坐标系情况:
这里写图片描述
目前,百度提供了一个用于坐标转换的api,http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=longitude&y=latitude
其中
• from: 来源坐标系 (0表示原始GPS坐标,2表示Google坐标)
• to: 转换后的坐标 (4就是百度自己啦,好像这个必须是4才行)
• x: 精度
• y: 纬度
返回的结果是一个json字符串: {“error”:0,”x”:”MTIxLjUwMDIyODIxNDk2″,”y”:”MzEuMjM1ODUwMjYwMTE3″}
• error:是结果是否出错标志位,”0″表示OK
• x: 百度坐标系的精度(Base64加密)
y: 百度坐标系的纬度(Base64加密);
我在网上搜集了这两个数字代表的意义:
http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=longitude&y=latitude
1:GPS设备获取的角度坐标;
2:GPS获取的米制坐标、sogou地图所用坐标;
3:google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标
4:3中列表地图坐标对应的米制坐标
5:百度地图采用的经纬度坐标
6:百度地图采用的米制坐标
7:mapbar地图坐标;
8:51地图坐标 否 默认为1,即GPS设备获取的坐标
to 目的坐标类型 有两种可供选择:5、6。
5:bd09ll(百度经纬度坐标),
6:bd09mc(百度米制经纬度坐标); 否 默认为5,即bd09ll(百度坐标)

以上都是用于将84坐标转换为百度坐标所做的工作,下面,我们来谈一下,如何实现坐标的反向转换,即百度坐标转换为84坐标。
我在网上找了很多的算法,大部分的算法都局限于一次偏移,即百度坐标与火星坐标的互转,火星坐标与地球坐标的互转等等,对于百度坐标转84坐标这种二次加偏很少提到。
对此,我尝试将百度坐标先转换为火星坐标,然后再将该火星坐标转换为地球坐标,结果并不如人意,最低的误差为60米,多的甚至有600多米的误差,只好作罢。算法我也不贴出来了,有兴趣的同学可以去网上自行寻找。
这里,我采用的是一种取巧的办法,具体方法如下:
百度坐标和GPS坐标转换在很近的距离时偏差非常接近。
假设你有百度坐标:x1=116.397428,y1=39.90923
把这个坐标当成GPS坐标,通过接口获得他的百度坐标:x2=116.41004950566,y2=39.916979519873

通过计算就可以得到GPS的坐标:
x = 2*x1-x2,y = 2*y1-y2
x=116.38480649434001
y=39.901480480127。
为了验证这一方法的准确性,我取了中国东南西北14个主要城市的坐标进行测试,得到的结果误差最大的为偏差13米,最小的为0.x米。综合误差为6米。具体测试结果稍后贴上。
下面我画一个简图,用以说明这个问题。
这里写图片描述
G代表原始的未转换的地球坐标;
B代表的是将G通过百度api转换之后的百度坐标;
G’代表的是将B点通过百度api转换之后的坐标;
假设谷歌坐标转换为百度坐标之后的偏移值很小的话,那么G点坐标完美的等于
2B-G’。经查证,谷歌坐标转换为百度坐标之后的偏移值大概为几百米,这个距离其实是可以忽略的,所以使用这种方法,用百度自有的api去解决偏移库的问题,然后忽略掉转换偏移值的影响。
当然,这种方法也有一个很大的弊端,就是要求这两个点必须在同一个偏移库内,如果恰好是位于两个不同的偏移库的话,可能误差就比较大了。
另外,还有一种方法,目前正准备进行进一步的研究,就是自己建立一个偏移库,用这个偏移库去进一步消除这方面的影响:正有待研究。
这里说一下,在线转换的弊端:百度在线API转换工具对于转换的数据量其实是有限制的,每个key的话只能转换大约5000条数据,一个账号最多可以申请20个key,所以如果数据量很大话,其实是不推荐使用这种在线转换的,这也是研究本地偏移库的初衷。另外由于web端的受到的限制可能会比较多,网速,并发请求之类的都可能对结果造成影响,影响用户体验,所以以上方法只是作为一个参考。