首先, 我们了解一下为什么要坐标转换
国际经纬度坐标标准为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
});
网友评论