劉明青,朱國賓,陳西亮
(1.武漢大學(xué) 遙感信息工程學(xué)院,湖北 武漢 430079)
近年來,隨著智慧城市建設(shè)進(jìn)程的逐步推進(jìn),地理空間信息被廣泛應(yīng)用于各行各業(yè),并發(fā)揮著重要作用。不同于一般數(shù)據(jù),地理空間信息數(shù)據(jù)的屬性復(fù)雜,通常包含大小、形狀、位置或拓?fù)潢P(guān)系等復(fù)雜關(guān)系。因此,地理空間信息數(shù)據(jù)的有效使用和共享面臨著挑戰(zhàn)[1]。在Web服務(wù)開發(fā)中,現(xiàn)有的地理空間信息API均存在一定的缺陷。
REST是前后端的一種規(guī)范性約束,使其易于理解,方便調(diào)用。HATEOAS是在最成熟、最復(fù)雜的REST分離技術(shù)的基礎(chǔ)上提出的指導(dǎo)Web應(yīng)用開發(fā)的原則,是對API的約束,打破了客戶端與服務(wù)器之間的嚴(yán)格契約,使客戶端趨于智能化和自適應(yīng)化,也使得REST服務(wù)本身的更新和演化更加容易[2]。傳統(tǒng)REST架構(gòu)風(fēng)格的地理空間信息API往往只注重?cái)?shù)據(jù)提取的便捷性和交互效率,沒有充分體現(xiàn)地理信息數(shù)據(jù)特有的空間關(guān)聯(lián)關(guān)系。然而,現(xiàn)有的地理空間信息RESTful API都沒有嚴(yán)格遵循HATEOAS約束。因此,本文提出了一種遵循HATEOAS約束的地理信息RESTful API,有助于地理信息Web應(yīng)用的開發(fā),進(jìn)而提高地理信息的共享水平和效率。
REST架構(gòu)是由HTTP協(xié)議設(shè)計(jì)者之一的Fielding R T[3]在其博士論文中提出的。近年來,REST架構(gòu)被普遍作為軟件系統(tǒng)的接口設(shè)計(jì)標(biāo)準(zhǔn)。由于各種接口設(shè)計(jì)的目的是降低Web應(yīng)用開發(fā)的復(fù)雜度,提高系統(tǒng)的可維護(hù)性和可伸縮性[4],因此接口規(guī)范性與靈活性的統(tǒng)一成為衡量接口優(yōu)勢的重要特征。目前,絕大多數(shù)的Web應(yīng)用開發(fā)都遵循REST架構(gòu)的設(shè)計(jì)風(fēng)格,從而使得REST架構(gòu)風(fēng)格的接口設(shè)計(jì)規(guī)范成為事實(shí)上的開發(fā)標(biāo)準(zhǔn)[5]。REST架構(gòu)風(fēng)格定義了客戶端—服務(wù)器結(jié)構(gòu)、無狀態(tài)、可緩存、分層的系統(tǒng)和統(tǒng)一接口5個(gè)約束,只有滿足這些約束,才能稱之為符合REST架構(gòu)風(fēng)格[6-7],即 RESTful。
目前,在地理信息Web應(yīng)用開發(fā)中,大部分采用基于REST風(fēng)格的設(shè)計(jì)和實(shí)現(xiàn)?,F(xiàn)有的RESTful API包括ESRI的ArcGIS Sever RESTful API、Nanaimo Properties、FeatureSever、基于GeoJSON表達(dá)的RESTful API等,其中基于GeoJSON表達(dá)的RESTful API常應(yīng)用于地理信息Web應(yīng)用開發(fā)中。
GeoJSON是一種對各種地理數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼的格式,是基于Javascript對象表示法(JSON)的地理空間信息數(shù)據(jù)交換格式[8]。GeoJSON由一個(gè)單獨(dú)對象組成,該對象為幾何體、屬性或幾何體集、屬性集[9]。相較于其他數(shù)據(jù)格式,GeoJSON更便于理解、更簡易、更方便客戶端訪問提取,提高了服務(wù)端與客戶端的交互效率。然而,GeoJSON對多個(gè)地理空間面要素的表達(dá)較模糊,不利于開發(fā)人員的理解,給地理信息Web應(yīng)用開發(fā)帶來不便。例如,兩個(gè)基于GeoJSON的地理要素表達(dá)為;
由上述代碼可知,兩個(gè)GeoJSON十分相似,但分別代表兩個(gè)嵌套的多邊形和有孔洞的多邊形,如圖1所示,GeoJSON從結(jié)構(gòu)上無法清晰表示兩個(gè)多邊形的空間關(guān)系,需要開發(fā)者通過對結(jié)構(gòu)的包含關(guān)系進(jìn)行解析,才能區(qū)分隱含的空間關(guān)系。因此,本文提出了一種遵循HATEOAS約束的地理信息RESTful API,將空間關(guān)系加入到API設(shè)計(jì)中,從而提高地理信息的共享水平。
圖1 地理要素示意圖
HATEOAS是REST架構(gòu)風(fēng)格中最成熟、最復(fù)雜的約束,也是構(gòu)建成熟RESTful服務(wù)的核心。2008年Richardson提出了REST的成熟度模型。該模型將REST成熟度劃分為4個(gè)層次,而HATEOAS屬于目前Web服務(wù)設(shè)計(jì)最理想的層級。作為最成熟的REST架構(gòu)風(fēng)格約束,HATEOAS通過超媒體提供客戶端與服務(wù)端之間的交互,使得服務(wù)器與客戶端完全解耦,打破了客戶端與服務(wù)器之間的嚴(yán)格契約,使客戶端趨于智能化和自適應(yīng)化,也顯著提升了RESTful API的可發(fā)現(xiàn)性和響應(yīng)的自解釋性[10]。因此,本文利用HATEOAS約束構(gòu)建地理信息RESTful API,并以遙感影像Web應(yīng)用開發(fā)為例,闡述了面向HATEOAS約束的地理信息RESTful API開發(fā)的設(shè)計(jì)思路與實(shí)現(xiàn)過程。
本文基于HATEOAS約束,設(shè)計(jì)了一種面向遙感影像服務(wù)的RESTful API,以實(shí)現(xiàn)對某一范圍內(nèi)遙感影像的查詢與展示,主要采用Spring Boot框架進(jìn)行開發(fā)。Spring Boot框架免除了Spring開發(fā)中繁雜的配置,使應(yīng)用變得更輕量化[11]。Spring Boot開發(fā)的Web應(yīng)用程序主要采用MVC模式,同時(shí)其提供的Spring HATEOAS能幫助開發(fā)者快速構(gòu)建遵循HATEOAS約束的RESTful API。HATEOAS代表超媒體作為應(yīng)用狀態(tài)引擎,即通過超媒體(資源URIS)控制客戶端的狀態(tài)轉(zhuǎn)換[12]。HATEOAS的設(shè)計(jì)理念為響應(yīng)包含指向其他資源的鏈接。REST客戶端在請求一個(gè)API URI時(shí),可獲得服務(wù)提供的多個(gè)資源鏈接,通過這些資源鏈接客戶端能動(dòng)態(tài)獲取當(dāng)前可操作資源,因此客戶端不必再硬編碼URI結(jié)構(gòu)獲取不同資源[13]。遵循HATEOAS約束可以提高API的靈活性,使客戶端趨于智能化。
對于海量衛(wèi)星遙感影像,首先需要解決海量數(shù)據(jù)的存儲(chǔ)問題,然后為了實(shí)現(xiàn)客戶端的無縫影像縮放,需在存儲(chǔ)結(jié)構(gòu)中實(shí)現(xiàn)不同分辨率影像的層級。常用方法是通過金字塔結(jié)構(gòu)構(gòu)建遙感影像瓦片形態(tài)。本文采用go-fastdfs分布式文件系統(tǒng)來實(shí)現(xiàn)瓦片數(shù)據(jù)的存儲(chǔ)和管理。go-fastdfs是一個(gè)基于HTTP協(xié)議的分布式文件系統(tǒng),相較于常規(guī)的數(shù)據(jù)庫管理系統(tǒng),其性能高、可靠性高、運(yùn)維擴(kuò)展簡單,尤其適合海量數(shù)據(jù)的存儲(chǔ)與獲取。該文件系統(tǒng)支持上傳海量數(shù)據(jù),且能通過上傳路徑和文件名為數(shù)據(jù)構(gòu)建唯一的資源路徑,并支持統(tǒng)一認(rèn)證憑據(jù)。在數(shù)據(jù)處理過程中,通過特定的編碼規(guī)則確定每張瓦片的唯一索引;再利用每張瓦片的唯一編碼確定其上傳目錄,上傳至文件管理系統(tǒng)中。由此,可通過經(jīng)緯度坐標(biāo)生成瓦片編碼,確定目標(biāo)瓦片在文件管理系統(tǒng)中的資源路徑,從而獲取目標(biāo)瓦片。
在傳統(tǒng)遙感影像的RESTful API設(shè)計(jì)過程中,往往只注重其位置信息,即單個(gè)瓦片的地理坐標(biāo);而忽視了瓦片之間的空間關(guān)系,因此開發(fā)遙感影像RESTful API時(shí),若想獲取多張空間上連續(xù)的瓦片,只能通過這些瓦片的地理坐標(biāo)信息發(fā)出多次請求,這樣既造成了客戶端與服務(wù)端的頻繁交互,又延長了客戶端的展示時(shí)間。
本文在遙感影像的RESTful API設(shè)計(jì)時(shí),首先嚴(yán)格遵循HATEOAS約束,提高開發(fā)者使用該API進(jìn)行開發(fā)的效率;然后在該API中加入遙感影像瓦片的空間鄰域關(guān)系,使客戶端能快速獲取該瓦片周圍的8張瓦片以及相鄰分辨率層級的兩張瓦片,從而提高API的可發(fā)現(xiàn)性與應(yīng)用靈活性,以及客戶端的智能化與自適應(yīng)化。遙感影像瓦片空間鄰域關(guān)系示意圖如圖2所示。
圖2 瓦片空間鄰域關(guān)系示意圖
遵循HATEOAS約束的遙感影像RESTful API的一個(gè)實(shí)例為;
RESTful API包括遙感影像瓦片的name、geometry、level和links屬性,其中g(shù)eometry屬性包含數(shù)據(jù)類型以及該瓦片的4個(gè)角點(diǎn)坐標(biāo);links屬性包含瓦片自身以及與其空間相關(guān)瓦片的資源路徑,self是瓦片自身的資源路徑,left_up、up、right_up、left、right、left_down、down、right_down對應(yīng)該瓦片同級左上、上、右上、左、右、左下、下、右下8張瓦片,upon和below分別對應(yīng)高斯金字塔中其上、下級兩張瓦片的資源路徑。
上述遙感影像RESTful API在請求單張瓦片時(shí),可同時(shí)獲得與該瓦片空間相關(guān)的其他瓦片資源鏈接,客戶端可直接通過這些資源鏈接獲取相關(guān)瓦片,無需進(jìn)行多次請求,且響應(yīng)的資源鏈接所指向的瓦片與目標(biāo)瓦片的空間關(guān)系十分清晰,易于理解。該RESTful API的設(shè)計(jì)符合HATEOAS約束。在遙感影像的應(yīng)用場景中,通常會(huì)采用大量空間相關(guān)的瓦片提供服務(wù),因此利用遵循HATEOAS約束的RESTful API進(jìn)行遙感影像Web應(yīng)用開發(fā)可極大地提高開發(fā)效率。
在基于RESTful API的Web應(yīng)用中,通過視圖(View)獲取用戶輸入的經(jīng)緯度坐標(biāo)、層級以及瀏覽器窗口大小,通過GET請求將參數(shù)發(fā)送到控制器(Controller);后端通過RESTful API獲取EntityModel。EntityModel的屬性包括目標(biāo)瓦片基本信息、資源路徑以及與其空間相關(guān)瓦片的資源路徑。
將目標(biāo)瓦片置于瀏覽器窗口中心,后端根據(jù)窗口大小參數(shù)計(jì)算得到填充整個(gè)窗口所需的瓦片數(shù)量以及這些瓦片與目標(biāo)瓦片的空間關(guān)系。以目標(biāo)瓦片為中心,通過服務(wù)接口快速獲取周圍瓦片;再利用服務(wù)接口對周圍瓦片進(jìn)行遞歸調(diào)用,直至得到充滿整個(gè)窗口的遙感影像瓦片,實(shí)現(xiàn)了遙感影像瓦片由瀏覽器窗口中心到窗口邊緣的快速獲取。
在后端的服務(wù)部署完成后,可通過前端提供的經(jīng)緯度坐標(biāo)和遙感影像層級方式進(jìn)行遙感影像的查詢和展示,最終得到充滿整個(gè)瀏覽器窗口的遙感影像。遙感影像查詢結(jié)果如圖3所示。
圖3 遙感影像展示
本文提出了一種遵循HATEOAS約束的地理空間信息RESTful API,并以遙感影像查詢、展示的Web應(yīng)用開發(fā)為例,驗(yàn)證了利用遵循HATEOAS約束的地理信息RESTful API進(jìn)行地理信息Web應(yīng)用開發(fā)的高效性與便捷性。盡管本文僅以遙感影像的無縫瀏覽為例,但HATEOAS約束可普遍應(yīng)用于各種地理空間信息服務(wù)的API設(shè)計(jì)原則中,使API服務(wù)與空間關(guān)系約束相結(jié)合,從而拓展其鏈接能力,也更符合REST規(guī)范,提高了API設(shè)計(jì)的成熟度。因此,將地理信息中特有的空間關(guān)系加入API設(shè)計(jì)中,可極大提高地理信息Web服務(wù)應(yīng)用的開發(fā)效率,從而提高地理信息的共享水平。