有时候地图轨迹采集点不均匀,在做轨迹回放时速度很不均匀,忽快忽慢,通过内插采集点可以平滑播放,原理是把轨迹中每条直线分割成若干等长的线段,代码如下
//coordinates:[[lon,lat],[lon,lat]],distance:单位km
const interpolation = (coordinates, distance) => {
const point2arry = (point) => point.geometry.coordinates
const line2points = (start, end, distance) => {
const list = [start]
const alongsFn = (start, end) => {
if (turf.distance(start, end) > distance) {
const along = turf.along(turf.lineString([start, end]), distance)
const array=point2arry(along)
list.push(array)
alongsFn(array, end)
}
}
alongsFn(start, end)
list.push(end)
return list
}
const result = []
coordinates.reduce((prev, curr) => (result.push(...line2points(prev, curr, distance)), curr))
return result
}
处理前
处理后
在一次偶然机会,发现自己重新发明了一次轮子,turf中有一个lineChunk函数可以实现此功能,不过lineChunk返回的是一个个的线段,有些重复数据需要处理
//coordinates:[[lon,lat],[lon,lat]],distance:单位km
const interpolation=(coordinates,distance)=>{
const collection=turf.lineChunk(turf.lineString(coordinates),distance)
const coords=collection.features.map(feature=>turf.coordAll(feature))
const list=[coords[0][0]]
coords.forEach(coord=>list.push(coord[1]))
return list
}
备注:turf为一个提供空间计算的工具库