问题简述、
为保障飞机起降安全而规定障碍物限制面以上的空间,用以限制机场及其周围地区障碍物的高度叫做机场净空。障碍物限制面是由国际民航组织《附件14··机场》规定。而我们需要根据给出的机场标高、跑道长度、磁方位以及障碍物的位置、高度信息来进行多障碍物评估。
问题分析、
评估需要先判定障碍物具体在哪些限制面内,然后计算该位置处的限制面面高与障碍物标高比较,得出评估结果。该问题难点有二:
- 障碍物具体在哪些限制面内的评定
- 多障碍物的自动化评估
程序简介、
解决本问题可以完全只用python,之所以引入excel,是为了简化数据输入,以及便于存储评估信息。
本程序有两个输入界面,用户可在excel中输入障碍物相关信息以及跑道磁方位(注意:输入的跑道磁方位取两方向中的小值,例:磁方位001/181的跑道,需要输入1),在python运行后需要输入机场跑道标高和跑道长度,完成输入,即可得到评估结果。
本程序输出界面在python,会输出跑道两个方向上每个障碍的评估结果(包括在哪个面内、是否穿透该面、面高多少米、穿透出多少米;注意:若该障碍物不在任何限制面内,输出结果只会显示障碍物名称)
程序优化、
本程序已经经过两次优化,未来的优化方向,是实现所有类跑道机场净空障碍物限制面评估自动化,而不是现在只能支持精密进近Ⅰ类跑道飞行区指标Ⅰ3、4的评估。优化完成后,预计在python运行后增加一个跑道类型输入界面,实现真正的机场净空障碍物限制面评估自动化。
附件一(程序源代码)
import math
import pandas as pd
df=pd.read_excel("机场净空障碍物计算.xlsx")
x = df['x']
y = df['y']
z = df['海拔高度']
n = df['障碍物']
m=df['跑道磁方位']
points=[]
a=eval(input("请输入机场标高(m):"))
b=eval(input("请输入跑道长度(m):"))
#测试
#set={(100,8100,20,29),(-450,10000,500,30),(2000,3400,9000,31)}
for i in range(len(x)):
point = (x[i], y[i], z[i],n[i])
points.append(point)
def panduan(x,y):
if -4000<=x<=4000:
if y<=math.sqrt(16000000-x*x)+b/2 and y>=-b/2-math.sqrt(16000000-x*x):
print("在内水平面内")
if z<45+a:
print("未穿透")
if z>=45+a:
print("已穿透,面高",45+a,"米","超出限制面",z-45-a,"米")
#内水平面边界判定
if math.sqrt(36000000-x*x)+b/2>y>math.sqrt(16000000-x*x)+b/2 :
print("在锥型面内")
if z<(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a:
print("未穿透")
if z>=(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a:
print("已穿透,面高",(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a,"米","超出限制面",z-(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05-45-a,"米")
if -1150-math.sqrt(36000000-x*x)<y<-b/2-math.sqrt(16000000-x*x) :
print("在锥型面内")
if z<(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05+45+a:
print("未穿透")
if z>=(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05+45+a:
print("已穿透,面高",(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05+45+a,"米","超出限制面",z-(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05-45-a,"米")
if -6000<=x<-4000 or 4000<x<=6000:
if y<=math.sqrt(36000000-x*x)+b/2 and y>=-b/2-math.sqrt(36000000-x*x):
print("在锥型面内")
if y>(b/2+60):
if z<(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a:
print("未穿透")
if z>=(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a:
print("已穿透,面高",(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05+45+a,"米","超出限制面",z-(math.sqrt(x*x+(y-b/2)*(y-b/2))-4000)*0.05-45-a,"米")
if -(b/2+60)<=y<=b/2+60:
if z<(math.sqrt(x*x)-4000)*0.05+45+a:
print("未穿透")
if z>=(math.sqrt(x*x)-4000)*0.05+45+a:
print("已穿透,面高",(math.sqrt(x*x)-4000)*0.05+45+a,"米","超出限制面",z-(math.sqrt(x*x)-4000)*0.05-45-a,"米")
if y<-(b/2+60):
if z<(math.sqrt(x*x+(y+b/2+60)*(y+b/2+60))-4000)*0.05+45+a:
print("未穿透")
if z>=(math.sqrt(x*x+(y+b/2+60)*(y+b/2+60))-4000)*0.05+45+a:
print("已穿透,面高",(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05+45+a,"米","超出限制面",z-(math.sqrt(x*x+(y+b/2)*(y+b/2))-4000)*0.05-45-a,"米")
#锥型面边界判定
if b/2+60<=y<=b/2+60+15000 and 0.15*y>=41.5-x and 0.15*y>=x+41.5:
if (b/2+60)<=y<b/2+60+3000:
print("在进近面第一段内")
if z<(y-(b/2+60))*0.02+a:
print("未穿透")
else :
print("已穿透,面高",(y-(b/2+60))*0.02+a,"米","超出限制面",z-(y-(b/2+60))*0.02-a,"米")
if b/2+60+3000<=y<b/2+60+6600:
print("在进近面第二段内")
if z<(y-(b/2+60+3000))*0.025+60+a:
print("未穿透")
else :
print("已穿透,面高",(y-(b/2+60+3000))*0.025+60+a,"米","超出限制面",z-(y-(b/2+60+3000))*0.025-60-a,"米")
if b/2+60+6600<=y<=(b/2+60+15000):
print("在进近面第三段内")
if z<136.5+a:
print("未穿透")
else :
print("已穿透,面高",136.5+a,"米","超出限制面",z-136.5-a,"米")
#进近面边界判定
if -(b/2+60+15000)<=y<=-(b/2+60) and -600<=x<=600 and 0.125*y<=-61.25-x and 0.125*y<=x-61.25:
print("在起飞爬升面内")
if z<(math.sqrt(y*y)-(b/2+60))*0.02+a:
print("未穿透")
else :
print("已穿透,面高",(math.sqrt(y*y)-(b/2+60))*0.02+a,"米","超出限制面",z-(math.sqrt(y*y)-(b/2+60))*0.02-a,"米")
#起飞爬升面边界判定
if 140<math.sqrt(x*x)<140+45/0.143 and -(b/2)-60<y<b/2+60:
print("在过渡面内")
if z<(math.sqrt(x*x)-140)*0.143+a:
print("未穿透")
else:
print("已穿透,面高",(math.sqrt(x*x)-140)*0.143+a,"米","超出限制面",z-(math.sqrt(x*x)-140)*0.143-a,"米")
#过渡面边界判定
print('磁方位',m[0],"为跑道入口方向")
for (x,y,z,n) in points:
print(n,"号障碍物")
panduan(x,y)
print("")
print('磁方位',m[0]+180,"为跑道入口方向")
for (x,y,z,n) in points:
print(n,"号障碍物")
panduan(x,-y)
print("")
障碍物信息
(保存在与python文件同一目录下的excel中)
附件二(程序运行结果)
附件三(机场净空障碍物限制面俯视图)