关于粗略计算两条轨迹重合度

您所在的位置:网站首页 轨迹和路线 关于粗略计算两条轨迹重合度

关于粗略计算两条轨迹重合度

2023-08-18 20:33| 来源: 网络整理| 查看: 265

前言

最近在公司项目开发中遇到这个问题,查了很久,但是没有找到相关解决办法,最后想了一个比较简单地实现,记录一下,同时发出来供大家讨论、参考,有什么不足之处敬请指正,有什么高见敬请指导!!!

一般来说,要计算两条轨迹的重合度,由于轨迹是两根线,且可能存在误差,比如车辆在同一道路的不同车道上,这样就需要将轨迹点拟合到路网上,通过计算行驶中经过的路段里程与总里程的比值,可以得到轨迹重合度,但是由于我们公司主要业务不是道路相关,也没有相关路网数据,所以此路不通。

也考虑过使用第三方API实现路网拟合(某德、某度都有相关接口),计算轨迹重合度,但是一般来说像这种API都需要一笔不小的开支且有流量限制(资金允许的话推荐使用,更精确)。

最后,经过反复研究思考,终于想到这个方法,但是准确度和效率上可能有待提高,大家有什么想法欢迎一块讨论。

实现原理

计算轨迹1的缓冲区,求出轨迹2上落在缓冲区内的轨迹点的里程,再除以轨迹1的总里程;

为了更准确一点,可以再对轨迹2计算缓冲区,求出轨迹1落在缓冲区内的轨迹点的里程,再除以轨迹2的总里程,结果返回两个比率的较小值;

关键代码

该实现过程主要依赖于turf.js地理空间分析库turf.js中文网

//datasOne 轨迹1数据,两条轨迹做相同处理 //将轨迹数组处理成经纬度坐标串,此处在坐标中添加了一个轨迹点索引,为方便后面求重合的轨迹里程 var index=-1; datasOne=datasOne.map(function (track) { index++; return [track[0],track[1],index]; }); //定义轨迹、缓冲区 var lineOne=turf.lineString(datasOne);//轨迹1 var datasOneBuffer=turf.buffer(lineOne,30, {units:“meters”}); //缓冲半径30米 //计算轨迹总里程 var lineOneLength=turf.length(lineOne,{units: “meters”}); //计算落在缓冲区内的轨迹点 //datasTwoBuffer 轨迹2的缓冲区 var result1=turf.pointsWithinPolygon(turf.points(datasOne),datasTwoBuffer).features; //计算落在缓冲区内的轨迹里程 var sumResult1=0; for (let i = 0; i < result1.length-1; i++) { var latLngNow=result1[i].geometry.coordinates, latLngNext=result1[i+1].geometry.coordinates; //只有当轨迹点索引连续时计算为重合里程 if(latLngNow[2]+1==latLngNext[2]){ sumResult1+=turf.distance(turf.point(latLngNow),turf.point(latLngNext),{units: “meters”}); } } //计算轨迹重合度 var coincide1=sumResult1/lineOneLength;

此处只列出了部分关键代码,需要源码留言联系。。。

如果感觉对你有帮助,收藏加关注哦!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3