曹 斌
(上海市測繪院,上海 200063)
隨著城市精細化管理水平的日益提高,信息系統建設方向也朝著可視化、智能化方向發展,各政府部門對地理信息服務提出了數據權威、服務實時、接口標準、內容全面、更新快速的新要求[1]。在用戶對地理信息應用逐步深入過程中,需求逐漸由側重地圖瀏覽向側重地理信息融合業務流程轉變,展示方式由桌面應用拓展到移動端、大屏展示設備使用,開發方式由面向對象設計模式的傳統組件COMGIS[2]向基于B/S架構跨平臺應用發展。傳統WebGIS系統平臺單調的界面UI已經不能滿足用戶的需求,早期簡單的視覺效果缺乏界面友好度和交互的流暢度[3]。
為了滿足復雜的應用場景和用戶需求,提高生產效率和團隊協作能力,需要從系統整體設計和開發手段上對GIS系統服務端和前端開發進行深入研究。本文結合長三角區域地理信息系統項目,重點從業務流數據流融合為切入點,從服務功能劃分,前端數據模型和業務邏輯組件化等方面入手,引入目前主流的跨平臺庫React和組件復用的開發思想,通過構建組件庫,實現組件配置參數化,對GIS系統建設幾個代表性問題,結合具體項目進行了深入研究。
長三角區域地理信息系統的建設目標是建成系統化、高精度、動態更新的長三角區域地理信息基礎平臺。2016年,國務院對《長江三角洲城市群發展規劃》批復中指出打造具有全球影響力的科技創新高地、全球重要的現代服務業和先進制造業中心是建設具有全球影響力的世界級城市群的核心與關鍵[4]。更好服務于“一帶一路”建設和長江經濟帶發展戰略,充分發揮對全國經濟社會發展的重要支撐和引領作用[5]。
本項目是為更好貫徹黨的十九大關于“實施區域協調發展戰略”,旨在統一的空間參考下,以基礎地理信息數據為基礎,以各類專題專項數據為業務核心,構建系統化、高精度、動態更新數據資源平臺。
WebGIS程序的后臺服務器端通常分為2類,提供地圖服務的地圖服務器和支撐業務邏輯的應用服務器。
在系統建設過程中,地圖服務器和應用服務器均能提供數據接口,以WMS服務為例,在提供地圖顯示功能的基礎上,其要素信息接口(GetFeatureInfo)提供對圖層地理實體的查詢功能;而另一方面,應用服務器利用數據庫提供的空間函數,或使用空間拓撲操作庫(如GeoTools的JTS組件[6-7]),也能夠實現空間檢索功能。因此,為了規范化系統開發,在系統建設前按功能劃分業務邊界,從可維護性、擴展性的角度,按照“專事專辦“的原則,地圖服務器重點提供地圖服務,應用服務器提供地圖查詢、空間分析等地圖邏輯操作。同時,從開發角度,空間函數和空間庫提供的功能及其組合更加靈活,將空間邏輯從前端頁面轉移到后端應用服務器,使前端頁面專注于展示效果開發,有利于開發團隊的分工合作,各司其職。
地圖展示方式,通常為網頁中嵌入地圖控件,受限于HTTP請求的無狀態特性,頁面刷新后地圖和頁面元素均會返回初始狀態。但在業務邏輯復雜的場景中,通常有以下特殊要求:① 頁面非正常關閉或刷新時可快速返回之前狀態;② 地圖控件和頁面其他HMTL元素動態關聯,常見的一個場景是在瀏覽地圖的過程中,根據圖上不同顯示區域動態展示區域關聯的統計指標。
上述需求的核心是對地圖狀態的實時跟蹤和實時存儲,在項目實踐中,采用觀察者設計模式(Observer),對地圖的核心狀態(如中心點,縮放等級,圖層開閉,控件狀態等)進行跟蹤,并定時將其序列化并保存。當頁面發生異常重新載入時,按照約定邏輯提取之前狀態并載入,從而還原地圖狀態。同時,可將地圖核心狀態作為參數傳遞,從而實現個性化的頁面初始化。
此外,對于地圖平移、地圖縮放等連續操作,太過頻繁的狀態存取會導致前端頁面資源大量消耗,采用數據防抖(debounce)策略,對持續觸發的地圖操作,一定時間段內沒有再次觸發才會執行狀態保存,在此時間段中如果再次執行地圖操作,則重新計算延時,從而降低頁面資源消耗。
常規GIS程序以頁面作為功能單元進行拆分,將通用方法包裝成函數在頁面間共享。參考前端組件化思想,將系統按照邏輯拆分成一個個功能單元,將具有相似功能的單元抽象成組件,按邏輯單元實現組件化。頁面間不僅可以共享函數,而且可以共享組件,可進一步提高系統可復用度。
在組件化拆分時,有2個重要原則:① 注重共性,在不同頁面中抽象出業務邏輯、展示方式相似的部分,將其形成組件;② 數據驅動,即組件僅完成數據渲染的工作,并不改變數據本身,數據由數據模型按照業務邏輯進行集中控制。
組件化有助于項目開發人員梳理更清晰的業務邏輯,通過約定數據模型即可進行項目協作,同時可以方便地進行局部單元測試。從更加宏觀層面,通過項目積累的組件,可以逐步整合形成GIS資源組件庫,在不同項目間調用,避免重復“造輪子”,提高生產效率。
如圖1所示,長三角區域地理信息系統架構按自頂向下,分為應用層、服務層、數據層和基礎設施層。

圖1 系統架構示意圖
根據前端頁面拆分組件時的功能要求,將每個功能設計對應的WebAPI服務;同時,對涉及空間運算和空間分析的部分,使用PostGIS提供的空間函數在數據訪問層實現。
為保障服務安全性,本項目中使用JWT(JSON Web Token)解決方案控制用戶身份認證和數據權限,在實現服務安全控制的同時,兼容分布式架構擴展和多端(瀏覽器、移動端)接入。
以統計展示模塊中一個功能場景為例,需要在地圖操作時展示不同省、市的統計年鑒信息,由當前地圖中心控制展示對象并高亮,并根據縮放等級控制顯示不同級別行政區的數據。此外,當用戶鼠標在統計表中移動時,地圖上的相應區域高亮展示。
傳統數據綁定的方式實現上述功能需要大量代碼且維護困難,在本項目中將頁面看成一個狀態機(State Machine),地圖的中心點位置、縮放等級、數據表格選中記錄等均作為狀態進行跟蹤,通過用戶交互控制狀態發生變化,從而驅動地圖或數據表格等界面元素渲染,使其與狀態保持一致,如圖2所示。

圖2 頁面狀態管理示意圖
在項目實施過程中,通過動態傳入參數,結合React庫,將常用功能抽象后形成組件,從而減少了重復代碼[3],通過組件構成復雜功能頁面,并在不同頁面間進行復用,大大提高了團隊開發效率。
如圖3所示,通過將捕捉視點位置、縮放層級、當前數據集等參數,動態傳入側邊控件,結合預設的展示參數,渲染統計圖表。

圖3 組件化示意圖
項目設計時使用響應式頁面布局,支持桌面和移動端顯示適配。系統不僅有面向工作人員的日常工作臺面,而且通過定制化可以滿足大屏展示要求,系統建成后效果如圖4所示。

圖4 系統運行效果圖
本文結合長三角區域地理信息系統建設項目,以頂層設計時的規劃和優化為切入點,重點關注功能邊界切分,核心數據模型設計,功能組件開發等環節,形成一套GIS功能開發的新思路,對于大型GIS項目的開發和長期運維,以及項目團隊長遠建設有著重要參考價值。