魏世軒
(1.重慶市勘測院,重慶 401121; 2.重慶市地理國情監測工程技術研究中心,重慶 401121)
伴隨著計算機、互聯網的發展,傳統二維WebGIS技術已趨于成熟,基于其開發的數據展示與查詢系統也多種多樣,精彩紛呈。目前,市面上比較常用的二維WebGIS類庫有Esri公司開發的ArcGIS API for JavaScrip、開源的OpenLayers等。但隨著三維技術的發展,其更好地虛擬描述現實世界的功能,更好的可視化展示效果,激發了人們對基于三維WebGIS開發地理信息系統的需求,并且三維環境下能展示的數據遠遠多余二維環境,比如地形數據、三維實景模型等,且三維WebGIS的可拓展性和應用前景也優于二維WebGIS[1]。本文研究如何基于Cesium建設三維模式的空間數據展示與查詢系統(圖1),并對其中的關鍵技術進行闡述。

圖1 系統主界面
目前,市面上較流行的三維WebGIS類庫有ArcGIS API for JavaScript 4.x系列、Cesium等。ArcGIS API for JavaScript 4.x系列為Esri公司基于WebGL與HTML5技術開發,但其調用的三維場景資源數據格式小眾,需借助ArcGIS Pro發布,且為付費軟件。Cesium是AGI公司開發的一款面向三維地球和地圖的世界級的JavaScript開源產品,具有成本低、開發簡單、支持多種地圖格式等特性[2],用戶可快速搭建一款零插件的虛擬地球Web應用,可免費用于商業和非商業用途。
Cesium支持調用WMS、WMTS、TMS、Bing Maps、ArcGIS等多種地圖服務圖層,也可以用簡單的圖片作為地圖源。同時,Cesium也支持許多數據格式,如JSON、GeoJSON、XML等。在三維球體上能方便地創建點、線、面、體等實體,加載地形數據、3D Tiles格式的三維實景模型數據等[3]。
本文設計研發的空間數據展示與查詢系統運行于局域網環境下,需搭建私有的系統運行基礎底圖,包括覆蓋全球的低分辨率影像、覆蓋全重慶的影像、覆蓋全重慶的路網地名數據、覆蓋全重慶的地形數據、界線數據等。
對于覆蓋全球的低分辨率影像、覆蓋全重慶的影像數據,可采用ArcGIS Server發布成瓦片服務。Cesium默認只支持WGS84地理坐標系和Web墨卡托投影下的瓦片地圖,且對切片比例有要求,對于發布Web墨卡托投影的瓦片地圖,需裁切南北85.051129°緯度以上的地區,保證整個投影是正方形,如圖2所示。出于方便好操作,本文中的全球低分辨率的影像、覆蓋重慶的影像數據統一采用WGS84地理坐標系,切片時原點需設置為X:-180.0,Y:90.0,切片的0級比例尺需設置為1∶295497593.05875003,然后依次放大2倍,最后借助Cesium的ArcGIS Map Server Imagery Provider進行加載顯示[4,5],如圖3所示。

圖2 Web墨卡托投影下前兩級瓦片

圖3 WGS84地理坐標系下前兩級瓦片
對于路網地名數據,可下載天地圖的TMS形式的瓦片數據,放置web容器內,然后借助Cesium的UrlTemplate Imagery Provider進行加載顯示。
對于地形數據,可借助工具將DEM切成Cesium識別的地形瓦片文件,然后發布到web容器內,然后借助Cesium Terrain Provider進行加載,如圖4所示。

圖4 地形瓦片數據目錄結構
對于界線數據,本文采用發布成圖層服務的方式進行加載顯示,如圖5所示。

圖5 系統基礎底圖
本文涉及的空間數據包括原始衛星影像、糾正后衛星影像、分幅正射影像、影像控制點數據等。
對于影像類型的空間數據,在數據入庫客戶端入庫時按其所屬子類別、影像的獲取時間、衛星類型等入庫到服務器的對應目錄,同時提取每個影像到數據范圍和縮略圖。為便于進行空間查詢,影像的數據范圍應是去除黑邊后的有效覆蓋范圍。由于Cesium按實際位置加載縮略圖時需指定西南角、東北角的坐標,所以為了方便瀏覽縮略圖,建議在生成縮略圖時,將縮略圖的長寬像素值寫入已記錄有左上角坐標、橫豎分辨率的xml文件,便于瀏覽時計算西南角、東北角的坐標。
對于影像控制點數據,在數據入庫時將每個點位的坐標文本信息轉換為空間矢量點存入數據庫中的空間表,點位的高程、所屬項目、地方坐標系坐標等信息存入相應字段,點位的現場照片、刺點影像、相關文檔亦可存入數據庫或以文件的形式存放在磁盤。
對于影像數據,將影像的空間覆蓋范圍數據配置好填充色及邊框色后借助ArcGIS Server發布成動態服務圖層,Cesium環境下采用ArcGIS Map Server Imagery Provider進行加載顯示(圖6)。具體查看某一幅影像時,再借助Single Tile Imagery Provider加載顯示其縮略圖,需指定縮略圖的西南角、東北角坐標。

