PolyLine 的colorList问题 ?
我调用了腾讯地图的web 路径规划 API,用到了如下接口:https://lbs.qq.com/service/webService/webServiceGuide/webServiceRoute 。 业务场景如下图,其实就想做个物流的地图跟踪: [图片] 基本的现实逻辑是: 例如有ABCD 四个点, 将这4个点,A,D 作为接口的必须参数的起始(from)和终止点(to), 而BC...或者更多点则传入作为中间途径点(waypoints)。 这样,接口就会返回一连串点数据。 处理后,作为微信小程序的polyline 组件绑定的数据。 从而渲染出polyline。 现在遇到这样的问题: 例如上图, 小车 所在的位置实际上是 C 点,所在的位置。 我希望ABC作为已经走过的路径,和CD作为还未走过的路径。 在渲染上用颜色进行区分。 进进而我想着使用colorList 属性去实现。 我遇到了这样几个问题,希望得到指点: 返回的数据点,原始数据量在千级, 经过压缩,现在是百级(普遍的在400以上,800以下。) 也就是说,polyline的渲染,是由非常多点组成的多段。 此时,专门去定义一个动态的colorList 是否合适 ? ABCD,作为参数传入,返回的规划路径中,其实并不含有ABCD这几个点坐标。 也就是说,我好像没办法通过C点的坐标,去分割返回的一系列点,从而确定“走过的路径” 和 “未走过的路径”,也就没有办法做到 通过colorList 去划分不同的颜色。 请问,这种情况下。 我应该如何实现我想要的效果呢? (我考虑过分成两个PolyLine 合并成一个,但是我发现在渲染上,两段PolyLine存在明显的延迟感,用户体验不佳,所以不打算这么做。请问有更好的办法吗? 谢谢) 以下是可能相关的一些代码(不太好复现demo所以就放这里了): 【小程序端】,polyline数据获取和赋值渲染: routePlan(arr,status) {
let that = this;
wx.request({
url: RequestApiList.HOST + RequestApiList.ROUTE.getPolyLine,
data: {
arr: arr,
},
method: "GET",
header: {
"content-type": "application/x-www-form-urlencoded;charset=utf-8",
},
success: (result) => {
let finalArr = result.data.finalArr;
let polyLineData = [{
points: finalArr,
color: status == "0" ? "#00000055" : "#0044ff52",
// borderColor: "#FA6400",
// borderWidth: 2, //还有这里,真机上无效,电脑开发者工具有效 - -
width: 10,
arrowLine: true,
}, ];
that.setData({
polyline: polyLineData,
});
},
});
},
【服务端】,获取点数据并解析压缩处理: exports.getPolyLine = (req, res) => {
//获取并解析路径规划
//接收参数
// [
// { latitude: 22.9966, longitude: 108.877001 },//这是起始点
// { latitude: 27.91461, longitude: 109.931688 },//中间的是途径点
// { latitude: 23.803199, longitude: 114.32622 },
// { latitude: 31.351548, longitude: 113.798876 },
// { latitude: 33.722325, longitude: 119.423876 }//这是终点
// ]
function routePlan(from, waypoints, to) {
return new Promise((resolve, reject) => {
request(
`https://apis.map.qq.com/ws/direction/v1/driving/?from=${from.latitude},${from.longitude}&waypoints=${waypoints}&to=${to.latitude},${to.longitude}&output=json&callback=cb&key=YFIBZ-XXXXXXXXXXXXXXXXX-CDBVB&no_step=1&get_mp=0&road_type=0`,
(error, response, body) => {
if (!error && response.statusCode == 200) {
let coors = JSON.parse(body).result.routes[0].polyline;
let pl = [];
var kr = 1000000;
for (var i = 2; i < coors.length; i++) {
coors[i] = Number(coors[i - 2]) + Number(coors[i]) / kr;
}
for (var i = 0; i < coors.length; i += 2) {
pl.push({
latitude: coors[i],
longitude: coors[i + 1],
});
}
resolve(pl);
}
if (error) { //错误处理
resolve([]);
console.log("error:", error);
}
}
);
});
}
async function AsyncHandler(arr) {
console.time("getPolyLine");
let from = arr[0];
let to = arr[arr.length - 1];
let temp = arr;
temp.pop();
temp.shift();
// console.log(temp);
let tempPositionArr = [];
for (let i = 0; i < temp.length; i++) {
let lng = temp[i].longitude;
let lat = temp[i].latitude;
let positionStr = lat + "," + lng;
tempPositionArr.push(positionStr);
}
let waypoints = tempPositionArr.join(";");
let finalArr = await routePlan(from, waypoints, to);
let k = 1;
let j = 0;
let removeArr = [];
for (let i = 1; i < finalArr.length - 1; i++) { //点数据压缩
j = j + k;
if (finalArr[j]) {
removeArr.push(finalArr[j]);
finalArr.splice(j, 50)//数据过滤密度为50
}
}
console.timeEnd("getPolyLine");
// console.log(finalArr.length)
// console.log("removeArr:", removeArr.length)
return res.send({ finalArr: finalArr })
}
let arr = JSON.parse(req.query.arr);
AsyncHandler(arr);
};