/**
* 获取坐标点集合的贝塞尔曲线
* @param {*} latlngs 坐标点集合
*/
getBezierLine(latlngs){
let paths = [],
num = 200 // 返回坐标点个数
for(let i = 0;i < latlngs.length - 1;i++){
let path = this.getBezierPoint(latlngs[i], latlngs[i+1], num)
if(i != 0) path = path.slice(1)
paths = paths.concat(path)
}
return paths
},
/**
* 获取两点间贝赛尔曲线坐标点
* @param {*} point_start 开始坐标
* @param {*} point_end 结束坐标
* @param {*} num 返回坐标个数
* @returns
*/
getBezierPoint(point_start, point_end, num = 100){
// 地理坐标转换成像素坐标
var startPoint = {x: point_start.lat, y: point_start.lng}
var endPoint = {x: point_end.lat, y: point_end.lng}
//求出相对的第三个点,用于固定曲线的弯曲度,
// 已知两点p1(x1,y1)、p2(x2,y2)和两点所对应的角度A和B,x3、y3是对应第三点的坐标
//x3 = (x1*cotB+x2*cotA+y2-y1)/(cotA+cotB)
//y3 = (y1*cotB+y2*cotA+x1-x2)/(cotA+cotB)
let angleValue = 2.14 // 对应角度值
let x3 = (startPoint.x*angleValue+endPoint.x*angleValue-startPoint.y+endPoint.y)/(2*angleValue)
let y3 = (startPoint.y*angleValue+endPoint.y*angleValue-endPoint.x+startPoint.x)/(2*angleValue)
// 计算两点的贝塞尔曲线坐标集合
let paths=[];
for(let i = 0;i <= num;i++){
let t = i / num;
let x = (1 - t) * (1 - t) * startPoint.x + 2 * t * (1 - t) * x3 + t * t * endPoint.x;
let y = (1 - t) * (1 - t) * startPoint.y + 2 * t * (1 - t) * y3 + t * t * endPoint.y;
// 坐标
let res_point = new L.latLng([x,y])
paths.push(res_point);
}
return paths;
},
leaflet曲线2
于 2022-06-17 08:58:58 首次发布