使用echarts地图或其他地图,根据起始坐标和终点坐标生成弧线方法
- 核心代码
function getCurveByTwoPoints(obj1, obj2,step) {
if(!obj1 || !obj2){
return []
}
let B1 = function(x) {
return 1 - 2 * x + x * x
};
let B2 = function(x) {
return 2 * x - 2 * x * x
};
let B3 = function(x) {
return x * x
};
let curveCoordinates = [];
// 步长
let count = step || 30;
let t, h, h2, lat3, lng3, j, t2;
let i = 0;
let inc = 0;
let lat1 = parseFloat(obj1[1]);
let lat2 = parseFloat(obj2[1]);
let lng1 = parseFloat(obj1[0]);
let lng2 = parseFloat(obj2[0]);
if (lng2 > lng1) {
if (parseFloat(lng2 - lng1) > 180) {
if (lng1 < 0) {
lng1 = parseFloat(180 + 180 + lng1)
}
}
}
if (lng1 > lng2) {
if (parseFloat(lng1 - lng2) > 180) {
if (lng2 < 0) {
lng2 = parseFloat(180 + 180 + lng2)
}
}
}
j = 0;
t2 = 0;
if (lat2 == lat1) {
t = 0;
h = lng1 - lng2
} else {
if (lng2 == lng1) {
t = Math.PI / 2;
h = lat1 - lat2
} else {
t = Math.atan((lat2 - lat1) / (lng2 - lng1));
h = (lat2 - lat1) / Math.sin(t)
}
}
if (t2 == 0) {
// 控制弧度 百度地图是5
t2 = (t + (Math.PI / 3))
}
h2 = h / 2;
lng3 = h2 * Math.cos(t2) + lng1;
lat3 = h2 * Math.sin(t2) + lat1;
for (i = 0; i < count + 1; i++) {
curveCoordinates.push([(lng1 * B1(inc) + lng3 * B2(inc)) + lng2 * B3(inc),(lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc))]);
inc = inc + (1 / count)
}
return curveCoordinates
}
// 调用方法
let startXY = [117.813969, 26.790277]
let endXY = [118.789087, 27.523081]
let res = getCurveByTwoPoints(startXY,endXY)
let getLine = turf.lineString(res)
- 效果图