用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中)

附件二(程序运行结果)

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

相关推荐

  1. Python爬虫实战014:利用requests库实现自动评论

    2023-12-10 14:12:02       36 阅读
  2. iOS自动打包如何Python实现

    2023-12-10 14:12:02       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 14:12:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 14:12:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 14:12:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 14:12:02       18 阅读

热门阅读

  1. LINQ【C#】

    2023-12-10 14:12:02       32 阅读
  2. C#.net使用npgsql批量写入数据入库到postgresql数据库

    2023-12-10 14:12:02       34 阅读
  3. pytorch 笔记:dist 和 cdist

    2023-12-10 14:12:02       36 阅读
  4. C语言中getchar函数

    2023-12-10 14:12:02       37 阅读
  5. Codeforces Round 912 (Div. 2)补题

    2023-12-10 14:12:02       36 阅读
  6. paddle detection 怎么解析配置文件

    2023-12-10 14:12:02       29 阅读
  7. postgresql设置免密登录

    2023-12-10 14:12:02       33 阅读
  8. nodejs流

    nodejs流

    2023-12-10 14:12:02      30 阅读
  9. Linux环境FFTW源码编译 | WSL编译报错解决

    2023-12-10 14:12:02       32 阅读
  10. Electron:白话Electron开发桌面端应用

    2023-12-10 14:12:02       31 阅读
  11. K8S学习指南(4)-minikube的使用

    2023-12-10 14:12:02       37 阅读