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