何林, 張雅斌, 任杰, 馮潔瓊
(1. 陜西省氣象信息中心, 西安 710014; 2. 秦嶺和黃土高原生態(tài)環(huán)境氣象重點實驗室, 西安 710014;3. 陜西師范大學計算機科學學院, 西安 710119)
全球氣候變暖背景下,中國極端天氣氣候事件明顯增多,強度明顯增強,氣象災害的多發(fā)性、極端性日益突出。2021年7月20日,鄭州出現(xiàn)201.9 mm的極端小時雨強,打破了中國大陸暴雨氣象觀測記錄歷史極值[1]。準確、及時、便捷的天氣實況與預報信息,在政府決策、公眾出行、自然災害防御、工農(nóng)業(yè)生產(chǎn)等各方面都發(fā)揮著越來越重要的作用。隨著中國綜合氣象觀測業(yè)務的快速發(fā)展,以及對天氣狀況精密監(jiān)測的重視程度越來越高,常規(guī)通過地面站、雷達、衛(wèi)星等手段獲取的實況觀測數(shù)據(jù),從種類、時空分辨率和數(shù)據(jù)量上都有較大提升。但多種類、多來源的自動化觀測數(shù)據(jù),意義不同、質(zhì)量不齊、時空代表性存在差異,如果不能有序地處理和發(fā)布,將對公眾獲取天氣實況及開展氣象服務造成困擾。
近年來,通過對多源觀測數(shù)據(jù)融合處理,研發(fā)高時空分辨率的格點實況分析產(chǎn)品,并以此開展定時、定點、定量的精細化天氣服務成為氣象領域的研究熱點。李夢迪等[2]提出采用雨量站觀測數(shù)據(jù)格點化、局地雨量計訂正雷達定量估計降水的方法,研發(fā)了高時空分辨率、高精度的雷達-雨量計降水融合產(chǎn)品,經(jīng)檢驗該產(chǎn)品對極端降水有較好地捕捉和監(jiān)測能力。李超等[3]基于美國國家海洋和大氣管理局(National Oceanic and Atmospheric Administration,NOAA)開發(fā)的局地分析與預報系統(tǒng)(local analysis and prediction system,LAPS),進行本地化數(shù)據(jù)接入和參數(shù)優(yōu)化,生成了覆蓋全國范圍、3 km/1 km空間分辨率的實況數(shù)據(jù)集,包含氣溫、風速、濕度、降水等要素,并探討了該實況數(shù)據(jù)集在航空、保險等公共氣象服務領域的應用。師春香等[4]研發(fā)了陸面同化、融合降水、海表溫度、三維云等要素豐富的格點實況產(chǎn)品,在數(shù)據(jù)質(zhì)量、時效性等方面都顯示出較大優(yōu)勢,在全國氣象部門投入業(yè)務使用。龍柯吉等[5]、俞劍蔚等[6]、黃勤等[7]分別對該系列實況產(chǎn)品的氣溫、降水、相對濕度等關鍵要素在四川、江蘇、陜西等不同區(qū)域和地形下開展了適用性評估及應用。彭亮等[8]基于Android 平臺和百度地圖開發(fā)組件包,設計了滿足用戶室內(nèi)外定位需求的位置服務,結合虛擬現(xiàn)實技術,構建三維模型場景,便于用戶瀏覽包括天氣在內(nèi)的周邊環(huán)境,并對前往目的地進行路徑規(guī)劃。姜淦等[9]將旅游氣象服務和位置天氣相結合,研發(fā)了移動端手機APP應用,聚合氣象可視化產(chǎn)品、地理信息和景點信息等,為旅游用戶及時獲取目的地天氣預報、線路天氣和旅游景點等綜合服務信息提供便利。范保松等[10]以解決氣象信息傳播“最后一公里”問題為導向,研發(fā)了基于位置服務的智慧氣象信息服務系統(tǒng),實現(xiàn)天氣預報和實況數(shù)據(jù)的網(wǎng)格化展示。
為規(guī)避傳統(tǒng)實況天氣服務存在的站點分布不均、序列長短不一等諸多限制,在天氣實況產(chǎn)品的應用和服務方面開展研究,現(xiàn)選取1 km空間分辨率的格點融合產(chǎn)品作為背景數(shù)據(jù),采用FastAPI框架搭建基于位置的天氣實況服務(Weather-LBS)。該服務以RestFul風格的數(shù)據(jù)調(diào)用接口呈現(xiàn),將時間、經(jīng)緯度信息作為輸入?yún)?shù),通過最近鄰和雙線性插值算法計算任意點的氣象要素數(shù)值,實現(xiàn)用戶實時獲取任意時間和位置的天氣實況信息,包括氣溫、降水、風向、風速等用戶較為敏感和關注的氣象要素。為保證數(shù)據(jù)調(diào)用的安全性,引入OAuth2認證機制;采用氣象數(shù)據(jù)統(tǒng)一服務接口(meteorological unified service interface community,MUSIC)標準進行接口封裝,保證服務發(fā)布的規(guī)范性。
多源融合實況分析產(chǎn)品(analysis of real time on 1 km resolution product,ART_1 km)由國家氣象信息中心研制并發(fā)布,由CMA高分辨率陸面數(shù)據(jù)同化系統(tǒng)(high resolution china meteorological administration land data assimilation system,HRCLDAS)和多源融合降水分析系統(tǒng)(source merged precipitation analysis system,CMPAS)生成。產(chǎn)品格式為GRIB2,包括降水、2 m氣溫、10 m風、2 m比濕4個氣象要素的14種產(chǎn)品[11]。產(chǎn)品時間分辨率為1 h,下發(fā)時效為整點之后5 min以內(nèi)。其中,融合降水要素根據(jù)應用需求,可達到10 min滾動更新。產(chǎn)品空間分辨率為0.01°×0.01°(1 km),全國產(chǎn)品空間覆蓋范圍為東經(jīng)70°~140°,北緯15°~60°,共計3 150萬個網(wǎng)格點,并可根據(jù)應用場景,將各省所轄范圍或自定義范圍裁剪后形成分區(qū)域要素產(chǎn)品。
基于位置的服務(location based services, LBS)是指綜合利用移動互聯(lián)網(wǎng)、衛(wèi)星定位和地理信息技術,由服務供應商根據(jù)用戶的位置信息和上下文信息提供個性化的信息資源和基礎服務[12],氣象服務是LBS的重要應用場景之一。Weather-LBS服務采用基于位置服務的思想,集成多種信息技術和插值方法,屏蔽服務系統(tǒng)與專業(yè)化的氣象格點數(shù)據(jù)處理之間的技術壁壘,為各類應用終端提供簡潔、易用的天氣實況數(shù)據(jù)接口。按照軟件分層思想,將該服務分為數(shù)據(jù)訪問層、業(yè)務邏輯層、接口服務層和應用層4個部分,總體架構如圖1所示。

