轨迹优化-内插算法

719 阅读1分钟

有时候地图轨迹采集点不均匀,在做轨迹回放时速度很不均匀,忽快忽慢,通过内插采集点可以平滑播放,原理是把轨迹中每条直线分割成若干等长的线段,代码如下

//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为一个提供空间计算的工具库