地图弧线计算

208 阅读1分钟

使用echarts地图或其他地图,根据起始坐标和终点坐标生成弧线方法

  1. 核心代码
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)
  1. 效果图