何林, 张雅斌, 任杰, 冯洁琼
(1. 陕西省气象信息中心, 西安 710014; 2. 秦岭和黄土高原生态环境气象重点实验室, 西安 710014;3. 陕西师范大学计算机科学学院, 西安 710119)
全球气候变暖背景下,中国极端天气气候事件明显增多,强度明显增强,气象灾害的多发性、极端性日益突出。2021年7月20日,郑州出现201.9 mm的极端小时雨强,打破了中国大陆暴雨气象观测记录历史极值[1]。准确、及时、便捷的天气实况与预报信息,在政府决策、公众出行、自然灾害防御、工农业生产等各方面都发挥着越来越重要的作用。随着中国综合气象观测业务的快速发展,以及对天气状况精密监测的重视程度越来越高,常规通过地面站、雷达、卫星等手段获取的实况观测数据,从种类、时空分辨率和数据量上都有较大提升。但多种类、多来源的自动化观测数据,意义不同、质量不齐、时空代表性存在差异,如果不能有序地处理和发布,将对公众获取天气实况及开展气象服务造成困扰。
近年来,通过对多源观测数据融合处理,研发高时空分辨率的格点实况分析产品,并以此开展定时、定点、定量的精细化天气服务成为气象领域的研究热点。李梦迪等[2]提出采用雨量站观测数据格点化、局地雨量计订正雷达定量估计降水的方法,研发了高时空分辨率、高精度的雷达-雨量计降水融合产品,经检验该产品对极端降水有较好地捕捉和监测能力。李超等[3]基于美国国家海洋和大气管理局(National Oceanic and Atmospheric Administration,NOAA)开发的局地分析与预报系统(local analysis and prediction system,LAPS),进行本地化数据接入和参数优化,生成了覆盖全国范围、3 km/1 km空间分辨率的实况数据集,包含气温、风速、湿度、降水等要素,并探讨了该实况数据集在航空、保险等公共气象服务领域的应用。师春香等[4]研发了陆面同化、融合降水、海表温度、三维云等要素丰富的格点实况产品,在数据质量、时效性等方面都显示出较大优势,在全国气象部门投入业务使用。龙柯吉等[5]、俞剑蔚等[6]、黄勤等[7]分别对该系列实况产品的气温、降水、相对湿度等关键要素在四川、江苏、陕西等不同区域和地形下开展了适用性评估及应用。彭亮等[8]基于Android 平台和百度地图开发组件包,设计了满足用户室内外定位需求的位置服务,结合虚拟现实技术,构建三维模型场景,便于用户浏览包括天气在内的周边环境,并对前往目的地进行路径规划。姜淦等[9]将旅游气象服务和位置天气相结合,研发了移动端手机APP应用,聚合气象可视化产品、地理信息和景点信息等,为旅游用户及时获取目的地天气预报、线路天气和旅游景点等综合服务信息提供便利。范保松等[10]以解决气象信息传播“最后一公里”问题为导向,研发了基于位置服务的智慧气象信息服务系统,实现天气预报和实况数据的网格化展示。
为规避传统实况天气服务存在的站点分布不均、序列长短不一等诸多限制,在天气实况产品的应用和服务方面开展研究,现选取1 km空间分辨率的格点融合产品作为背景数据,采用FastAPI框架搭建基于位置的天气实况服务(Weather-LBS)。该服务以RestFul风格的数据调用接口呈现,将时间、经纬度信息作为输入参数,通过最近邻和双线性插值算法计算任意点的气象要素数值,实现用户实时获取任意时间和位置的天气实况信息,包括气温、降水、风向、风速等用户较为敏感和关注的气象要素。为保证数据调用的安全性,引入OAuth2认证机制;采用气象数据统一服务接口(meteorological unified service interface community,MUSIC)标准进行接口封装,保证服务发布的规范性。
多源融合实况分析产品(analysis of real time on 1 km resolution product,ART_1 km)由国家气象信息中心研制并发布,由CMA高分辨率陆面数据同化系统(high resolution china meteorological administration land data assimilation system,HRCLDAS)和多源融合降水分析系统(source merged precipitation analysis system,CMPAS)生成。产品格式为GRIB2,包括降水、2 m气温、10 m风、2 m比湿4个气象要素的14种产品[11]。产品时间分辨率为1 h,下发时效为整点之后5 min以内。其中,融合降水要素根据应用需求,可达到10 min滚动更新。产品空间分辨率为0.01°×0.01°(1 km),全国产品空间覆盖范围为东经70°~140°,北纬15°~60°,共计3 150万个网格点,并可根据应用场景,将各省所辖范围或自定义范围裁剪后形成分区域要素产品。
基于位置的服务(location based services, LBS)是指综合利用移动互联网、卫星定位和地理信息技术,由服务供应商根据用户的位置信息和上下文信息提供个性化的信息资源和基础服务[12],气象服务是LBS的重要应用场景之一。Weather-LBS服务采用基于位置服务的思想,集成多种信息技术和插值方法,屏蔽服务系统与专业化的气象格点数据处理之间的技术壁垒,为各类应用终端提供简洁、易用的天气实况数据接口。按照软件分层思想,将该服务分为数据访问层、业务逻辑层、接口服务层和应用层4个部分,总体架构如图1所示。
图1 基于位置的天气实况服务(Weather-LBS)整体架构Fig.1 Overall architecture of location-based service (Weather-LBS)
FastAPI 是一个基于标准Python语言的类型提示、用于快速构建应用程序接口的高性能web应用框架。它定义了一套网络开发和部署的软件架构,集成了异步服务网关接口ASGI路由匹配、数据验证和设置管理等功能库,通过强制类型检查以减少人为编码错误,使web服务的开发效率成倍提升。同时具备良好的编辑器支持、自动生成交互式文档、强大的依赖注入、代码复用性高、兼容API开放标准等特性,相比Django 和Flask等其他使用Python语言开发的web框架,在易用性、健壮性、成熟度和高性能方面做到了平衡。
在控制台或主函数中执行模块1和模块2的核心代码,即可完成一个完整的基于FastAPI的异步处理web服务基本框架搭建。
模块1 使用Python包管理工具安装FastAPI
pip install uvicorn //安装ASGI服务器,用于加载服务程序
pip install fastapi //安装fastAPI及其依赖包
模块2 使用FastAPI定义异步接口函数
from fastapi import FastAPI //引用包
app = FastAPI() //实例化对象
@app.get("/weather_lbs/{api_name}")
//定义GET接口的访问路径
async def api(…) { return str }
//使用async定义异步接口实现具体函数
uvicorn main:app-reload //运行接口服务
OAuth(open authorization)是一种主流的安全授权协议标准,当前为2.0版本(OAuth2)。OAuth2通常用于向应用系统提供受保护的数据资源或接口服务时,引入令牌(Token)作为授权层,代替传统简单地使用用户名、密码登录的方式进行身份认证和权限鉴别,以隔离服务端的资源所有者与客户端的资源请求者,实现对资源的安全访问。在RFC 6749文件对OAuth2标准的定义中,规定了4种授权方式:授权码、隐藏式、密码式、客户端凭证[13]。Weather-LBS服务使用密码式授权的方式进行系统实现。
密码式授权的使用对象是相对较为信任的第三方应用。在使用时,用户首先向应用客户端提供一次用户名和密码,客户端收到授权申请后将用户名密码转发给认证服务器,确认无误后由认证服务器返回一个具有固定使用时效的令牌,用户在令牌生命周期内向资源服务器发送携带令牌的数据请求,超出时效后再重新申请令牌。整体流程如图2所示。
图2 OAuth2密码式授权时序图Fig.2 OAuth2 cryptographic authorization sequence diagram
实现OAuth2授权许可流程的核心是令牌,它是用户访问受保护资源的凭证,一般由服务端针对客户端提交的用户密码,再结合用户对资源的使用权限及时效等信息,通过特定的加密算法计算得到。Weather-LBS使用Json Web Token(JWT)的签名算法实现令牌计算及颁发。其基本原理是先使用openssl命令初始化一个SECRET_KEY随机密钥,并设置令牌初始时效为10 min;再定义一个POST 接口供客户端提交用户名及密码;最后将SH256对称加密算法生成的由32个16进制字符组成的令牌传送给应用[14]。应用程序使用GET接口访问气象数据时,在请求头带入该令牌才会得到服务端的有效响应。
如模块3所示,OAuth2PasswordRequestForm核心数据结构是一个类依赖项,声明了一个请求表单,包括用户名username和密码password两个必选字段;可选的scope字段,用空格分割的字符串表示权限码;可选的grant_type字段,此处设置为固定值password,表示采用密码式授权;可选的client_id和client_secret字段,用于服务端确认客户端的身份。
模块3 采用OAuth2.0进行用户认证
from fastapi.security import OAuth2PasswordBearer
from fastapi.security import OAuth2PasswordRequestForm //引用核心包
SECRET_KEY="f8342ee92aa93a5a25ccdf95e22c98b8e81cb3201 c699cab358b6fa2fdab1639" //Linux下执行openssl rand-hex 32生成对称加密的随机密钥
ALGORITHM = "HS256" //定义加密算法
ACCESS_TOKEN_EXPIRE_MIN = "10" //定义令牌时效
O_Schema = OAuth2PasswordBearer(tokenUrl="/token")
//访问tokenUrl可获取令牌并返回
@app.post("/token")
//定义POST接口对以表单形式提交的用户名、密码校验
async def login(form_data: OAuth2PasswordRequestForm = Depends()) //校验用户并生成令牌
def create_access_token(data: dict, expires: str = ACCESS_TOKEN_EXPIRE_MIN) //生成令牌函数
encoded_token = jwt.encode(data, key=SECRET_KEY, algorithm=ALGORITHM) //jwt加密
气象要素空间插值是指将已知的离散测量点上的数据,根据某种函数关系式内插或外推到待计算的未知点,以求得未知点气象要素值的过程。其基本理论假设是空间位置上的点,具有相似天气特征的概率与其距离成反比。在此理论基础上形成了多种气象要素插值算法,包括最近邻(nearest neighbor,NN)、反距离加权(inverse distance weighted,IDW)、双线性(bilinear,BL)和三次样条插值(cubic spline,CS)等[15-16]。
基于用户位置的气象服务中,需要选取合适的插值算法将背景场中的气象要素格点数据插到用户指定的地理坐标点[17],包括离散单点、多点插值两种场景。由于Weather-LBS采用的实况融合产品的网格间距为1 km,分辨率较高,并且数据融合过程中已考虑了地形高程等因素的影响,结合算法运行效率及服务特点,采用水平距离优先,兼顾气象要素特性(连续性、非连续性观测变量)的服务策略,针对降水量要素选用最近邻插值[18],针对气温、风向、风速要素采用双线性插值算法进行实现。
最近邻插值的核心思路是将距离待插值点最近的点的气象要素值作为该点的要素值,这种方法会生成大量的锯齿,优点是逻辑简单、速度快,在高分辨率的格点插站点数据的场景中应用方便。线性插值使用一次函数来表达,类似等比例变换,而双线性插值算法是线性插值扩展,其核心思路是在纬向和经向两个方向分别进行一次线性插值[19],在最终效果和速度上做到了平衡,是很多框架中的默认插值算法。
图3所示,待计算的目标位置点D=(x0,y0),格点场中已知气象要素数据的4个格点分别为S11=(x1,y1),S21=(x2,y1),S12=(x1,y2),S22=(x2,y2)。在最近邻插值中,分别计算目标点到4个已知点之间的距离,间距最小的点S12要素值即为D点取值;若出现距离相同时,设置策略优先取北向或西向的点的要素值。在双线性插值中,先分别对4个已知点在X轴(纬度)上做线性插值得到中间结果R1和R2,再对中间结果在Y轴(经度)上做线性插值,得到的要素值即为D点取值,是对4个已知点要素值加权处理的结果,即
图3 两种插值算法的图形示例Fig.3 Graphic examples of two interpolation algorithms
(1)
模块4为读取实况分析产品文件,并进行插值的核心代码示例。此外,在插值之前还需按照请求条件匹配实况产品文件名、查询文件索引表并定位存储位置、缺失的空值数据填充等预处理工作,与具体业务逻辑和背景场数据特点相关,需分别定义不同的函数方法进行实现。
模块4 读取GRIB2格式数据并进行插值
import xarray as xr //引用数据读取包,含自定义插值算法
ds = xr.open_dataset(file_path, engine=′cfgrib′)
//使用cfgrib引擎读取GRIB2文件
da = xr. DataArray(ds.variables[ele].data, coords={…})
//数据转换,便于调用插值算法
result = da. interp(lat, lon=, method=′nearest′)
//调用插值,nearest为最近邻、quadratic为双线性
气象数据统一服务接口(MUSIC)基于国-省统一的气象数据环境,面向气象业务和科研,提供全国统一、标准、丰富的数据访问服务和应用编程接口(API),为国、省、地、县各级应用系统提供唯一权威的数据接入服务[20]。以MUSIC为实践基础,全国气象基本信息标准化技术委员会提出的气象行业标准《气象数据服务接口规范》,规定了气象数据服务接口的组成、名称、参数列表、返回码和返回数据结构。其中,接口名称对应气象数据访问的具体功能,采用小驼峰命名规则;接口参数对应输入条件,包括可选、必选2种属性,以及资料种类、要素范围、时空范围等6大类;返回码对应接口调用状态,即成功或失败;返回数据结构对应访问数据的最终结果[21]。Weather-LBS完全遵循MUSC标准封装接口,示例如表1所示。
表1 Weather-LBS接口定义示例Table 1 Interface definition example of Weather-LBS
调用上述RestFul接口只需按规则拼接URL,以本机80端口发布服务为例。
https://127.0.0.1:80/weather_lbs/getSurfEleGridPointByTimeAndLatlons?time=2022010208&obsEle=TEM&lats=34.15&lons=105.32
使用Apache Jmeter工具,针对Weather-LBS服务在千兆网络环境、不同并发量下进行接口性能测试,具体测试环境配置如表2所示。
表2 Weather-LBS性能测试环境Table 2 Performance test environment of Weather-LBS
如表3所示,以getSurfEleGridPointByTimeAndLatlons为例,进行单点单要素实况接口性能测试的结果。随着接口访问并发量的增加,响应时效也呈上升趋势,基本能在秒级以内响应用户请求,处理能力最高可达191.8 请求数/s,在为单个应用提供接口服务的场景下,完全满足访问需求,达到了预期设计目标。此外,测试环境部署服务端选用了虚拟机,在用户规模较大的生产环境中,还可通过采用高配置的物理机,使其服务性能进一步提升。
表3 单点单要素实况接口并发测试结果Table 3 Concurrent test results of single point and single element live interface
在大型体育赛事及文体活动中,对精细化的天气实况服务要求较高。以2021年9—10月在陕西举办的第十四届全国运动会、第十一届残运会暨第八届特奥会(以下简称十四运会)为例,针对马拉松、山地自行车等场地空间范围较大的比赛,采用沿途高密度布设气象观测站的方式获取天气实况,建设和维护成本高。此外,为提高游客和观众的观赛体验,也需实时的推送目的地或路线天气实况信息。Weather-LBS服务在十四运会气象服务保障的过程中投入使用,达到良好的应用效果。通过提供统一的服务接口,实现气象实况数据接入十四运会大数据平台,为赛事组织者、运动员、观赛人员等发布实时的天气信息。此外,陕西省气象部门研发的十四运会微信小程序应用(图4),在移动端通过开放的地图定位接口获取使用者当前经纬度信息,与Weather-LBS服务联动,为使用者提供个性化“伴随式”的天气实况服务。
图4 调用Weather-LBS服务的应用实例Fig.4 Application instance called by Weather-LBS service
基于位置的天气实况服务Weather-LBS不仅对高分辨率气象实况网格产品在公共气象服务领域进行了推广应用,而且将格点数据的解析和处理封装为安全、高效、标准化的web接口服务,是气象服务和计算机技术交叉应用的典型实例,充分发挥了学科优势和数据效益,有效满足了公众对实时天气状况“监测精密、服务精细”的需求,具有广泛的应用前景。
该服务可在以下方面开展进一步研究。
(1) 数据处理优化。一方面在插值时加入高精度的地形特征数据,另一方面可将质控后的地面观测站实测数据和网格产品相结合,使插值结果的天气学意义更加完善。
(2) 接口安全性增强。目前实现了OAuth2的密码式授权,虽然使用相对便捷,但对第三方应用客户端的受信度依赖较高。在前后端明确分离的系统中,可改进为授权码方式,强化令牌在服务端的管理,避免泄露风险。
(3) 应用场景扩展。当选取一个要素丰富、准确率较高、时效较长的预报背景场产品,Weather-LBS的服务框架和数据处理模型可拓展至智能网格预报领域,以达到“精准预报”的应用目标。