接上篇文章“Cesium中点至直线的垂足点和距离计算”,在计算出点到直线的垂足后,就可以将定位坐标点确定到直线。但有一个问题是,由于路线是有一定宽度的,一部分点是落在路线中线上,其他的点是在中线和路线外边线中间的,所以不能简单的把所有的点都计算到路线中线上。
同样为了效果真实,最终的想法先计算一个固定的偏移距离,然后分别计算出其他原始坐标点到路线直线的垂足,再根据偏移距离,计算原始坐标点向垂足点偏移此距离后的坐标点。
通过上篇文章我们可以计算出参考点到直线的垂足点以及参考点到垂足点的距离,把这个距离作为参考偏移距离。
计算原理如下图,已知起始点a 和终点b 两点的坐标,偏移点c 到 起点a 的距离为len,求c点的坐标。
求 cy 可以根据: len / a到b距离 = a到c垂直距离 / a 到 b的垂直距离,首先求a到b的距离,公式如下:
r = sqrt((x1- x2)*(x1 - x2) +(y1 - y2)*(y1 - y2));
然后计算cy的值
cy = (len*(y2-y1))/r + y1;
同理,可以计算出cx的值:
cx = (len*(x2-x1))/r + x1;
整理相关 JS 方法如下(使用经纬度坐标):
// 计算点到指定点偏移固定距离的坐标点 // a : 起始点 // b : 终点 // len : 偏移距离 function getNewRollPoint(a, b, len) { var r = Math.sqrt((a.Longitude - b.Longitude) * (a.Longitude - b.Longitude) + (a.Latitude - b.Latitude) * (a.Latitude - b.Latitude)); var cx = (len * (b.Longitude - a.Longitude)) / r + a.Longitude; var cy = (len * (b.Latitude - a.Latitude)) / r + a.Latitude; return { Longitude: cx, Latitude: cy } }
通过上面的方法,可以计算点到指定点偏移固定距离的坐标点。