百度导航路线坐标转换

373 阅读1分钟

使用步骤

  1. 在chrome 浏览器打开百度地图;
  2. 选择路线
  3. 点选起点和终点, 多路线方案和选择途经点

  1. 看到线路图

5.在地图控件上右击打开控制台, 不能在地图上右击, 也可以通过F12 打开

  1. 运行代码

同步方法

//获取原始坐标点
let pointsList =map.getOverlays().filter(item => item.constructor.name === 'a').filter(item => item._config.strokeColor === '#00bd00').map(item => item.points)

pointsList = pointsList.reduce((pre, next) =>pre.concat(next), [])


let targetArr = [];

let coordTranslate = function ({lng,lat}) {
 
    return new Promise((reslove, reject) => {
        $.ajax({
        url: `https://api.map.baidu.com/geoconv/v1/?coords=${lng},${lat}&from=6&to=5&ak=你的百度秘钥`,
        type: "GET",
        dataType: "jsonp",
        success: function (data) {
            reslove({
                  longitude: data.result[0].x,
                latitude: data.result[0].y
            }) 
        }
    });
    })
   
}


// 用法
async function translatePoints(pointsList) {
     let beginTime = +new Date();
  for(let i = 0; i <= pointsList.length-1; i++) {
   let res =   await coordTranslate(pointsList[i]);
    console.log(   `${(  ( (i+1) / pointsList.length) *100).toFixed(2)}%, 当前第${i+1}项, 共${ pointsList.length}项`   )
   targetArr.push(res)
    if(i ==  pointsList.length-1) {
        let endTime = +new Date();
        console.log("转换坐标共用时"+(endTime-beginTime) / 1000 +"s");
        console.log(JSON.stringify(targetArr))
    }
  }
 
}

translatePoints(pointsList)

输出结果

并发方法


//获取原始坐标点
let pointsList =map.getOverlays().filter(item => item.constructor.name === 'a').filter(item => item._config.strokeColor === '#00bd00').map(item => item.points)

pointsList = pointsList.reduce((pre, next) =>pre.concat(next), [])

pointsList = pointsList.map( ({lat,lng},index) =>({

    index,
    old: {
        lat,
        lng
    }
}))




//转换函数
let coordTranslate = function (record) {
    let {lng, lat} = record.old;
    return new Promise((reslove, reject) => {
        $.ajax({
        url: `https://api.map.baidu.com/geoconv/v1/?coords=${lng},${lat}&from=6&to=5&ak=你的百度秘钥`,
        type: "GET",
        dataType: "jsonp",
        success: function (data) {
            record.new = {
                 longitude: data.result[0].x,
                latitude: data.result[0].y 
            }
            reslove( record) 
        }
    });
    })
   
}

//并发函数, 并发量百度个人账号官方限制每秒100 次
let tanslatePoints = async  (points, limit = 100) => {
   
    let groupArr = []
    let length = Math.floor( points.length / limit) ;
    
    //分组
    for( let i = 0; i < length; i++ ) {
        groupArr.push([...points].slice(i * limit, (i+1) * limit ))
      
        if(i == length-1 ) {
              groupArr.push([...points].slice((i+1) * limit,  points.length - 1 ))        
        }
    }


    for(let i = 0; i <= groupArr.length-1; i++) {
          let beginTime = +new Date();
        await  Promise.all( groupArr[i].map(item => coordTranslate(item) ))   
         let endTime = +new Date();
          console.log(   `${(  ( (i+1) / groupArr.length) *100).toFixed(2)}%, 当前第${i+1}组, 共${ groupArr.length}组, 用时${(endTime-beginTime) / 1000 } s`   )
    }


    return groupArr.reduce((a,b) => a.concat(b), []).map(item => item.new)

}

tanslatePoints(pointsList).then(res => {
    console.log(res)
});

输出结果

结论

推荐使用第二种方法, 效率更高, 效率提高了近5倍