使用步骤
- 在chrome 浏览器打开百度地图;
- 选择路线
- 点选起点和终点, 多路线方案和选择途经点

- 看到线路图

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

- 运行代码

同步方法
//获取原始坐标点
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倍