劉明青,朱國賓,陳西亮
(1.武漢大學 遙感信息工程學院,湖北 武漢 430079)
近年來,隨著智慧城市建設進程的逐步推進,地理空間信息被廣泛應用于各行各業,并發揮著重要作用。不同于一般數據,地理空間信息數據的屬性復雜,通常包含大小、形狀、位置或拓撲關系等復雜關系。因此,地理空間信息數據的有效使用和共享面臨著挑戰[1]。在Web服務開發中,現有的地理空間信息API均存在一定的缺陷。
REST是前后端的一種規范性約束,使其易于理解,方便調用。HATEOAS是在最成熟、最復雜的REST分離技術的基礎上提出的指導Web應用開發的原則,是對API的約束,打破了客戶端與服務器之間的嚴格契約,使客戶端趨于智能化和自適應化,也使得REST服務本身的更新和演化更加容易[2]。傳統REST架構風格的地理空間信息API往往只注重數據提取的便捷性和交互效率,沒有充分體現地理信息數據特有的空間關聯關系。然而,現有的地理空間信息RESTful API都沒有嚴格遵循HATEOAS約束。因此,本文提出了一種遵循HATEOAS約束的地理信息RESTful API,有助于地理信息Web應用的開發,進而提高地理信息的共享水平和效率。
REST架構是由HTTP協議設計者之一的Fielding R T[3]在其博士論文中提出的。近年來,REST架構被普遍作為軟件系統的接口設計標準。由于各種接口設計的目的是降低Web應用開發的復雜度,提高系統的可維護性和可伸縮性[4],因此接口規范性與靈活性的統一成為衡量接口優勢的重要特征。目前,絕大多數的Web應用開發都遵循REST架構的設計風格,從而使得REST架構風格的接口設計規范成為事實上的開發標準[5]。REST架構風格定義了客戶端—服務器結構、無狀態、可緩存、分層的系統和統一接口5個約束,只有滿足這些約束,才能稱之為符合REST架構風格[6-7],即 RESTful。
目前,在地理信息Web應用開發中,大部分采用基于REST風格的設計和實現。現有的RESTful API包括ESRI的ArcGIS Sever RESTful API、Nanaimo Properties、FeatureSever、基于GeoJSON表達的RESTful API等,其中基于GeoJSON表達的RESTful API常應用于地理信息Web應用開發中。
GeoJSON是一種對各種地理數據結構進行編碼的格式,是基于Javascript對象表示法(JSON)的地理空間信息數據交換格式[8]。GeoJSON由一個單獨對象組成,該對象為幾何體、屬性或幾何體集、屬性集[9]。相較于其他數據格式,GeoJSON更便于理解、更簡易、更方便客戶端訪問提取,提高了服務端與客戶端的交互效率。然而,GeoJSON對多個地理空間面要素的表達較模糊,不利于開發人員的理解,給地理信息Web應用開發帶來不便。例如,兩個基于GeoJSON的地理要素表達為;


由上述代碼可知,兩個GeoJSON十分相似,但分別代表兩個嵌套的多邊形和有孔洞的多邊形,如圖1所示,GeoJSON從結構上無法清晰表示兩個多邊形的空間關系,需要開發者通過對結構的包含關系進行解析,才能區分隱含的空間關系。因此,本文提出了一種遵循HATEOAS約束的地理信息RESTful API,將空間關系加入到API設計中,從而提高地理信息的共享水平。

