陳賓賓,李雪松,李子揚,苑馨方
(1. 中國科學院空天信息創新研究院中國科學院定量遙感信息技術重點實驗室,北京 100094)
我國草地資源豐富,擁有天然草原4 億hm2,占國土面積的41%,是我國耕地面積的3 倍,森林面積的1.9倍,約占全球草原面積的12%[1]。由于人為和氣候干擾因素,尤其是不合理的畜牧業發展方式,我國部分牧區存在草畜失衡、草地水土流失、生物多樣性下降等現象,進一步加劇了草原生態系統對氣候變化的敏感性,牧區草地生態功能日益衰減,蟲鼠害、沙塵暴等自然災害頻繁發生[2-3]。然而,牧區草地過載仍無法解決我國飼草料和畜產品嚴重依賴國際進口的問題,部分牧區甚至因為草畜失衡導致產能進一步萎縮,嚴重制約了牧區經濟的可持續發展以及和諧社會的穩步構建[4-7]。因此,在牧區草畜平衡動態機制制約下,如何準確分析和預判放牧管理、草畜調配、草地管理、旅游規劃與開發等人為干擾,以及干旱、霜凍、低溫、沙塵暴等氣候和災害事件對牧區草畜資源分布的干預與制約作用,揭示草畜動態平衡和牧區管理之間的相互作用和反饋模式,是當前牧區草畜資源規劃亟待解決的重要難題。構建基于三維數字地球的牧區草畜資源動態演變可視化系統,有助于實現在氣候變化、社會活動、經濟政策等制約下的牧區草原放牧密度和草地生產力信息的預報預測以及4D 動態展示,為地方草牧業決策提供支持。
牧區草畜資源動態演變可視化系統利用星空地一體化多源草畜資源、自然條件和社會經濟等多維信息,實現典型干擾情景約束下的草畜動態平衡模擬的預測推演,并多維度展示資源動態演變,在線分析人為干擾、氣候事件與災害現象對草原生態系統和功能變化的影響,為草原管理和農業產業結構調整提供決策支持。
B/S 架構將系統功能實現的核心部分集成到服務器上,簡化了系統的開發、維護和使用。牧區草畜資源動態演變可視化系統采用B/S 架構設計(圖1),包括兩個主體功能:草畜平衡預測預報,針對示范實驗區的草畜平衡干預情景,開展干擾因子對草畜資源影響的預測推演以及情景應對措施的決策輔助,提供在數據分析線服務;草畜資源動態演變可視化,基于地理空間信息平臺,對示范實驗區的草畜資源和預測推演過程進行4D時空數據展示。

圖1 平臺軟件體系結構圖
Node.js 是2009 年5 月發布的基于Chrome V8 引擎的開源Javascript 運行環境,打破了過去Javascript 只能在瀏覽器中運行的局面。前后端編程環境統一,可大大降低開發成本。Node.js的優點為[8-12]:
1)運用事件驅動模型。Node.js 主要包括應用層、V8引擎層、NodeAPI層和Libuv層。Libuv層維護了一個Event Queue的事件隊列,收到請求后,通過應用層和NodeAPI 層將請求作為一個事件放到Event Queue 事件隊列中,并設置回調事件函數,再繼續接收新的請求。在Libuv 層的Event Loop 事件循環讀取Event Queue中的事件,若遇到非阻塞事件,則自行處理,并在處理完后調用回調函數向上一層返回結果;若遇到阻塞事件,則委托給后臺線程池來處理,阻塞操作完成后,執行結果與提供的回調函數一起再被放入事件隊列中,這樣可通過異步編程實現高吞吐量和高性能。
2)運用異步、非阻塞式I/O 模型。每個I/O 操作均通過高度嵌套的回調函數處理,這是Node.js異步交互原則的規定[13-15]。當執行過程中遇到I/O阻塞(查詢數據庫、訪問遠程服務等)時,事件循環線程不會停下等待輸出結果,而會繼續執行隊列中的下一個任務。在函數執行時,Node.js在事件隊列中放置回調函數,根據函數的完成快慢順序調用。
3)跨平臺支持,非瀏覽器環境下運行性能好。V8引擎本身使用了一些最新的編譯技術,可極大提升Javascript腳本語言編寫的代碼的運行速度。Node.js不僅對Chrome V8 引擎進行了封裝,還針對一些特殊用例進行了優化,提供了替代的API,使V8引擎在非瀏覽器環境下運行更好,執行Javascript的速度得到了提升、性能更好[16-17]。
4)易于擴展網絡應用。Node.js是基于Chrome V8引擎構建的,因此它的模型與瀏覽器是類似的,運行在單個進程的單個線程上,但其仍可利用CPU的多個核心。Node.js通過child_process.fork()API來生成子進程,以實現多核CPU的利用。另外,建立在同一個接口上的Cluster模塊允許在進程之間共享套接字(sockets),以實現核心的負載均衡。
牧區草畜資源動態演變可視化系統的中間件軟件體系結構拓撲圖見圖2。中間件連接草畜平衡預測預報系統、草畜資源動態演變可視化系統和地圖服務系統。草畜平衡預測預報系統主要負責示范實驗區典型干擾情景設置(參數輸入)、草畜平衡預測推演,界面基于Web開發;地圖服務系統主要負責草畜平衡預測推演結果的數據發布,采用GeoServer地圖服務器進行地圖發布;草畜資源動態演變可視化系統主要負責動態展示草畜平衡預測推演全過程,基于Cesium三維開源地圖引擎實現。Cesium是一個用于構建三維場景和地圖的開源三維渲染引擎,采用B/S 架構且遵循WebGL三維繪圖標準,基于Javascript編寫[18]。草畜平衡預測與動態展示數據交互中間件采用Node.js,主要負責用戶操作監控、輸入參數轉發、推演結果發布、可視化系統控制和數據推送;此外,還包含一個全局的進程守護程序,負責解決Node.js 可能出現的異常,防止崩潰,包括回調函數發生的異常,保證中間件的可靠運行。

