概述
//判断两条航线水平面每两个航点之间的线是否相交
//计算无人机到达交叉点的时间差
//计算无人机到达交叉点的高度差
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;
};
最后
以上就是欣慰花瓣为你收集整理的js判断带海拔高度的两条经纬度带是否交叉有撞机风险的全部内容,希望文章能够帮你解决js判断带海拔高度的两条经纬度带是否交叉有撞机风险所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复