前言
最近在公司项目开发中遇到这个问题,查了很久,但是没有找到相关解决办法,最后想了一个比较简单地实现,记录一下,同时发出来供大家讨论、参考,有什么不足之处敬请指正,有什么高见敬请指导!!!
一般来说,要计算两条轨迹的重合度,由于轨迹是两根线,且可能存在误差,比如车辆在同一道路的不同车道上,这样就需要将轨迹点拟合到路网上,通过计算行驶中经过的路段里程与总里程的比值,可以得到轨迹重合度,但是由于我们公司主要业务不是道路相关,也没有相关路网数据,所以此路不通。
也考虑过使用第三方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;
此处只列出了部分关键代码,需要源码留言联系。。。
如果感觉对你有帮助,收藏加关注哦!!!
版权声明:本文为Tom_Jay原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。