圖2 體系結構拓撲圖
中間件接口采用一種面向資源的設計,所有操作與URI 綁定,借助http 請求方法獲取服務需要的資源,暴露在網絡中的是面向資源的服務。中間件包括兩個獨立進程:①基于GeoServer 的數據存儲發布服務,提供中間服務;②基于Cesiume 的三維展示前端,提供交互服務。系統基于Ajax函數庫進行二次封裝,實現了Client 類,包含GET、POST 等6 種請求方法,可方便地使用其處理RESTful請求。REST風格的Web 服務能將網絡上的事物抽象為資源,并通過URI標識。中間件的接口引擎引入該方式,將前端所需數據以及對數據操作的組合看作資源。URL的基本格式包括:①協議,通常為http或https;②服務器主機地址和端口號,主機地址可以是域名、主機名或IP 地址,默認端口號可省略;③資源相對路徑,通常用“/”隔開;④請求參數,由問號開始用等號隔開的鍵值對對應的參數組成,多個參數間用“&”分隔。在符合URI設計標準的前提下,采用“項目編碼/分類編碼/資源編碼”的格式定義資源相對路徑,各編碼由前端開發人員通過數據接口定制工具自行定制服務接口地址。中間件主要包括情景監聽訂單輸入接口、情景監聽輸出接口、情景列表獲取接口、查詢情景數據接口、顯示配置文件接口、情景預測輸出接口、地圖服務圖層更新接口等。
進程一主業務接口通過RESTful 接口監聽人為情景草畜平衡預測結果,主要包括請求的任務ID、預測開始的時間、預測的年份、牲畜類型以及人為情景草畜平衡時間序列矩陣。成功獲取預測結果后動態更新GeoServer 圖層,為用戶后續請求提供響應。輸入參數、類型屬性、牛和羊屬性、輸出參數見表1~4。進程二主業務接口通過RESTful 接口提交訂單任務ID,查詢進程一狀態,若錄入成功,則通過Cesium 提供基于時間序列的三維交互響應;若未成功,由可視化插件顯示未成功響應結果。輸入、輸出參數見表5、6。

表1 進程一輸入參數

表2 類型屬性

表3 牛和羊屬性

表4 進程一輸出參數

表5 進程二輸入參數

表6 進程二輸出參數
在Windows 10 平臺,通過Chrome 瀏覽器啟動草畜平衡預測預報系統,輸入草畜平衡模型計算參數,中間件實時接收輸入參數,啟動數據中轉服務;等待模型計算完成,將計算圖像結果通過GeoServer進行服務發布;完成地圖服務發布后,進行草畜資源動態演變可視化系統的參數配置,并打開可視化系統實現草原NPP、GPP、生物量等情景關鍵參數以及草原載畜量變化的時空動態展示。測試效果見圖3,用戶設置預測起始年為2017年、預測3年的草畜平衡,進程一得到計算結果后,由進程二提供連續3 年的預測結果,并進行動態交互展示。

圖3 系統效果圖
本文基于Node.js設計了草畜平衡數據中間件,并在開源Cesium JS 平臺上進行了驗證。結果表明,中間件實現了情景驅動的草畜資源演變過程的動態展示功能,包括情景關鍵參數展示,草原NPP、GPP、生物量等演變過程時空動態展示,草原載畜量變化過程時空動態展示等。中間件基于Node.js 開發,使得前、后端共用一部分代碼和邏輯,有效保證了最高的效率和最低的維護成本,提高了系統的可復用性。同時,由于Node.js 采用事件驅動、非堵塞I/O 模型,保證了中間件的輕量化,有利于系統部署與安裝。草畜平衡數據中間件下一步的研究方向為提高中間件的并發處理能力,包括將服務器改進為多核Node服務器、引入Redis 高性能緩存、消息隊列機制等,使中間件具有更加優異的并發處理能力。