首先, 我们了解一下为什么要坐标转换
国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
其次, 我们在网上搜到有通过http://api.map.baidu.com/ag/coord/convert?from=[0/2]&to=4&x=纬度&y=经度
这个URL来进行转换的, 其中0代表WGS-84即标准GPS设备返回的坐标, 2代表国测局的标准, 显然4就是百度地图认的坐标了. 但我遍搜网络, 这个接口是没有文档的(但是确实可用). 因为会碰到跨域的问题(CORS), 所以就用了jQuery中script标签跨域的方式来执行, 结果这个脚本也被百度”回收”了, 当然, 网上还是有痕迹的, 我把它保存了一下, gist. 我没在这上面花太多时间, 并没有测它支不支持批量转换(看网友写了一个transMore, 是必须批量送入, 但底层还是一次次分别请求, 不合我意).
而事实上, 百度已经提供了文档化的坐标转换接口, 并且原生就支持批量请求. 显然, 我们应该用文档化的方法, 只是这种用法需要申请成为一个开发者, 添加一个应用. 这不是小事么, 于是我小包装了一下, 见此gist.
仅仅有一点小要求, 就是传入的坐标, 键名分别是lon
(经度)和lat
和(纬度), 并且可以传入一个(传入一个, 返回也是一个), 或者一组
转换一个坐标:
BMap.Convertor.translate({lon:lon, lat:lat}, 1, 5, bdkey, function (point, status, message) {
if(status) return show(message || "转换坐标出错:"+status, true);
var curmarker = new BMap.Marker(point);
baidumap.addOverlay(curmarker);
});
一组坐标:
BMap.Convertor.translate([{lon:lon, lat:lat},...], 1, 5, bdkey, function (points, status, message) {
if(status) return show(message || "转换坐标出错:"+status, true);
// 遍历points
});