圖1 地理要素示意圖
HATEOAS是REST架構風格中最成熟、最復雜的約束,也是構建成熟RESTful服務的核心。2008年Richardson提出了REST的成熟度模型。該模型將REST成熟度劃分為4個層次,而HATEOAS屬于目前Web服務設計最理想的層級。作為最成熟的REST架構風格約束,HATEOAS通過超媒體提供客戶端與服務端之間的交互,使得服務器與客戶端完全解耦,打破了客戶端與服務器之間的嚴格契約,使客戶端趨于智能化和自適應化,也顯著提升了RESTful API的可發現性和響應的自解釋性[10]。因此,本文利用HATEOAS約束構建地理信息RESTful API,并以遙感影像Web應用開發為例,闡述了面向HATEOAS約束的地理信息RESTful API開發的設計思路與實現過程。
本文基于HATEOAS約束,設計了一種面向遙感影像服務的RESTful API,以實現對某一范圍內遙感影像的查詢與展示,主要采用Spring Boot框架進行開發。Spring Boot框架免除了Spring開發中繁雜的配置,使應用變得更輕量化[11]。Spring Boot開發的Web應用程序主要采用MVC模式,同時其提供的Spring HATEOAS能幫助開發者快速構建遵循HATEOAS約束的RESTful API。HATEOAS代表超媒體作為應用狀態引擎,即通過超媒體(資源URIS)控制客戶端的狀態轉換[12]。HATEOAS的設計理念為響應包含指向其他資源的鏈接。REST客戶端在請求一個API URI時,可獲得服務提供的多個資源鏈接,通過這些資源鏈接客戶端能動態獲取當前可操作資源,因此客戶端不必再硬編碼URI結構獲取不同資源[13]。遵循HATEOAS約束可以提高API的靈活性,使客戶端趨于智能化。
對于海量衛星遙感影像,首先需要解決海量數據的存儲問題,然后為了實現客戶端的無縫影像縮放,需在存儲結構中實現不同分辨率影像的層級。常用方法是通過金字塔結構構建遙感影像瓦片形態。本文采用go-fastdfs分布式文件系統來實現瓦片數據的存儲和管理。go-fastdfs是一個基于HTTP協議的分布式文件系統,相較于常規的數據庫管理系統,其性能高、可靠性高、運維擴展簡單,尤其適合海量數據的存儲與獲取。該文件系統支持上傳海量數據,且能通過上傳路徑和文件名為數據構建唯一的資源路徑,并支持統一認證憑據。在數據處理過程中,通過特定的編碼規則確定每張瓦片的唯一索引;再利用每張瓦片的唯一編碼確定其上傳目錄,上傳至文件管理系統中。由此,可通過經緯度坐標生成瓦片編碼,確定目標瓦片在文件管理系統中的資源路徑,從而獲取目標瓦片。
在傳統遙感影像的RESTful API設計過程中,往往只注重其位置信息,即單個瓦片的地理坐標;而忽視了瓦片之間的空間關系,因此開發遙感影像RESTful API時,若想獲取多張空間上連續的瓦片,只能通過這些瓦片的地理坐標信息發出多次請求,這樣既造成了客戶端與服務端的頻繁交互,又延長了客戶端的展示時間。
本文在遙感影像的RESTful API設計時,首先嚴格遵循HATEOAS約束,提高開發者使用該API進行開發的效率;然后在該API中加入遙感影像瓦片的空間鄰域關系,使客戶端能快速獲取該瓦片周圍的8張瓦片以及相鄰分辨率層級的兩張瓦片,從而提高API的可發現性與應用靈活性,以及客戶端的智能化與自適應化。遙感影像瓦片空間鄰域關系示意圖如圖2所示。

圖2 瓦片空間鄰域關系示意圖
遵循HATEOAS約束的遙感影像RESTful API的一個實例為;


RESTful API包括遙感影像瓦片的name、geometry、level和links屬性,其中geometry屬性包含數據類型以及該瓦片的4個角點坐標;links屬性包含瓦片自身以及與其空間相關瓦片的資源路徑,self是瓦片自身的資源路徑,left_up、up、right_up、left、right、left_down、down、right_down對應該瓦片同級左上、上、右上、左、右、左下、下、右下8張瓦片,upon和below分別對應高斯金字塔中其上、下級兩張瓦片的資源路徑。
上述遙感影像RESTful API在請求單張瓦片時,可同時獲得與該瓦片空間相關的其他瓦片資源鏈接,客戶端可直接通過這些資源鏈接獲取相關瓦片,無需進行多次請求,且響應的資源鏈接所指向的瓦片與目標瓦片的空間關系十分清晰,易于理解。該RESTful API的設計符合HATEOAS約束。在遙感影像的應用場景中,通常會采用大量空間相關的瓦片提供服務,因此利用遵循HATEOAS約束的RESTful API進行遙感影像Web應用開發可極大地提高開發效率。
在基于RESTful API的Web應用中,通過視圖(View)獲取用戶輸入的經緯度坐標、層級以及瀏覽器窗口大小,通過GET請求將參數發送到控制器(Controller);后端通過RESTful API獲取EntityModel。EntityModel的屬性包括目標瓦片基本信息、資源路徑以及與其空間相關瓦片的資源路徑。
將目標瓦片置于瀏覽器窗口中心,后端根據窗口大小參數計算得到填充整個窗口所需的瓦片數量以及這些瓦片與目標瓦片的空間關系。以目標瓦片為中心,通過服務接口快速獲取周圍瓦片;再利用服務接口對周圍瓦片進行遞歸調用,直至得到充滿整個窗口的遙感影像瓦片,實現了遙感影像瓦片由瀏覽器窗口中心到窗口邊緣的快速獲取。
在后端的服務部署完成后,可通過前端提供的經緯度坐標和遙感影像層級方式進行遙感影像的查詢和展示,最終得到充滿整個瀏覽器窗口的遙感影像。遙感影像查詢結果如圖3所示。

圖3 遙感影像展示
本文提出了一種遵循HATEOAS約束的地理空間信息RESTful API,并以遙感影像查詢、展示的Web應用開發為例,驗證了利用遵循HATEOAS約束的地理信息RESTful API進行地理信息Web應用開發的高效性與便捷性。盡管本文僅以遙感影像的無縫瀏覽為例,但HATEOAS約束可普遍應用于各種地理空間信息服務的API設計原則中,使API服務與空間關系約束相結合,從而拓展其鏈接能力,也更符合REST規范,提高了API設計的成熟度。因此,將地理信息中特有的空間關系加入API設計中,可極大提高地理信息Web服務應用的開發效率,從而提高地理信息的共享水平。