Js judges whether two latitude and longitude belts with altitude cross and there is a risk of collision

//判断两条航线水平面每两个航点之间的线是否相交
            //计算无人机到达交叉点的时间差
            //计算无人机到达交叉点的高度差
            for (var i = 0; i < position.length; i++) {
    
    
                for (var q = i + 1; q < position.length; q++) {
    
    
                    for (var j = 0; j < position[i].length - 1; j++) {
    
    
                        for (var k = 0; k < position[q].length - 1; k++) {
    
    
                            var data = segmentsIntr(position[i][j], position[i][j + 1], position[q][k], position[q][k + 1])
                            console.log("交叉点坐标" + data)
                            if (data != false) {
    
    //相交线根据速度求时间差
                                var item0 = [];
                                var item1 = [];
                                var alt0 = [];
                                var alt1 = [];
                                for (var p = 0; p < j + 1; p++) {
    
    
                                    item0.push(position[i][p]);
                                    alt0.push(altarr[i][p]);
                                }
                                item0.push([keepSixDecimal(data[0]).toString(), keepSixDecimal(data[1]).toString()]);
                                //求带海拔高度的经纬度之间的距离
                                var distance = getDistance(position[i][j][1], position[i][j][0], position[i][j + 1][1], position[i][j + 1][0]);//交叉点出现航段总距离
                                var distance0 = getDistance(position[i][j][1], position[i][j][0], data[1], data[0]);//交叉点与前一个航点直线距离
                                var ratio = (distance0/distance).toFixed(2);//距离比例保留两位小数
                                var height1 = (Math.abs(altarr[i][j] - altarr[i][j + 1])*ratio).toFixed(2);//交叉点与前一个航点高度距离
                                var distance00 = Math.sqrt(Math.pow(distance0,2)+Math.pow(height1,2)).toFixed(2);//交叉点与上一个点实际距离
                                var time1 = 0;
                                var distance1 = 0;
                                for (var z = 0; z < item0.length - 1; z++) {
    
    //每段航线距离/每段航线速度=每段航线时间
                                    if (z == item0.length - 2) {
    
    
                                        distance1 = distance00;
                                    } else {
    
    
                                        distance1 = getDistance(item0[z][1], item0[z][0], item0[z + 1][1], item0[z + 1][0]);
                                    }
                                    var time = distance1 / speedarr[i][z];
                                    time1 = time1 + time;
                                }
                                for (var y = 0; y < k + 1; y++) {
    
    
                                    item1.push(position[q][y])
                                    alt1.push(altarr[q][y])
                                }
                                item1.push([keepSixDecimal(data[0]).toString(), keepSixDecimal(data[1]).toString()]);
                                var distance = getDistance(position[q][k][1], position[q][k][0], position[q][k + 1][1], position[q][k + 1][0]);//交叉点出现航段总距离
                                var distance0 = getDistance(position[q][k][1], position[q][k][0], data[1], data[0]);//交叉点与前一个航点直线距离
                                var ratio = (distance0/distance).toFixed(2);//距离比例保留两位小数
                                var height2 = (Math.abs(altarr[q][k] - altarr[q][k + 1])*ratio).toFixed(2);//交叉点与前一个航点高度距离
                                var distance01 = Math.sqrt(Math.pow(distance0,2)+Math.pow(height2,2)).toFixed(2);//交叉点与上一个点实际距离
                                var time2 = 0;
                                var distance2 = 0;
                                for (var x = 0; x < item1.length - 1; x++) {
    
    
                                    if (x == item1.length - 2) {
    
    
                                        distance2 = distance01;
                                    } else {
    
    
                                        distance2 = distance2 + getDistance(item1[x][1], item1[x][0], item1[x + 1][1], item1[x + 1][0]);
                                    }
                                    var time = distance2 / speedarr[q][x];
                                    time2 = time2 + time;
                                }
                                if (Math.abs(time1 - time2) < 10) {
    
    //时间差 10秒
                                    // alert("导入的航线有撞机风险,请检查航线!!!")
                                    log.error(namearr[i] + "和" + namearr[q] + "有撞机风险,请检查航线!!!")
                                }else{
    
    //判断高度差
                                    var height01 = Number(height1)+altarr[i][j];
                                    var height02 = Number(height2)+altarr[q][k];
                                    if(Math.abs(height01 - height02) <= 5){
    
    //高度差 10秒
                                        log.error(namearr[i] + "和" + namearr[q] + "有撞机风险,请检查航线!!!")
                                    }
                                }
                            }
                        }
                    }
                }
            }
//两点之间距离 m
function getDistance( lat1,  lng1,  lat2,  lng2){
    
    
    var radLat1 = lat1*Math.PI / 180.0;
    var radLat2 = lat2*Math.PI / 180.0;
    var a = radLat1 - radLat2;
    var  b = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;
    var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
        Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
    s = s *6378.137 ;// EARTH_RADIUS;
    s = Math.round(s * 10000) / 10000 * 1000;
    return s;
}

function keepSixDecimal(num) {
    
    
    var result = Math.round(num * 1000000) / 1000000;
    return result;
};

Guess you like

Origin blog.csdn.net/qq_36580022/article/details/128156041