龙源期刊网 http://www.qikan.com.cn
MICAPS第四类数据格式Python处理库的实现和应用
作者:朱枫 袁鹏艳 段中夏 来源:《河南科技》2017年第23期
摘 要:本文基于Python语言设计和实现了MICAPS第四类数据格式的通用接口库Diamond4,包含数据读写,格点到站点的插值,数据格式转换等功能。Diamond4库简洁高效,可有效支持对MICAPS数据的本地开发。最后展示了Diamond4库结合其他Python第三方库在新乡市气象台本地业务应用的两个实例:结合Bokeh库的多模式站点两米温度的自动提取和结合Arcpy库的多模式降水对比邮票图的自动生成。 关键词:MICAPS;第四类数据;Diamond4库
中图分类号:P451 文献标识码:A 文章编号:1003-5168(2017)12-0152-03 The Implementation and Application of a Python Library for MICAPS Fourth Format Data
Zhu Feng1 Yuan Pengyan2 Duan Zhongxia1
(1.Xinxiang Meteorological Bureau,Xinxiang Henan 453003;2.Yanjin Meteorological Bureau,Yanjin Henan 453200)
Abstract: We designed and implemented a Python library named Diamond4 for processing the MICAPS fourth format data. The library consists the utilities of data writing and reading, grid-to-station data extraction, format conversion et al. which will efficiently support the native
development on the MICAPS data. The last showed Diamond4 library combined with other Python third party libraries in two instances of local meteorological station business application in Xinxiang city: Combining site of multi mode Bokeh base two meters temperature automatic extraction and combination of Arcpy library multi mode contrast stamp for automatic generation of precipitation. Keywords: MICAPS;fourth format data;Diamod4 library
分气象信息综合分析和处理系统MICAPS(Meteorology Information Comprehensive Analysis Process System)是我國气象业务的基础软件[1],其中第四类数据是MICAPS系统自定义的格点数据格式。国家气象信息中心通过CMACast卫星系统下发的多种气象实况数据和数值预报模式结果通常最终被解码成第四类格式,供MICAPS系统可视化呈现或处理。因此,基层预报员接触最多的气象数据通常以MICAPS第四类格式呈现。这种格式都是单个的
龙源期刊网 http://www.qikan.com.cn
文本文件,相对于Grib1、Grib2、HDF或者NetCDF等高级格式要简单明了许多。鉴于MICAPS第四类数据使用的简单性和普遍性,如何开发一个通用的、简洁高效的针对MICAPS第四类数据格式的程序接口库,以便基层预报员在这类格式的数据基础上定制开发本地化应用,是本文要解决的主要问题。 1 设计背景和思路
Python是一门简洁且功能强大的开源编程语言,因其活跃的社区支持,涌现了大量优秀的第三方库,涵盖了网络编程、数据库、嵌入式、游戏等多个领域[2],尤其在科学计算和机器学习领域,Python变得越来越受欢迎。此外,Python语言还被应用于气象领域,主要用于开发、绘图[3]。Python简明易学,且易快速上手。考虑到需要开发的程序接口库主要供基层预报员使用,因此,选择Python作为开发语言不仅可以减少开发成本,也能减少学习和使用的难度。本文设计开发的库是纯Python库,除Python内置的库外,不依赖其他第三方库,包括在科学计算领域使用较多的Numpy、Pandas等,以保证其简洁易用。因为MICAPS数据格式的头文件大都以英文Diamond开头,因此将处理MICAPS第四类数据格式的库命名为Diamond4。
MICAPS第四类数据具有统一的定义方式(具体定义说明请参见官方论坛网站或MICAPS自带的帮助文档),每个第四类数据文件的文件头都对特定的属性进行了明确规定,各个属性以空格分割,只是具体数据不一样。因此,可以将MICAPS第四类数据看做一个类,将一个MICAPS第四类文件视为一个对象。很自然地,采用面向对象的设计方式,更容易保障代码的结构性和逻辑性。Diamond4类根据MICAPS第四类数据的格式,定义了相应属性,每个属性作为对象的一个字段,实际格点数据也是对象的一个字段,以一维列表的方式保存数据部分。格点数据是二维数据,用一维列表保存,是为了减少内存消耗,为了更容易获取格点值,可以定义取值方法Value,根据行列号直接获取对应值,从而在逻辑上屏蔽数据实际存储的组织方式。在此基础上,可以很方便地再设计定义其他方法。 2 Diamond4库的主要实现
下面的代码给出了Diamond4实现的主要部分,即初始化方法和取值方法。Diamond4类库的具体实现代码托管在GitHub上,网址为https:
//github.com/LuckyBoy314/MeteoPlot/blob/master/pyMicaps.py。 class Diamond4(object): diamond = 4 #构造函数
def __init__(self, file_path):
龙源期刊网 http://www.qikan.com.cn
with open(file_path, 'r') as f: #读入原始数据
data_raw = [word for line in f.readlines() if line[:-1].strip() for word in line.split()] #定义相关属性
self.doc = data_raw[2].decode('gbk') # 说明字符串 (self.size_lon, # 经度(x方向)格距, 一般为正 self.size_lat, # 纬度(y方向)格距,有正负号 self.lon_start, # 起始经度 self.lon_end, # 终止经度 self.lat_start, # 起始纬度
self.lat_end) = (float(i) for i in data_raw[9:15]) # 终止纬度 (self.cols, # 纬向格点数目,即列数
self.rows) = (int(i) for i in data_raw[15:17]) # 经向格点数目,即行数 # 日期时间处理
(month, day, hour, interval) = data_raw[4:8] year = data_raw[3] if len(year) == 2:
year = ('20' + year) if int(year) < 49 else ('19' + year) elif len(year) == 4: pass else: