9.2.5 百度坐标转换
如果直接将用户发送给公众账号的地理位置(经纬度坐标)显示在百度地图上,会有很大偏差,并且这种偏差是非线性的,有时误差可能在几十米范围,有时误差又会在几百米范围。这样往往会发生一些非常尴尬的事情,例如,用户在城市街道上行走,使用周边搜索应用查找附近的厕所,可是在百度地图上显示的结果是用户在城市周边的河流中,没有查找到任何厕所信息,这种情况下,用户马上就会取消关注公众账号。由此可见,这种偏差是非常致命的,如果不解决,则做出来的周边搜索应用也就没有任何意义!上述偏差产生的原因是不同的地图采用了不同的坐标系。
国际经纬度坐标标准为WGS-84(World Geodetic System1984),它是为GPS(全球定位系统)使用而建立的坐标系统,通过遍布世界的卫星观测站观测到的坐标建立。WGS-84的精度非常高,对于普通的应用而言,几乎可以理解为零误差。
中国国家测绘局出于安全考虑,禁止国内出版的各种地图(包括电子地图)对外使用WGS-84坐标系,必须至少采用GCJ-02对地理位置进行首次加密。GCJ-02是由国家测绘局制定的一套坐标系,它是一种对经纬度数据的加密算法,即加入随机偏差。这就意味着,不管是哪种地图,只要在国内出版,就必须对真实地理坐标进行加密处理,使其产生偏差。
如果在国内出版的地图都使用国家测绘局规定的GCJ-02坐标系,那么在地图A上定位得到的经纬度坐标显示在地图B上也不会有偏差或偏差很小,因为它们都使用了相同的GCJ-02坐标系。但是,百度地图在GCJ-02的基础上,又进行了BD-09二次加密措施(通常也将BD-09称为“百度坐标系”)。这也就意味着,从其他地图上得到的经纬度坐标在百度地图上显示,一定会有偏差,而从百度地图上得到的坐标显示在其他地图上也同样会有偏差。
微信的Android版使用的是搜搜地图,微信的iPhone版使用的是高德地图,这两种地图采用的都是GCJ-02坐标系,如果要将GCJ-02坐标显示在百度地图上,就必须先将GCJ-02坐标转换成百度坐标,再在百度地图上显示就不会有偏差。百度地图支持将其他体系坐标迁移转换成百度坐标,但受国家相关测绘规定的限制,只支持单向转换,不支持将百度坐标转换成其他坐标。
将其他体系坐标转换成百度坐标的接口地址如下:
- http://api.map.baidu.com/ag/coord/convert?x=LNG&y=LAT&from=FROM&to=TO&mode=MODE
上述接口地址中的参数说明如表9-5所示。
表9-5 其他体系坐标转换成百度坐标的接口参数说明
从表9-5可以看出,百度地图提供的接口只支持如下两个方向的坐标转换:
●将WGS-84坐标(GPS)转换成百度坐标;
●将GCJ-02坐标(谷歌地图、高德地图、搜搜地图等)转换成百度坐标。
参数mode表示转换模式,分为批量转换和单个转换。如果mode=1,表示批量转换,参数x中的多个经度间用逗号分隔,参数y中的多个纬度间也用逗号分隔;如果mode为空或其他值,表示单个转换,参数x、y均只传一个值。
1)单个坐标转换的使用示例如下:
- http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=121.56665&y=31.11606
单个坐标转换结果如下所示:
2)批量坐标转换的使用示例如下:
- http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=121.56665,
- 106.714311&y=31.11606,26.590633&mode=1
批量坐标转换结果如下所示:
- [{"error":0,"x":"MTIxLjU3MzA4MDY2MTI1","y":"MzEuMTIyNDA3NTI2MjYz"},{"error":0,"x":"MTA2LjcyMDgxODU5ODky","y":"MjYuNTk2NTU4NzkzMTA5"}]
上述返回结果中的参数说明见表9-6。
表9-6 坐标转换接口返回参数说明
返回参数中的x、y是经Base64编码后的,需要使用Base64进行解码。笔者推荐一款Java Base64类库,该项目的主页地址为http://www.sauronsoftware.it/projects/javabase64/。笔者下载使用的是javabase64-1.3.1.jar,使用它进行Base64解码的示例如下:
- // Base64解码
- String lng = Base64.decode(x, "UTF-8");
- String lat = Base64.decode(y, “UTF-8”);
说明 ①在国内出版的地图中,谷歌地图、高德地图、搜搜地图采用的是GCJ-02坐标系,百度地图采用的是BD-09坐标系。②百度地图的坐标转换接口非公开,如果要使用需发邮件至mapapi@baidu.com咨询,会有专人答复。