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


圖1 服務請求的設計與分層

因空間對象同樣也支持索引,所以在數據量較大的情況下,通常也需要添加索引以提高檢索效率[10]。
在衛星影像的元數據處理完成之后,編寫可提供服務的接口,雖然通過2.3節中的敏捷開發方法能得到簡單實現CRUD的代碼,但是想要實現更為具體復雜的空間檢索邏輯,仍然需要對生成的代碼進行重寫或者改寫。
GeoJSON是基于JavaScript對象表示法的地理空間信息數據交換格式[11],支持下面幾何類型:點、線、面、多點、多線、多面和幾何集合。其格式如以下代碼所示(以多邊形要素為例)。


后端在接收到JSON格式的請求體后,在持久層使用Postgis的空間位置函數對數據庫中的空間對象和GeoJSON表示的對象進行位置判斷[12],Postgis支持的位置關系函數的功能有相交、包含和覆蓋等[13]。下面以st_intersects()為例進行相交判斷,關鍵SQL語句如以下代碼所示。
SELECT * FROM TABLE


后端檢索服務部署后,前端可以使用多種空間信息形式來檢索影像。檢索用的空間信息可以選擇這幾種形式:使用WebGIS框架進行矢量圖形繪制;上傳帶有空間位置的shp文件;行政區域的選擇;自定義區域或者對全球進行網格分隔;使用網格作為空間檢索范圍[14]。這幾種形式最終都可以轉換為GeoJSON對象,通過Web API傳遞給后臺進行空間檢索。圖2和圖3分別為檢索服務在前端的應用場景和檢索結果。

圖2 多種空間檢索方式的前端應用場景

圖3 檢索結果
本文敘述了基于RESTful Web API服務架構的遙感影像檢索關鍵技術和步驟,并分別從服務請求設計、敏捷開發和空間地理信息查詢等方面進行了細致的介紹。可以看出,基于RESTful Web API架構的檢索服務對比傳統的Web架構的服務,具有更加簡單、直接的優勢,可以有效提高遙感影像檢索系統的開發效率及檢索效率。