圖6 影像數據展示效果
對于影像控制點數據,將點圖層按像控點類型配置好顏色借助ArcGIS Server統一發布成一個點要素的動態服務圖層,Cesium環境下采用ArcGIS Map Server Imagery Provider進行加載顯示(圖7)。具體查看某一個點的相關信息時再加載其信息及附件。

圖7 影像控制點數據展示效果
本文實現的查詢功能包括屬性查詢、空間查詢(包括導入shp數據查詢)及兩者組合查詢。前端與后端的查詢條件及查詢結果的數據交互采用JSON格式(圖8),考慮到數據量大,后端分頁返回查詢結果及總量。

圖8 JSON格式的查詢條件
對于屬性查詢,根據不同的數據類型設置不同的查詢條件,包括所屬衛星、分辨率、獲取時間等。由于后臺數據庫存儲了每類數據的元數據信息,所以屬性查詢實現起來較為容易。
對于空間查詢,支持手繪矩形、手繪多邊形、導入shp數據查詢,手繪圖形借助ScreenSpaceEventHandler、ScreenSpaceEventType.LEFT_DOWN/MOUSE_MOVE/RIGHT_CLICK等實現鼠標左鍵點擊、滑動、右鍵點擊事件的監聽,從而實現矩形、多邊形的實時繪制。對于導入shp數據進行空間查詢,本文只支持面圖層,取第一條要素進行空間查詢,需考慮其可能有空洞、多部件的情況。shp數據借助開源ShpFile庫進行讀取,record.shapeType為SHAPE_POLYGON、SHAPE_POLYGONM、SHAPE_POLYGONZ表示為面要素。在與后臺數據庫進行數據通訊時,手繪的矩形、多邊形轉換成st_geometry形式的文本數據進行交互。對于shp數據,在實際使用中發現shp數據可能存在大量的坐標點,導致最后查詢數據庫的sql語句超長,因此本文推薦將shp數據存入一個動態服務圖層,利用其圖斑編號進行空間查詢。
數據查詢完后,在數據列表里顯示查詢的結果,列出每條數據的相關信息,在地圖窗口內顯示對應的數據范圍落圖等,如圖9所示。本文的圖層服務多采用ArcGIS Server發布的服務,對于動態服務圖層,需修改Cesiun的源碼增加ArcGisMapServerImageryProvider設置layerDefs的功能,實現圖層的過濾顯示,其中的空間范圍過濾采用st_intersects或st_contains。對于查詢后數據列表每一行數據的單擊定位,采用viewer.flyTo實現[8]。
定位的實現代碼:
viewer.flyTo(selectEntity,{
duration:0.5,
offset:{
heading:Cesium.Math.toRadians(0.0),
pitch:Cesium.Math.toRadians(-90),
range:Math.ceil(viewer.camera.positionCartographic.height)
}
});

圖9 查詢結果列表及地圖界面
Cesium支持加載3D Tiles格式的三維實景數據,只需將數據放置在Web服務器內,然后通過Cesium3Dtileset連接加載即可。
本文實現了地名查詢輔助數據查詢,輸入地名,查詢后臺數據庫中的地名POI,分頁返回與之匹配的地名數據集。地名點在地圖上采用Cesium的billboard進行標注,點擊地名列表里的每一行地圖自動定位至其所在位置,標注顏色由紅色改為藍色,如圖10所示。

圖10 地名查詢界面
對于加載到地圖容器里的圖層數據,可通過layer的屬性show、alpha控制其是否顯示及圖層的透明度。
本文研究了Cesium對加載的瓦片數據、地形數據的格式等要求,在局域網環境下,搭建了Cesium框架下的基礎底圖,并研究了在Cesium環境下如何展示和查詢空間數據。數據的展示主要采用發布動態地圖服務的方式,在數據查詢方面研究了屬性查詢、空間查詢及兩者組合查詢,并對數據查詢中的關鍵技術進行了闡述。研究表明,開源三維web庫Cesium可替代傳統的ArcGIS API for JavaScrip、OpenLayers等,實現web端的空間數據的展示與查詢,構建三維模式下的WebGIS系統。