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
纯属业余
直奔主题
隔离期间
每天一课
出来惊呆所有人