本人接触网页地图以来已有5年之窗,与百度地图打交道少说也有3年以上了,百度坐标转换从最开始的只支持单组坐标转换到现在的批量转换(限制每次100组),而且是无规律的算法纠偏,根本不好复制这种算法到本地进行转换,每次只能乖乖的ajax get到百度服务接口返回结果。
这种做法对于单组坐标的转换体验上影响不大,但是当我们需要纠偏的坐标量很多的时候,按正常的写法ajax异步请求,而且每次最多只能传入100组坐标,只能分批来调,而且是异步处理,还要定义一堆全局变量记住状态值,代码量多且复杂,项目大就难以管理了。
今天终于让我想出了一个优化的解决办法,对这个服务进行封装,闭包内进行异步方法递归,把回调方法传递到最后结果那一处执行并返回结果对象。废话不多说了,直接亮代码,写的不好处欢迎提意见!
baidu.maps.convertor.js文件:
/**
*! 百度地图坐标转换接口
*! 支持从gps(真实)坐标、google坐标、soso坐标等转换为百度坐标
*! 传入百度坐标对象,返回纠偏后的百度坐标对象,注意要在百度地图api环境下调用
*/
(function() {
var _BAIDU_KEY_ = "xxxxxx"; // 请填写您申请的密钥
var point_count = [];
var res = [];
var convertor = (function() {
return {
translate: translate
};
/**
* point 为百度的坐标对象,可以是单个坐标对象,也可以为多个坐标对象的数组
* type取值:
* 1:GPS设备获取的角度坐标;
2:GPS获取的米制坐标、sogou地图所用坐标;
3:google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标
4:3中列表地图坐标对应的米制坐标
5:百度地图采用的经纬度坐标
6:百度地图采用的米制坐标
7:mapbar地图坐标;
8:51地图坐标
返回:
回调函数:function(res) { }
res为坐标对象的数组,单组坐标纠偏直接这样取:res[0]
*/
function translate(point, type, fn) {
var coordarr = [];
if(Object.prototype.toString.call(point) === "[object Array]") {
// 多个坐标的数组
$.map(point, function(position) {
coordarr.push(position);
});
} else {
// 单个坐标
coordarr.push(point);
}
var n = res.length;
/**
*! 这里使用二维数组存储结构集,给每一个调用赋予独立索引,
*! 为了防止批量调用异步请求时全局对象被最后一次执行的结果替换
*/
res[n] = [];
point_count[n] = 0;
reqgeoconv(coordarr, type, fn, n, 0);
}
function reqgeoconv(coords, type, fn, n, reqCount) {
point_count[n] = coords.length;
var list = [];
for (var i = reqCount; i < reqCount + 100; i++) { // (限制:每次最多支持100个)
if (i >= point_count[n])
break;
list.push(coords[i].lng + "," + coords[i].lat);
}
var url = [];
url.push("http://api.map.baidu.com/geoconv/v1/?");
url.push("coords=");
url.push(list.join(";"));
url.push("&ak=");
url.push(_BAIDU_KEY_);
url.push("&from=");
url.push(type);
url.push("&to=5");
url.push("&callback=?");
$.getJSON(url.join(""),
function(data) {
if (data.status === 0) {
$.map(data.result, function(bcoord) {
res[n].push(new BMap.Point(bcoord.x, bcoord.y));
});
var included = res[n].length;
if(included < point_count[n]) {
reqgeoconv(coords, type, fn, n, included); // 递归异步方法,循环到有结果为止
} else {
fn(res[n]);
}
}
});
}
}());
window['baidumap'] = window['baidumap'] || {};
window['baidumap']['convertor'] = convertor;
}());
var baidu = baidu || {};
baidu.maps = window['baidumap'];var paths = [
new BMap.Point(116.343532, 23.552301),
new BMap.Point(116.108865, 23.446878),
new BMap.Point(116.332589, 23.986241),
new BMap.Point(116.223445, 23.899533)
];
baidu.maps.convertor.translate(paths, 1, function(res) {
$.map(res, function(p) {
// your code...
});
});当然对于只是单组坐标这样调用就可以了:
baidu.maps.convertor.translate(new BMap.Point(113.663445, 24.789533), 1, function(res) {
var point = res[0];
// your code...
});原文地址:http://blog.csdn.net/cienit/article/details/46538879