孫隆祥 李成名
(中國測繪科學研究院,北京100830)
2014年,在國家發改委等八部門聯合出臺的《關于促進智慧城市健康發展的指導意見》中,對智慧城市給予了明確定義:“智慧城市是運用物聯網、云計算、大數據、空間地理信息集成等新一代信息技術,促進城市規劃、建設、管理和服務智慧化的新理念和新模式。”其中,空間地理信息作為整合城市人口、法人、經濟、社會、文化等專題信息內容的城市基礎性信息資源,在智慧城市建設中起到了基礎支撐作用[1]。而時空信息云平臺除了是承載這些空間地理信息的基礎平臺,也是各部門、各行業信息共享和交換的基礎平臺。因此,時空信息云平臺建設相關技術的研究也成為目前智慧城市建設的重要方向之一。
時空信息云平臺是以直觀表達的全覆蓋精細地理信息和時相地理信息為基礎,面向泛在應用環境按需提供地理信息、感知定位及解譯、功能軟件和開發接口的服務[2]。與數字城市階段的地理信息公共平臺相比,智慧城市階段時空信息云平臺的建設,要以用戶的需求為中心,體現泛在、實時、便捷、自主等特點,這就需要平臺具有開放性,所提供的功能和服務都能夠方便的進行擴展修改。鑒于,本文著重面向平臺開放性這一需求,研究時空信息云平臺作為開放平臺的內涵、體系結構以及關鍵技術,同時對核心技術Open Map進行實現。
智慧城市時空信息云平臺由于其需要具備泛在、自主、實時等要求,其可以被視為一種面向GIS的開放平臺。開放平臺是指軟件系統通過公開其應用程序編程接口(API)或函數,來使外部的程序可以增加該軟件系統的功能或使用該軟件系統的資源,而不需要更改該軟件系統的源代碼[3],如美國的 Facebook、Twitter、蘋果等公司,國內的人人網、新浪微博、淘寶等,都是一種開放平臺。
典型的開放平臺通常由基礎設施、應用運行托管環境、開發者社區、應用商店和開發環境5個部分組成[4]。其中,基礎設施和應用運行托管環境是系統中直接支持應用程序執行的部分,也是開放式平臺實現的關鍵所在;開發者社區和應用商店則是為開發者提供開發指南和推廣應用的必要手段。此外,開放平臺還需要為用戶提供開發環境,供用戶離線開發程序,再將其進行部署。
基礎設施部分主要實現服務資源的彈性配置,以及平臺的運維服務管理,同時也方便平臺將已有的服務接口開放或重新開發新的接口來為用戶程序提供接口服務;應用運行托管環境是應用運行支撐環境的關鍵部分,負責完成應用邏輯處理、用戶界面呈現及應用數據的查詢和處理等工作,其重要目標之一是保證多個應用能夠可擴展地同時在一個統一的平臺上運行;開發者社區和應用商店為應用開發者提供SDK(Software Development Kit,軟件開發工具包)的下載和安裝服務,為用戶開發提供指導;開發環境與傳統的用戶利用單機在本地進行開發類似,主要增加了對開放平臺提供的功能接口的引入支持。
API的全稱是應用編程接口(Application Programming Interface),這一概念在計算機操作系統出現的早期就已經存在了。在互聯網時代,把網站的服務封裝成一系列計算機易識別的數據接口開放出去,供第三方開發者使用,這種行為就叫做開放網站的API,與之對應的,所開放的API就被稱作Open API,使用API構建業務是實現開放式業務結構的關鍵技術。
Open API按照制定者與遵循者的關系可以簡單劃分成兩個大類[5]:
①專有:一個API制定出來主要是為了制定者本身提供應用開發接口的目的,這樣的API就叫做專有API,例如facebook的API。大部分的API制定之初都是專有API,極特別情況除外。
②標準:一個API稱之為標準API,或者是制定者并不提供該API所定義的服務,它必須為成為業界標準而努力;或者是該API被業內很多服務提供者所遵循,例如RSS。即標準API的形成,一是因為業內形成事實標準,二是已經被標準化組織采納。
要做開放平臺,首先必須具備Open API,但開放了API并不等于就是開放平臺。開放平臺是以Open API為手段來使外部的程序可以增加該軟件系統的功能或使用該軟件系統的資源。Open API的類型由平臺的性質決定的,在Open API的類別中,地圖API應該是最獨特的API之一,因為它為一維的文字信息提供了一個二維,甚至三維的載體。此外,在與人類生活息息相關的所有信息內容中,位置相關的信息占據了80%以上[6]。因此,國內外相關網站,如谷歌、雅虎、百度等紛紛開放了自己的地圖API。
地圖是地理信息的載體,也是GIS應用最重要的容器之一。時空信息云平臺的開放性,主要體現在GIS應用與功能的開放性,或者說在線地圖的開放性,即Open Map。Open Map是指通過Open API的手段,將服務式GIS功能進行封裝,形成符合一定標準的二次開發包,供第三方開發者使用,以滿足不同用戶的個性化功能需求和地理信息資源需求。
首先,時空信息云平臺必須提供一個核心的開放式基礎服務,即地圖應用服務。通過后臺的地圖服務器實現所有的地圖與GIS基礎功能,如查詢、統計、分析、路徑規劃、拓撲處理等,然后加這些服務進行封裝打包,通過Open API和SDK的方式開放給用戶,以進行實際的數據處理和應用功能的開發。
用戶在進行專業應用系統搭建時,往往需要構建符合自己部門或行業的系統界面和外觀,開放式時空信息云平臺通過皮膚插件機制,將平臺的展現方式開放給用戶。一般的開放式界面包括三個方面:圖片集合、字體風格、界面布局。圖片集合指的是平臺界面構建時所引用的所有圖片資源的組合,按照一定的命名規則,平臺可以動態進行加載和卸載;字體風格通過CSS樣式表進行外部設置,以符合界面整體風格;界面布局通過將平臺原子部件進行級別設定,以積木搭建模式實現任意組裝。
地圖是時空信息云平臺的核心,位于整個平臺框架的數據層,是支撐平臺運行的必需資源。OpenGIS規范作為一個通用的分布式地理數據和地理處理數據源的軟件結構規范,為全世界的軟件開發者提供了一個詳細的通用界面模板,這個模板可以與由其他軟件開發者開發的開放式GIS軟件進行交互操作,通過OpenGIS異構分布的數據可以實現互聯互通與聚合,并將它們結合在一個集成式的操作環境中,其互操作性、可擴展性、可移植性、協同性等特點,為開放式地圖的實現提供了規范與指導。
開放式時空信息云平臺是一個動態模塊化框架,提供了插件化支持、面向服務架構支持和插件擴展支持三大功能。通過Open API,應用開發商可以按照開放式時空信息云平臺的插件機制,開發出各種各樣的地圖功能模塊,對平臺進行二次開發。插件間的通信基于輕量級的SOA模型,每一個插件都可以向服務總線注冊服務,也可以從服務總線查詢并獲取需要使用的服務;每一個插件都可以通過定義擴展點向其他插件暴露擴展,并且每一個插件都可以對暴露擴展點的插件進行擴展從而在不改變原有插件代碼下影響其行為。
本文采用Adobe Flash Builder4做為Open-Map SDK的集成開發環境,其可以幫助開發者快速開發跨平臺的富互聯網應用程序(RIA)和內容使用開源的Flex框架,并提供智能編碼、調試、可視化設計和功能強大的測試工具。同時以中國測繪科學研究院的New MapServer4.0二次開發包New Map Flex API為例展示Open Map SDK的開發思路和方法。
設計的Open Map SDK采用模塊化思想,對New Map Flex API中與Map對象的通信進行了進一步的封裝,并提供了針對時空信息云平臺的通用接口。在Open Map SDK中,可從零開始快速搭建應用模塊,將編譯得到的swf(shock wave flash,Flash專用格式)無縫集成到時空信息云平臺中;也可將該SDK作為基本框架,在此之上開發各種應用系統。
現將工程結構簡單描述如下:
①Index.mxml為SDK開發包主界面;②core為SDK通用代碼文件夾,包括圖片、樣式、as文件、js文件以及php文件等。這些文件為SDK自帶,一般不需要修改;③Map為用戶開發文件夾。用戶自行開發的功能模塊都放在Map目錄下的modules里,為便于管理,每個獨立的模塊需創建屬于自己的文件夾,map_search和map_testsdk為兩個不同的應用模塊;④nm Map Module和nm ModuleContainer文件夾為SDK的分別針對地圖控件和地圖框架封裝的模塊,不需要修改;⑤setting為SDK統一配置文件夾,目前包括config_map.xml(底圖配置文件,需根據實際的地圖服務自行修改)和config_db.xml(數據庫配置文件,暫時不用)如果用戶開發的功能模塊有自己的配置文件,一般不需要放到統一配置文件夾中,只需在該模塊的開發文件夾下建立目錄存放即可。
一個時空信息云平臺功能模塊的實例從開始應用程序的設計,到用戶看到功能模塊的界面,經歷了一個簡單的生命周期。期間主要的5個事件如下:
①Flash播放器從加載和運行容器文件開始一個時空信息云平臺框架的應用程序;②云平臺框架從網絡服務器加載XML格式的配置文件和皮膚文件并應用于整個應用程序;③在配置文件的基礎上,模塊管理器首先加載基礎模塊(地圖模塊和界面模塊),地圖模塊基于配置文件,從GIS服務器上下載相關的地圖信息;界面模塊通過配置文件顯示模塊列表。然后模塊管理器加載ModuleContainer,各個功能模塊顯示在該容器中;④模塊管理器會從XML配置文件指定的URLs下載并加載相關的模塊文件(一般是swf文件);⑤用戶利用模塊來實現各種業務邏輯。
經過編譯的Module是一個獨立的swf文件,可在Container程序中共享、移動和配置。Module封裝了一系列獨立并且針對性很強的業務邏輯,用戶可以在其中執行任務。在一個面向服務的環境下,一個Module可以代表是一種服務或者是一套相關的服務,用戶可以很明了的用它來執行一個業務功能。Module不僅為用戶提供了可視化的界面,也能夠連到服務器端的資源,例如來自New Map Server的地圖服務。一系列相互關聯的Module加上清晰定義好的業務操作流程組成了業務解決方案。而且這樣的方案可以應用于企業級的業務進程中。時空信息云平臺的Module編程模型使得開發人員可以輕易定制Module,避免了將業務功能整合到平臺中所需的底層代碼開發。其核心接口包括以下兩個:
①NMBase Module Interface:這個接口定義了ModuleFrameset管理模塊的通信方法。而基礎module類NMBaseModule則要來實現這個接口。
②NMBase Module Class:這個是 Module的基類,所有的模塊都要繼承這個類。通過擴展NMBase Module這個父類,ModuleFrameset會驗證所有擴展了NMBase Module的MXML或AS類是否為可部署的模塊。另外,擴展了NMBaseModule的類能夠被編譯為一個獨立的SWF文件。每個平臺框架下的模塊必須繼承NMBase Module這個父類。
Open Map SDK通過全局事件總線容器(nmPlatEventBus)來促進 module和nm Map-Module以及多個module之間進行交互來獲取相關的信息,Open Map SDK的消息通訊機制能夠較好地解決模塊化之后,各個模塊之間的通訊問題,全局事件總線容器(nmPlatEventBus)是促進不同模塊的直接交互或是信息傳遞。
實現Open Map SDK消息通訊機制主要是通過消息的分發(dispatch)和監聽(add Listener)來進行的。
需要注意的是,消息的分發(dispatch)和監聽(add Listener)必須成對出現,他們之間通過消息類型type來進行識別,即如果在A模塊中分發(dispatch)一個消息,那么相應地在B模塊中要增加對A模塊分發消息的監聽(add Listener),這樣當A模塊和B模塊就可以實時通訊,并可以通過Object類型的data參數彼此之間進行相關信息的傳遞。
對于GIS網絡應用,除了可視化數據這個特殊用途外,地圖還是一個允許用戶收集并且處理地圖數據的數據源。或許在用戶與地圖進行交互的過程中,所創建的module需要接收如點和直線或者多邊形這一類的數據來進行處理。
下面這段示例代碼展示了如何激活畫圖工具來追蹤用戶在地圖上面的點擊操作:
private function start Query():void{
nmPlat Event.dispatch(PlatConst.SET_MAP _ ACTION, {type: Plat-Const.MAPACTION_POINT},get Draw Feature);
}
private function get Draw Feature(dfeature:NFeature,mapinfo:Object,params:Object):void{
var postData:Object;
var geoJSONParser:NGeoJSONParser=new NGeoJSONParser();
post Data=geoJSONParser.write([dfeature]);
var jsonParser:NJSONParser=new NJSONParser();
var featureobj:Object= jsonParser.read(post Data);
var coords:String='';
var coord Arr:Array;
coord Arr=featureobj.features[0].geometry.coordinates;
}
在上面的示例中,點擊module中的按鈕會調用start Query()方法。當一個指定的任務需要用戶點擊module上的按鈕時,程序就能夠隨時從地圖上獲取一個點的坐標信息。用戶下一步需要做的就是點擊地圖上任意位置,然后module就能夠接收這個點擊行為傳送的點信息。具體由一個回調函數get Draw Feature()來接收傳回的相關信息。關于框架中支持的事件類型都在類PlatConst中進行定義,開發人員可以查看此類獲取框架支持的事件類型信息。
在智慧城市時空信息云平臺建設中,開放性是最重要的特性之一。本文在分析開放式平臺的基礎上,總結開放平臺的結構、關鍵技術和基本特征,并在Open API的技術手段之上,提出實現Open Map的思路,從開發框架、編程模型、消息通信機制等方面對時空信息云平臺的開放性(主要針對地圖應用的開放性)進行了研究,為后續各地市開展智慧城市時空信息云平臺的建設提供技術參考。