圖1 基于位置的天氣實況服務(Weather-LBS)整體架構Fig.1 Overall architecture of location-based service (Weather-LBS)
FastAPI 是一個基于標準Python語言的類型提示、用于快速構建應用程序接口的高性能web應用框架。它定義了一套網(wǎng)絡開發(fā)和部署的軟件架構,集成了異步服務網(wǎng)關接口ASGI路由匹配、數(shù)據(jù)驗證和設置管理等功能庫,通過強制類型檢查以減少人為編碼錯誤,使web服務的開發(fā)效率成倍提升。同時具備良好的編輯器支持、自動生成交互式文檔、強大的依賴注入、代碼復用性高、兼容API開放標準等特性,相比Django 和Flask等其他使用Python語言開發(fā)的web框架,在易用性、健壯性、成熟度和高性能方面做到了平衡。
在控制臺或主函數(shù)中執(zhí)行模塊1和模塊2的核心代碼,即可完成一個完整的基于FastAPI的異步處理web服務基本框架搭建。
模塊1 使用Python包管理工具安裝FastAPI
pip install uvicorn //安裝ASGI服務器,用于加載服務程序
pip install fastapi //安裝fastAPI及其依賴包
模塊2 使用FastAPI定義異步接口函數(shù)
from fastapi import FastAPI //引用包
app = FastAPI() //實例化對象
@app.get("/weather_lbs/{api_name}")
//定義GET接口的訪問路徑
async def api(…) { return str }
//使用async定義異步接口實現(xiàn)具體函數(shù)
uvicorn main:app-reload //運行接口服務
OAuth(open authorization)是一種主流的安全授權協(xié)議標準,當前為2.0版本(OAuth2)。OAuth2通常用于向應用系統(tǒng)提供受保護的數(shù)據(jù)資源或接口服務時,引入令牌(Token)作為授權層,代替?zhèn)鹘y(tǒng)簡單地使用用戶名、密碼登錄的方式進行身份認證和權限鑒別,以隔離服務端的資源所有者與客戶端的資源請求者,實現(xiàn)對資源的安全訪問。在RFC 6749文件對OAuth2標準的定義中,規(guī)定了4種授權方式:授權碼、隱藏式、密碼式、客戶端憑證[13]。Weather-LBS服務使用密碼式授權的方式進行系統(tǒng)實現(xiàn)。
密碼式授權的使用對象是相對較為信任的第三方應用。在使用時,用戶首先向應用客戶端提供一次用戶名和密碼,客戶端收到授權申請后將用戶名密碼轉發(fā)給認證服務器,確認無誤后由認證服務器返回一個具有固定使用時效的令牌,用戶在令牌生命周期內(nèi)向資源服務器發(fā)送攜帶令牌的數(shù)據(jù)請求,超出時效后再重新申請令牌。整體流程如圖2所示。

