现在市面上有很多中地图,它们的坐标也是各式各样的,如果想在百度地图上,利用已有的一些轨迹信息,交通灯的位置信息在上面精准绘制,需要将坐标系转换为百度地图的专有坐标系。
一些常见的坐标系说明
- WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。 (谷歌使用)
- GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84 坐标系经加密后的坐标系。
- BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标, bd09mc表示百度墨卡托米制坐标。
非中国地区地图,服务坐标统一使用WGS84坐标。
百度地图的坐标转换API能够实现
- 单个坐标点的转换
- 多个坐标点的转换(最多一次支持10个)
(ps:文章最后有对官方API的解释)
我的改进代码(递归思想)
将要转换的数据分成每十个一组,递归转换
var index = 0,start=0,end=10;
var len = vehicle1[index].length;
var times = Math.ceil(len / 10);//每个vehicle[index]里需要处理的次数 Math.ceil向上取整
// 坐标转换完之后的回调函数
var translateCallback = function (data) {
var print = data.status==0? data : "坐标转换错误";
console.log(print);
//将转换好的数据替换掉原来的
vehicle1[index].splice(start,end-start,...data.points);
times--;
if(times>0){
TransGPS();
start=end;
end = (end+10)> len ? len : (end+10);
}
if(times == 0){
index++; //vehicle1[index]已经全部转换完毕
start=0;end=10;
if(index<vehicle1.length){//vehicle1还没有转换完
len = vehicle1[index].length;
times = len % 10 == 0 ? (len / 10) : (len / 10 + 1);
times = Math.ceil(len/10);
//递归调用
TransGPS();
}
else{
console.log("vehicle已经转换完毕");
//在此之后可以使用转换好的vehicle1
console.log(vehicle1);
LuShu(map, vehicle1, arr);
}
}
}
//转换坐标的函数
function TransGPS(){
var convertor = new BMapGL.Convertor();
//将每个ehicle[index]数组分成10个一组的小数组
var temp = vehicle1[index].slice(start,end);
convertor.translate(temp, COORDINATES_WGS84, COORDINATES_BD09, translateCallback)
}
setTimeout(TransGPS, 7000);
vehicle1是我待转的数据,二维数组,每个元素都是坐标个数超过10个的一维数组
官方代码说明:
<script type="text/javascript">
// 百度地图API功能
//谷歌坐标
var x = 116.32715863448607;
var y = 39.990912172420714;
var ggPoint = new BMapGL.Point(x,y);
//地图初始化
var bm = new BMapGL.Map("allmap");
bm.centerAndZoom(ggPoint, 15);
bm.addControl(new BMapGL.ZoomControl()); //添加缩放控件
//添加谷歌marker和label
var markergg = new BMapGL.Marker(ggPoint);
bm.addOverlay(markergg); //添加谷歌marker
var labelgg = new BMapGL.Label("未转换的谷歌标注(错误)",{offset:new BMapGL.Size(20,-10)});
markergg.setLabel(labelgg); //添加谷歌label
//坐标转换完之后的回调函数
translateCallback = function (data){
console.log(data);
if(data.status === 0) {
var marker = new BMapGL.Marker(data.points[0]);
bm.addOverlay(marker);
var label = new BMapGL.Label("转换后的百度标注(正确)",{offset:new BMapGL.Size(20,-10)});
marker.setLabel(label); //添加百度label
bm.setCenter(data.points[0]);
}
}
setTimeout(function(){
var convertor = new BMapGL.Convertor();
var pointArr = [];
pointArr.push(ggPoint);
convertor.translate(pointArr, COORDINATES_GCJ02, COORDINATES_BD09, translateCallback)
}, 1000);
}, 1000);
/**
* 坐标常量说明:
* COORDINATES_WGS84 = 1, WGS84坐标
* COORDINATES_WGS84_MC = 2, WGS84的平面墨卡托坐标
* COORDINATES_BD09 = 5, 百度bd09经纬度坐标
* COORDINATES_BD09_MC = 6,百度
**/
</script>
- setTimeout函数里convertor.translate(待转换的点, COORDINATES_GCJ02, COORDINATES_BD09,回调函数名)
- 回调函数里 translateCallback,对转换后得到的数据data进行操作
data的状态说明
data.status(状态码) | 含义 |
---|---|
0 | 正常 |
1 | 内部错误 |
21 | from非法 |
22 | to非法 |
24 | 转换格式coords非法 |
25 | 转换个数(coords)超过限制,非法 |
官方API网址:地图JS API示例 | 百度地图开放平台