百度地图API实现批量坐标转换(傻瓜式教程)

现在市面上有很多中地图,它们的坐标也是各式各样的,如果想在百度地图上,利用已有的一些轨迹信息,交通灯的位置信息在上面精准绘制,需要将坐标系转换为百度地图的专有坐标系。


一些常见的坐标系说明

  • 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内部错误
21from非法
22to非法
24转换格式coords非法
25转换个数(coords)超过限制,非法

     官方API网址地图JS API示例 | 百度地图开放平台


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值