圖2 OAuth2密碼式授權時序圖Fig.2 OAuth2 cryptographic authorization sequence diagram
實現(xiàn)OAuth2授權許可流程的核心是令牌,它是用戶訪問受保護資源的憑證,一般由服務端針對客戶端提交的用戶密碼,再結合用戶對資源的使用權限及時效等信息,通過特定的加密算法計算得到。Weather-LBS使用Json Web Token(JWT)的簽名算法實現(xiàn)令牌計算及頒發(fā)。其基本原理是先使用openssl命令初始化一個SECRET_KEY隨機密鑰,并設置令牌初始時效為10 min;再定義一個POST 接口供客戶端提交用戶名及密碼;最后將SH256對稱加密算法生成的由32個16進制字符組成的令牌傳送給應用[14]。應用程序使用GET接口訪問氣象數(shù)據(jù)時,在請求頭帶入該令牌才會得到服務端的有效響應。
如模塊3所示,OAuth2PasswordRequestForm核心數(shù)據(jù)結構是一個類依賴項,聲明了一個請求表單,包括用戶名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下執(zhí)行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) //生成令牌函數(shù)
encoded_token = jwt.encode(data, key=SECRET_KEY, algorithm=ALGORITHM) //jwt加密
氣象要素空間插值是指將已知的離散測量點上的數(shù)據(jù),根據(jù)某種函數(shù)關系式內(nèi)插或外推到待計算的未知點,以求得未知點氣象要素值的過程。其基本理論假設是空間位置上的點,具有相似天氣特征的概率與其距離成反比。在此理論基礎上形成了多種氣象要素插值算法,包括最近鄰(nearest neighbor,NN)、反距離加權(inverse distance weighted,IDW)、雙線性(bilinear,BL)和三次樣條插值(cubic spline,CS)等[15-16]。
基于用戶位置的氣象服務中,需要選取合適的插值算法將背景場中的氣象要素格點數(shù)據(jù)插到用戶指定的地理坐標點[17],包括離散單點、多點插值兩種場景。由于Weather-LBS采用的實況融合產(chǎn)品的網(wǎng)格間距為1 km,分辨率較高,并且數(shù)據(jù)融合過程中已考慮了地形高程等因素的影響,結合算法運行效率及服務特點,采用水平距離優(yōu)先,兼顧氣象要素特性(連續(xù)性、非連續(xù)性觀測變量)的服務策略,針對降水量要素選用最近鄰插值[18],針對氣溫、風向、風速要素采用雙線性插值算法進行實現(xiàn)。
最近鄰插值的核心思路是將距離待插值點最近的點的氣象要素值作為該點的要素值,這種方法會生成大量的鋸齒,優(yōu)點是邏輯簡單、速度快,在高分辨率的格點插站點數(shù)據(jù)的場景中應用方便。線性插值使用一次函數(shù)來表達,類似等比例變換,而雙線性插值算法是線性插值擴展,其核心思路是在緯向和經(jīng)向兩個方向分別進行一次線性插值[19],在最終效果和速度上做到了平衡,是很多框架中的默認插值算法。
圖3所示,待計算的目標位置點D=(x0,y0),格點場中已知氣象要素數(shù)據(jù)的4個格點分別為S11=(x1,y1),S21=(x2,y1),S12=(x1,y2),S22=(x2,y2)。在最近鄰插值中,分別計算目標點到4個已知點之間的距離,間距最小的點S12要素值即為D點取值;若出現(xiàn)距離相同時,設置策略優(yōu)先取北向或西向的點的要素值。在雙線性插值中,先分別對4個已知點在X軸(緯度)上做線性插值得到中間結果R1和R2,再對中間結果在Y軸(經(jīng)度)上做線性插值,得到的要素值即為D點取值,是對4個已知點要素值加權處理的結果,即

