这篇文章面向的对象是气象系统内部有身份认证,且需要从天擎气象大数据云平台下载数据的科研业务人员。
气象系统内部获取气象数据的最佳途径就是通过天擎大数据云平台下载,用户注册、数据权限申请等天擎网站上有详细的资料。数据大致分两类:结构化数据和非结构化数据,简单的理解结构化数据就是存放在数据库中的数据,比如站点观测数据。非结构化数据主要是再分析等模式输出格点数据以及天气雷达观测数据等,主要以文件形式存储。对于非结构化数据可以通过挂载盘符下载更为方便,也可以使用程序进行下载。结构化数据不能通过挂载盘符的方式下载数据,编写程序是最重要的下载方式了。
天擎定义了一系列的数据接口(MUSIC)进行规范,还开发了多种编程语言(Fortran, C/C++, Java, Python等)的库(SDK)供编写程序时调用,以简化程序编写过程。天擎网站也包含了多种语言的下载数据Demo程序供用户参考,本文仅仅是提供一个更多的下载数据工具选项而已。
这里主要介绍如何利用MeteoInfoLab编写Jython程序下载数据。MeteoInfo底层是Java开发的,脚本语言使用Jython(和Python语法一致,但利用Java实现其编译和运行),能够非常方便地调用Java语言开发程序包。MeteoInfo的相关文档可以在网上查找(
http://www.meteothink.org/docs/index.html
)。电脑上安装好MeteoInfo后可以通过下面的步骤从天擎上下载数据。
登录天擎网站,导航到“服务与支持”栏下的“开发SDK”页面。
下载Java语言SDK:music-sdk-java-2.0.rar,然后解压生成music-sdk-java-v2.0目录,里面包含了一个客户端配置文件(client.config)和一些以.jar为后缀的Java软件包文件。
大院里的用户不用修改配置文件的内容,大院外用户如何修改可以参考天擎网上相关文档。数据查询和下载客户端初始化时需要读取这个配置文件(client.config)里的内容,但是目前SDK中这部分不够灵活,无法自定义配置文件路径,只能将配置文件放置在MeteoInfo软件主目录中(也就是MeteoInfo的启动路径)客户端初始化时才能找到这个配置文件,否则会报错无法启动客户端。
将client.config文件复制粘贴到MeteoInfo软件主目录中。
3. 运行MeteoInfoLab编写数据下载程序
双击MeteoInfo主目录中的MeteoInfoLab.exe运行MeteoInfoLab软件,或者通过创建快捷方式运行,或者在Windows中也可以用milab.bat运行。其它操作系统的运行方式参考MeteoInfo相关文档(
http://www.meteothink.org/docs/introduction/chinese/download_run.html
)。
这里以中国地面站点小时观测数据为例,下载一个时次的数据并保存为一个数据文件。
from java.util import HashMap
lib_path = r"D:\Working\data\music\music-sdk-java-v2.0"
for fn in os.listdir(lib_path):
if fn.endswith(".jar"):
if fn not in sys.path:
sys.path.append(os.path.join(lib_path, fn))
from cma.music import RetFilesInfo
from cma.music.client import DataQueryClient
client = DataQueryClient()
userId = "******"
pwd = "******"
interfaceId = "getSurfEleByTime"
params = HashMap()
params.put("dataCode", "SURF_CHN_MUL_HOR")
params.put("elements", "Station_ID_C,Lat,Lon,Alti,PRE_1h,PRS,RHU,VIS,WIN_S_Avg_2mi,WIN_D_Avg_2mi,Q_PRS")
st = datetime.datetime(2023,11,30,0)
tstr = st.strftime('%Y%m%d%H0000')
params.put("times", tstr)
params.put("orderby", "Station_ID_C:ASC")
dataFormat = "TEXT"
savePath = "F:/Temp/test_{}.txt".format(tstr)
print(savePath)
retFilesInfo = RetFilesInfo()
client.initResources()
rst = client.callAPI_to_saveAsFile(userId, pwd, interfaceId, params, dataFormat, savePath, retFilesInfo)
client.destroyResources()
这里对程序做一个简单的说明。第一行是从Java包里导入HashMap用于存放下载所用的相关参数(程序第24-32行),其中“dataCode”是资料代码,这里用的是中国地面观测小时数据,代码为“SURF_CHN_MUL_HOR”;“elements”是要下载的要素代码,比如“PRE_1h”是小时降水要素的代码;“times”是数据时间,格式为“YYYYMMDDHHMISS”。这些代码都可以在天擎网站上查询到。
程序3-8行是导入Java SDK的所有软件包(music-sdk-java-v2.0目录中的所有.jar文件),第4行代码中的具体路径需要根据自己电脑中music-sdk-java-v2.0目录所在路径进行修改。
导入相关Java软件包后就可以使用包中的类实现相关功能,比较关键的是“DataQueryClient”类,也就是数据查询下载客户端类,创建客户端对象client(15行代码),初始化、调用相关API、释放资源(42-47行代码)。程序第22行定义了数据下载所使用的接口为“getSurfEleByTime”(指定时间的地面资料检索接口)。程序第34-37行定义了下载生成的数据文件类型和数据文件保存路径。客户端对象的“callAPI_to_saveAsFile”方法获取查询数据结果并保存为文件(44行代码)。最后需要注意的是用户名密码进行相应的修改(17-19行代码)。
代码编写完成后点击MeteoInfoLab上的“Run script”按钮(绿色三角形)运行代码,或者按F5快捷键运行代码,运行完成后在数据文件保存路径中可以找到下载后的数据文件test_20221130000000.txt。
数据文件中第一行是数据查询返回信息,第二行是字段名,后面是每个站点的数据。用MeteoInfoLab读取并绘制站点气压散点图。
程序代码:
fn = 'F:/Temp/test_20221130000000.txt'
df = DataFrame.read_table(fn, format='%s%7f', skiprows=1)
print(df.head())
lon = df['Lon'].values
lat = df['Lat'].values
prs = df['PRS'].values
axesm()
geoshow('country')
levs = arange(500, 1000, 20)
scatter(lon, lat, prs, levs, edgecolor=None, size=4, cmap='matlab_jet')
colorbar()
xlim(72, 136)
ylim(16, 55)
axesm(position=[0.12,0.16,0.15,0.2], axison=False)
geoshow('cn_border', facecolor=(0,0,255))
xlim(106, 123)
ylim(2, 23)
批量下载多时次站点数据和下载单个时次数据类似,但需要用循环更新时间相关的参数。下面的例子定义了下载数据的起始和结束时间(st和et),用while循环对每个时次的数据进行下载,注意在循环体内最后st时间需要加一小时。客户端对象client资源初始化和释放的语句可以放在循环外面。
from java.util import HashMap
lib_path = r"D:\Working\data\music\music-sdk-java-v2.0"
for fn in os.listdir(lib_path):
if fn.endswith(".jar"):
if