用python实现机场净空障碍物限制面评估自动化

问题简述

为保障飞机起降安全而规定障碍物限制面以上的空间,用以限制机场及其周围地区障碍物的高度叫做机场净空。障碍物限制面是由国际民航组织《附件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中)

附件二(程序运行结果)

附件三(机场净空障碍物限制面俯视图)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值