圖3 兩種插值算法的圖形示例Fig.3 Graphic examples of two interpolation algorithms

(1)
模塊4為讀取實況分析產(chǎn)品文件,并進行插值的核心代碼示例。此外,在插值之前還需按照請求條件匹配實況產(chǎn)品文件名、查詢文件索引表并定位存儲位置、缺失的空值數(shù)據(jù)填充等預處理工作,與具體業(yè)務邏輯和背景場數(shù)據(jù)特點相關,需分別定義不同的函數(shù)方法進行實現(xiàn)。
模塊4 讀取GRIB2格式數(shù)據(jù)并進行插值
import xarray as xr //引用數(shù)據(jù)讀取包,含自定義插值算法
ds = xr.open_dataset(file_path, engine=′cfgrib′)
//使用cfgrib引擎讀取GRIB2文件
da = xr. DataArray(ds.variables[ele].data, coords={…})
//數(shù)據(jù)轉換,便于調(diào)用插值算法
result = da. interp(lat, lon=, method=′nearest′)
//調(diào)用插值,nearest為最近鄰、quadratic為雙線性
氣象數(shù)據(jù)統(tǒng)一服務接口(MUSIC)基于國-省統(tǒng)一的氣象數(shù)據(jù)環(huán)境,面向氣象業(yè)務和科研,提供全國統(tǒng)一、標準、豐富的數(shù)據(jù)訪問服務和應用編程接口(API),為國、省、地、縣各級應用系統(tǒng)提供唯一權威的數(shù)據(jù)接入服務[20]。以MUSIC為實踐基礎,全國氣象基本信息標準化技術委員會提出的氣象行業(yè)標準《氣象數(shù)據(jù)服務接口規(guī)范》,規(guī)定了氣象數(shù)據(jù)服務接口的組成、名稱、參數(shù)列表、返回碼和返回數(shù)據(jù)結構。其中,接口名稱對應氣象數(shù)據(jù)訪問的具體功能,采用小駝峰命名規(guī)則;接口參數(shù)對應輸入條件,包括可選、必選2種屬性,以及資料種類、要素范圍、時空范圍等6大類;返回碼對應接口調(diào)用狀態(tài),即成功或失敗;返回數(shù)據(jù)結構對應訪問數(shù)據(jù)的最終結果[21]。Weather-LBS完全遵循MUSC標準封裝接口,示例如表1所示。

