NOTAM瘦身

文摘   科技   2022-06-23 16:15   广东  



NOTAM长度问题


你可能越来越多的看到飞行员戴着近视眼镜飞行,这不只是因为体检放宽了,还因为他们看NOTAM太认真,每次飞行前半斤重的NOTAM一万字起,一个字也不能落下。(打游戏主要造成散光,这个另外找地方抬杠)


随之而来的是焦虑,网友说得好,听君一席话,如听一席话。意思是你啰里巴嗦半天,人家却听了个寂寞。NOTAM也是如此,堆砌了各种看似有用实则没用的信息,偶尔的关键信息还可能被垃圾信息淹没。


例如


1、NOTAM会在多个机场反复提醒,RAIM预测始终被监控,不会影响你的航班;或者0点到24点,都满足要求。要知道,不飞RNP AR的话,根本用不着RAIM预测。


2、鸟情通报,这个季节会有什么鸟,是鹌鹑还是麻鸭,我也不知道几点会出来,反正你机组要小心。前文我们介绍过,机组是不可能躲鸟的,所以这都是垃圾信息。


3、PBN时代,NDB台、指点标台的各种不正常,其实都关了也不影响飞行,这部分属于备份信息,能查到就行,不需要事先看。


4、有些是空管需要了解,而对机组却没什么用的信息,比如ADS-B的融合运行,对机组而言,应答机和ADS-B是同一个设备,不存在融合的需求。


5、还有很多或是时间久远、或是对飞行毫无影响的内容,占据了不少的篇幅。


怎么办


首先解决人的问题。任何产品的品质提升,需要靠用户的力量,单靠供应商是不行的。公司的运控部门收集各路情报,做成NOTAM给机组,所以运控是供应商,机组是用户。如果运控有相当一部分人本身就是机组,这个产品就能升级,NOTAM就能瘦身。签派员负责收集,飞行员负责分析。


其次是技术手段,NOTAM是纯文本,直接做文字分析即可,如果手上的NOTAM是PDF格式,先转文本:


import pdfplumber #引入pdf处理模块
data='' #清空data变量
with pdfplumber.open('notam.pdf'as pdf: #打开notam.pdf
    for page in pdf.pages: #逐页处理
        txt=page.extract_text() #提取本页文本
        data += txt  #叠加到data
    with open('notamraw.txt''w', encoding='UTF-8'as file: #创建一个文本文件
        file.write(data) #全部文本写入


好了,我们得到NOTAM的原始文本notamraw.txt,接下来提取每条通告的编号、时效、内容,然后加以分析。


import re
import pandas as pd
with open(r'notamraw.txt''r', encoding='UTF-8'as file:
    data=file.readlines()  # 逐行读取
content=''
idlist,validlist,contlist,typelist=[],[],[],[]
idlist2,validlist2,contlist2,typelist2=[],[],[],[]
for line in data:  # 遍历每条metar
    res = re.findall(r'\b[A-Z]{1}\d{4}/\d{2}|\b[A-Z]{2}\d{2,3}/\d{2}',line)  # 检测是否存在编号
    if res!=[]:
        id = re.findall(r'\b[A-Z]{1}\d{4}/\d{2}|\b[A-Z]{2}\d{2,3}/\d{2}', content) #提取编号
        if id==[]:
            id=['--']
        valid = re.findall(r'\bVALID.*', content)  # 提取时效
        if valid==[]:
            valid=['--']
        # 判断是否有用
        kill='鸟情|鸟类|ADS-B.*融合运行|此通告对起飞和着陆性能均无影响' \
             '|NDB.*不可用|NDB.*不工作|NDB.*限|NDB.*关闭|NDB.*不提供使用' \
             '|VOR.*不可用|VOR.*不工作|VOR.*限|VOR.*关闭|VOR.*不提供使用' \
             '|DME.*不可用|DME.*不工作|DME.*限|DME.*关闭|DME.*不提供使用' \
             '|MM.*不可用|信标.*以.*不可用|RAIM PREDICTION IS ALWAYS UNDER MONITORING'
        tokill=re.findall(kill, content)
        if len(tokill)==0#有用
            idlist.append(id[0])
            validlist.append(valid[0])
            contlist.append(content)
        else:  #没用
            idlist2.append(id[0])
            validlist2.append(valid[0])
            contlist2.append(content)
        content='' #清零
    content += line #逐行叠加内容
notamdf = {"编号": idlist, "时效": validlist, "内容":contlist}
df = pd.DataFrame(notamdf)  # 生成数据表格
df.to_csv('notam1.csv'',', encoding='ANSI')
notamdf = {"编号": idlist2, "时效": validlist2, "内容":contlist2}
df = pd.DataFrame(notamdf)  # 生成数据表格
df.to_csv('notam2.csv'',', encoding='ANSI')


结果是NOTAM被瘦身为2部分,notam1.csv是给机组看的,notam2.csv是不需要看的,这部分可以留存备用。用国内航行通告试了一下,大约能瘦身50%左右,如果找几个机组人员仔细分析剩下的通告,并针对18-22行进一步补充,相信可以达到瘦身90%的效果。


包含经纬度信息的通告,还可以进一步绘制成地图。


有兴趣的飞行员可以一起来学编程:


钉钉扫码学Python


纯属业余

直奔主题

隔离期间

每天一课

出来惊呆所有人




Ubuntu330
简约是王道 Keep It Simple, Stupid