王 昊 ,特日根 ,3
(1.長(zhǎng)光衛(wèi)星技術(shù)有限公司,吉林 長(zhǎng)春 130000;2.吉林省衛(wèi)星遙感應(yīng)用技術(shù)重點(diǎn)實(shí)驗(yàn)室,吉林 長(zhǎng)春 130000;3.中國(guó)科學(xué)院 長(zhǎng)春光學(xué)精密機(jī)械與物理研究所,吉林 長(zhǎng)春 130000)
隨著我國(guó)對(duì)地觀測(cè)衛(wèi)星技術(shù)不斷的發(fā)展,其空間、時(shí)間、譜段分辨率均得到大幅度的提升,影像數(shù)據(jù)呈爆炸式的增長(zhǎng)。遙感數(shù)據(jù)本身又有屬性復(fù)雜的特點(diǎn),傳統(tǒng)的管理和檢索方式正面臨著挑戰(zhàn)[1]。當(dāng)前主流的GIS軟件對(duì)于海量的遙感數(shù)據(jù)缺乏高效的統(tǒng)一檢索和管理功能,且無(wú)法完成互聯(lián)網(wǎng)用戶直接查詢的需求,基于此種形勢(shì),研究用戶通過(guò)網(wǎng)絡(luò)檢索和管理遙感影像的技術(shù)就變得尤為重要。
在傳統(tǒng)的Web服務(wù)架構(gòu)中,數(shù)據(jù)的操作和頁(yè)面的渲染都由服務(wù)端負(fù)責(zé)處理,這種架構(gòu)的缺點(diǎn)較為明顯,就是拓展和維護(hù)的成本較高,開發(fā)者需要同時(shí)擁有兩種差別較大的技術(shù)儲(chǔ)備。所以后來(lái)出現(xiàn)了將兩者解耦的架構(gòu)技術(shù)——前后端分離技術(shù):兩者通過(guò)約定API和數(shù)據(jù)格式進(jìn)行交互,前端僅僅關(guān)心頁(yè)面的渲染,后端則負(fù)責(zé)數(shù)據(jù)的操作。自從表現(xiàn)層狀態(tài)轉(zhuǎn)化(Representational State Transfer,REST)這一概念被提出后,被廣泛認(rèn)可為Web應(yīng)用架構(gòu)設(shè)計(jì)應(yīng)遵守的指導(dǎo)原則[2]。而RESTful是使用REST概念構(gòu)造而來(lái)的,是用于規(guī)范API的一種約束,遵循其原則便可以設(shè)計(jì)出易于理解、方便調(diào)用的API。
將RESTful Web API作為主要的后端服務(wù)架構(gòu)應(yīng)用于改善傳統(tǒng)遙感影像檢索的體驗(yàn),無(wú)論在科研還是商業(yè)化的應(yīng)用中,都可以提高當(dāng)前海量遙感數(shù)據(jù)的共享水平和效率。
區(qū)別于基于SOAP的Web服務(wù),REST是一種面向資源的架構(gòu)風(fēng)格,其更簡(jiǎn)單,且貼近Web的原意。REST是目前業(yè)界更為推崇的構(gòu)建新一代Web服務(wù)(或者Web API)的架構(gòu)風(fēng)格[3]。RESTful采用了面向資源的架構(gòu),所以在設(shè)計(jì)之初首先需要考慮的是有哪些資源可供操作。因此,所有存在于后端服務(wù)中可供操作的元素都可以被視為資源,既可以是具體的,也可以是抽象的。
RESTful使用“鏈接”關(guān)聯(lián)相關(guān)的資源,它推薦資源采用具有可尋址性的URL來(lái)標(biāo)識(shí),一般一個(gè)RESTful Web API只關(guān)心實(shí)現(xiàn)一個(gè)資源的管理。它與基于SOAP的Web服務(wù)的另一個(gè)外在表現(xiàn)上的區(qū)別在于是否采用統(tǒng)一接口。REST使用HTTP協(xié)議傳輸資源的狀態(tài)轉(zhuǎn)換,一般使用GET、POST、PUT、DELETE這4種動(dòng)作和資源的CRUD操作對(duì)應(yīng)起來(lái)[4]。
充分利用REST的特點(diǎn)和設(shè)計(jì)原則,可以將服務(wù)端的業(yè)務(wù)進(jìn)行前后端分離,客戶端的實(shí)現(xiàn)變得簡(jiǎn)單起來(lái),接口變動(dòng)不再是影響升級(jí)的理由,長(zhǎng)期來(lái)看提高了兼容性。這種架構(gòu)上面的提升應(yīng)用在遙感影像檢索系統(tǒng)中,會(huì)使其更加簡(jiǎn)潔和高效。
本文構(gòu)建RESTful Web API使用到了SSM框架,也就是Spring、Springboot和MyBatis框架[5]。其中Spring作為核心,是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(Inversion of Control,IOC)和面向切面編程(Aspect Oriented Programming,AOP)的容器框架。IOC意味著將設(shè)計(jì)好的對(duì)象交給容器控制,而傳統(tǒng)的方式是使用者在對(duì)象內(nèi)部直接控制。AOP的概念類似于面向?qū)ο缶幊?,是針?duì)公用過(guò)程進(jìn)行統(tǒng)一操作[6]。如想在增刪改查(Create,Retrieve,Update,Delete,CRUD)操作前加入權(quán)限驗(yàn)證,就可以通過(guò)AOP在運(yùn)行時(shí)動(dòng)態(tài)的注入到CRUD前。
Spring框架的配置比較繁雜,同時(shí)他的配置需要使用者頻繁的復(fù)制粘貼。Spring Boot使得Spring應(yīng)用變得更輕量化[7]。MyBatis是一個(gè)輕量級(jí)的持久層框架,使用MyBatis不再需要編寫JDBC代碼、手工設(shè)置參數(shù)以及封裝結(jié)果集。其可以通過(guò)簡(jiǎn)單的XML或注解實(shí)現(xiàn)配置和原始映射,并將接口和普通的Java對(duì)象映射成數(shù)據(jù)庫(kù)中的記錄。
使用項(xiàng)目構(gòu)建工具maven構(gòu)建一個(gè)Spring的Web項(xiàng)目,同時(shí)通過(guò)pom的配置依賴,可以將上述三者框架引入項(xiàng)目中并開始使用。
在一個(gè)Web項(xiàng)目中,通常將一次請(qǐng)求的處理分為4層:Controller層、Service層、DAO(Mapper) 層和Entity(Model)層[8]。
Controller層主要負(fù)責(zé)業(yè)務(wù)邏輯和流程的控制,通過(guò)調(diào)用Service層中的接口來(lái)完成。Service層主要負(fù)責(zé)業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計(jì),使用注入的DAO層對(duì)象進(jìn)行功能上的組合。DAO層主要負(fù)責(zé)數(shù)據(jù)庫(kù)的持久化操作。Entity層是實(shí)體層,是數(shù)據(jù)庫(kù)表在項(xiàng)目中的實(shí)體類和包裝類。各層之間的關(guān)系如圖1所示。
在實(shí)際的項(xiàng)目開發(fā)中,Springboot中有大量類型相似、寫法一致的代碼,所以引用lombok這個(gè)插件來(lái)自動(dòng)生成和注釋代碼,可提高效率。同時(shí),可以在持久層中使用MyBatis Plus框架替代MyBatis框架,因?yàn)榍罢咴谝子眯院秃?jiǎn)潔性方面都更具優(yōu)勢(shì)。
在水利工程機(jī)電安裝造價(jià)管理過(guò)程中,必須要在實(shí)行方案設(shè)計(jì)、工程設(shè)計(jì)的招投標(biāo)等工作中落實(shí)造價(jià)管理思想,因此工程項(xiàng)目單位在設(shè)計(jì)階段的造價(jià)管理中,可以引入競(jìng)爭(zhēng)機(jī)制,將工程項(xiàng)目的機(jī)電安裝工作分包給具體單位,通過(guò)這種方法讓其成本管理可以達(dá)到預(yù)期水平。在實(shí)施過(guò)程中,可以先開展機(jī)電安裝的招標(biāo)設(shè)計(jì)方案,并在其中選擇合理的設(shè)計(jì)方案,并在機(jī)電安裝施工圖的設(shè)計(jì)過(guò)程中通過(guò)委托或者招標(biāo)等方法,確保中標(biāo)單位的相關(guān)能力可以滿足機(jī)電安裝要求。
在前后端聯(lián)調(diào)和后端自測(cè)階段,會(huì)使用類似Postman的REST測(cè)試工具,這就需要在工具中維護(hù)開發(fā)文檔和使用說(shuō)明。因此引入工具swagger,可在代碼中自動(dòng)生成其注釋,然后在項(xiàng)目運(yùn)行中通過(guò)Web頁(yè)面的方式展示接口相關(guān)文檔,方便聯(lián)調(diào)和測(cè)試。
用于檢索的遙感影像數(shù)據(jù),除原始圖像外,其縮略圖文件和meta文件中包含多種屬性和地理信息,可用于建立檢索服務(wù)。
通過(guò)編寫程序?qū)eta的XML文件進(jìn)行解析,可以得到影像的相關(guān)遙感信息,如拍攝時(shí)間、位置和分辨率等,并使用結(jié)構(gòu)化數(shù)據(jù)庫(kù)Postgres將其存儲(chǔ)。Postgis空間數(shù)據(jù)庫(kù)可將空間地理信息(衛(wèi)星影像四角點(diǎn)經(jīng)緯度)保存為一個(gè)十六進(jìn)制數(shù)格式的對(duì)象[9]。以多邊形為例,將四腳點(diǎn)坐標(biāo)轉(zhuǎn)換為Postgis的Geography對(duì)象的語(yǔ)句如以下代碼所示,POLYGON中的元素為順時(shí)針?biāo)哪_點(diǎn)坐標(biāo)的封閉集合。
圖1 服務(wù)請(qǐng)求的設(shè)計(jì)與分層
因空間對(duì)象同樣也支持索引,所以在數(shù)據(jù)量較大的情況下,通常也需要添加索引以提高檢索效率[10]。
在衛(wèi)星影像的元數(shù)據(jù)處理完成之后,編寫可提供服務(wù)的接口,雖然通過(guò)2.3節(jié)中的敏捷開發(fā)方法能得到簡(jiǎn)單實(shí)現(xiàn)CRUD的代碼,但是想要實(shí)現(xiàn)更為具體復(fù)雜的空間檢索邏輯,仍然需要對(duì)生成的代碼進(jìn)行重寫或者改寫。
GeoJSON是基于JavaScript對(duì)象表示法的地理空間信息數(shù)據(jù)交換格式[11],支持下面幾何類型:點(diǎn)、線、面、多點(diǎn)、多線、多面和幾何集合。其格式如以下代碼所示(以多邊形要素為例)。
后端在接收到JSON格式的請(qǐng)求體后,在持久層使用Postgis的空間位置函數(shù)對(duì)數(shù)據(jù)庫(kù)中的空間對(duì)象和GeoJSON表示的對(duì)象進(jìn)行位置判斷[12],Postgis支持的位置關(guān)系函數(shù)的功能有相交、包含和覆蓋等[13]。下面以st_intersects()為例進(jìn)行相交判斷,關(guān)鍵SQL語(yǔ)句如以下代碼所示。
SELECT * FROM TABLE
后端檢索服務(wù)部署后,前端可以使用多種空間信息形式來(lái)檢索影像。檢索用的空間信息可以選擇這幾種形式:使用WebGIS框架進(jìn)行矢量圖形繪制;上傳帶有空間位置的shp文件;行政區(qū)域的選擇;自定義區(qū)域或者對(duì)全球進(jìn)行網(wǎng)格分隔;使用網(wǎng)格作為空間檢索范圍[14]。這幾種形式最終都可以轉(zhuǎn)換為GeoJSON對(duì)象,通過(guò)Web API傳遞給后臺(tái)進(jìn)行空間檢索。圖2和圖3分別為檢索服務(wù)在前端的應(yīng)用場(chǎng)景和檢索結(jié)果。
圖2 多種空間檢索方式的前端應(yīng)用場(chǎng)景
圖3 檢索結(jié)果
本文敘述了基于RESTful Web API服務(wù)架構(gòu)的遙感影像檢索關(guān)鍵技術(shù)和步驟,并分別從服務(wù)請(qǐng)求設(shè)計(jì)、敏捷開發(fā)和空間地理信息查詢等方面進(jìn)行了細(xì)致的介紹??梢钥闯?,基于RESTful Web API架構(gòu)的檢索服務(wù)對(duì)比傳統(tǒng)的Web架構(gòu)的服務(wù),具有更加簡(jiǎn)單、直接的優(yōu)勢(shì),可以有效提高遙感影像檢索系統(tǒng)的開發(fā)效率及檢索效率。