表1 Weather-LBS接口定義示例Table 1 Interface definition example of Weather-LBS
調(diào)用上述RestFul接口只需按規(guī)則拼接URL,以本機80端口發(fā)布服務為例。
https://127.0.0.1:80/weather_lbs/getSurfEleGridPointByTimeAndLatlons?time=2022010208&obsEle=TEM&lats=34.15&lons=105.32
使用Apache Jmeter工具,針對Weather-LBS服務在千兆網(wǎng)絡環(huán)境、不同并發(fā)量下進行接口性能測試,具體測試環(huán)境配置如表2所示。

表2 Weather-LBS性能測試環(huán)境Table 2 Performance test environment of Weather-LBS
如表3所示,以getSurfEleGridPointByTimeAndLatlons為例,進行單點單要素實況接口性能測試的結果。隨著接口訪問并發(fā)量的增加,響應時效也呈上升趨勢,基本能在秒級以內(nèi)響應用戶請求,處理能力最高可達191.8 請求數(shù)/s,在為單個應用提供接口服務的場景下,完全滿足訪問需求,達到了預期設計目標。此外,測試環(huán)境部署服務端選用了虛擬機,在用戶規(guī)模較大的生產(chǎn)環(huán)境中,還可通過采用高配置的物理機,使其服務性能進一步提升。

表3 單點單要素實況接口并發(fā)測試結果Table 3 Concurrent test results of single point and single element live interface
在大型體育賽事及文體活動中,對精細化的天氣實況服務要求較高。以2021年9—10月在陜西舉辦的第十四屆全國運動會、第十一屆殘運會暨第八屆特奧會(以下簡稱十四運會)為例,針對馬拉松、山地自行車等場地空間范圍較大的比賽,采用沿途高密度布設氣象觀測站的方式獲取天氣實況,建設和維護成本高。此外,為提高游客和觀眾的觀賽體驗,也需實時的推送目的地或路線天氣實況信息。Weather-LBS服務在十四運會氣象服務保障的過程中投入使用,達到良好的應用效果。通過提供統(tǒng)一的服務接口,實現(xiàn)氣象實況數(shù)據(jù)接入十四運會大數(shù)據(jù)平臺,為賽事組織者、運動員、觀賽人員等發(fā)布實時的天氣信息。此外,陜西省氣象部門研發(fā)的十四運會微信小程序應用(圖4),在移動端通過開放的地圖定位接口獲取使用者當前經(jīng)緯度信息,與Weather-LBS服務聯(lián)動,為使用者提供個性化“伴隨式”的天氣實況服務。

圖4 調(diào)用Weather-LBS服務的應用實例Fig.4 Application instance called by Weather-LBS service
基于位置的天氣實況服務Weather-LBS不僅對高分辨率氣象實況網(wǎng)格產(chǎn)品在公共氣象服務領域進行了推廣應用,而且將格點數(shù)據(jù)的解析和處理封裝為安全、高效、標準化的web接口服務,是氣象服務和計算機技術交叉應用的典型實例,充分發(fā)揮了學科優(yōu)勢和數(shù)據(jù)效益,有效滿足了公眾對實時天氣狀況“監(jiān)測精密、服務精細”的需求,具有廣泛的應用前景。
該服務可在以下方面開展進一步研究。
(1) 數(shù)據(jù)處理優(yōu)化。一方面在插值時加入高精度的地形特征數(shù)據(jù),另一方面可將質(zhì)控后的地面觀測站實測數(shù)據(jù)和網(wǎng)格產(chǎn)品相結合,使插值結果的天氣學意義更加完善。
(2) 接口安全性增強。目前實現(xiàn)了OAuth2的密碼式授權,雖然使用相對便捷,但對第三方應用客戶端的受信度依賴較高。在前后端明確分離的系統(tǒng)中,可改進為授權碼方式,強化令牌在服務端的管理,避免泄露風險。
(3) 應用場景擴展。當選取一個要素豐富、準確率較高、時效較長的預報背景場產(chǎn)品,Weather-LBS的服務框架和數(shù)據(jù)處理模型可拓展至智能網(wǎng)格預報領域,以達到“精準預報”的應用目標。