魏世軒
(1.重慶市勘測(cè)院,重慶 401121; 2.重慶市地理國(guó)情監(jiān)測(cè)工程技術(shù)研究中心,重慶 401121)
伴隨著計(jì)算機(jī)、互聯(lián)網(wǎng)的發(fā)展,傳統(tǒng)二維WebGIS技術(shù)已趨于成熟,基于其開(kāi)發(fā)的數(shù)據(jù)展示與查詢(xún)系統(tǒng)也多種多樣,精彩紛呈。目前,市面上比較常用的二維WebGIS類(lèi)庫(kù)有Esri公司開(kāi)發(fā)的ArcGIS API for JavaScrip、開(kāi)源的OpenLayers等。但隨著三維技術(shù)的發(fā)展,其更好地虛擬描述現(xiàn)實(shí)世界的功能,更好的可視化展示效果,激發(fā)了人們對(duì)基于三維WebGIS開(kāi)發(fā)地理信息系統(tǒng)的需求,并且三維環(huán)境下能展示的數(shù)據(jù)遠(yuǎn)遠(yuǎn)多余二維環(huán)境,比如地形數(shù)據(jù)、三維實(shí)景模型等,且三維WebGIS的可拓展性和應(yīng)用前景也優(yōu)于二維WebGIS[1]。本文研究如何基于Cesium建設(shè)三維模式的空間數(shù)據(jù)展示與查詢(xún)系統(tǒng)(圖1),并對(duì)其中的關(guān)鍵技術(shù)進(jìn)行闡述。
圖1 系統(tǒng)主界面
目前,市面上較流行的三維WebGIS類(lèi)庫(kù)有ArcGIS API for JavaScript 4.x系列、Cesium等。ArcGIS API for JavaScript 4.x系列為Esri公司基于WebGL與HTML5技術(shù)開(kāi)發(fā),但其調(diào)用的三維場(chǎng)景資源數(shù)據(jù)格式小眾,需借助ArcGIS Pro發(fā)布,且為付費(fèi)軟件。Cesium是AGI公司開(kāi)發(fā)的一款面向三維地球和地圖的世界級(jí)的JavaScript開(kāi)源產(chǎn)品,具有成本低、開(kāi)發(fā)簡(jiǎn)單、支持多種地圖格式等特性[2],用戶(hù)可快速搭建一款零插件的虛擬地球Web應(yīng)用,可免費(fèi)用于商業(yè)和非商業(yè)用途。
Cesium支持調(diào)用WMS、WMTS、TMS、Bing Maps、ArcGIS等多種地圖服務(wù)圖層,也可以用簡(jiǎn)單的圖片作為地圖源。同時(shí),Cesium也支持許多數(shù)據(jù)格式,如JSON、GeoJSON、XML等。在三維球體上能方便地創(chuàng)建點(diǎn)、線、面、體等實(shí)體,加載地形數(shù)據(jù)、3D Tiles格式的三維實(shí)景模型數(shù)據(jù)等[3]。
本文設(shè)計(jì)研發(fā)的空間數(shù)據(jù)展示與查詢(xún)系統(tǒng)運(yùn)行于局域網(wǎng)環(huán)境下,需搭建私有的系統(tǒng)運(yùn)行基礎(chǔ)底圖,包括覆蓋全球的低分辨率影像、覆蓋全重慶的影像、覆蓋全重慶的路網(wǎng)地名數(shù)據(jù)、覆蓋全重慶的地形數(shù)據(jù)、界線數(shù)據(jù)等。
對(duì)于覆蓋全球的低分辨率影像、覆蓋全重慶的影像數(shù)據(jù),可采用ArcGIS Server發(fā)布成瓦片服務(wù)。Cesium默認(rèn)只支持WGS84地理坐標(biāo)系和Web墨卡托投影下的瓦片地圖,且對(duì)切片比例有要求,對(duì)于發(fā)布Web墨卡托投影的瓦片地圖,需裁切南北85.051129°緯度以上的地區(qū),保證整個(gè)投影是正方形,如圖2所示。出于方便好操作,本文中的全球低分辨率的影像、覆蓋重慶的影像數(shù)據(jù)統(tǒng)一采用WGS84地理坐標(biāo)系,切片時(shí)原點(diǎn)需設(shè)置為X:-180.0,Y:90.0,切片的0級(jí)比例尺需設(shè)置為1∶295497593.05875003,然后依次放大2倍,最后借助Cesium的ArcGIS Map Server Imagery Provider進(jìn)行加載顯示[4,5],如圖3所示。
圖2 Web墨卡托投影下前兩級(jí)瓦片
圖3 WGS84地理坐標(biāo)系下前兩級(jí)瓦片
對(duì)于路網(wǎng)地名數(shù)據(jù),可下載天地圖的TMS形式的瓦片數(shù)據(jù),放置web容器內(nèi),然后借助Cesium的UrlTemplate Imagery Provider進(jìn)行加載顯示。
對(duì)于地形數(shù)據(jù),可借助工具將DEM切成Cesium識(shí)別的地形瓦片文件,然后發(fā)布到web容器內(nèi),然后借助Cesium Terrain Provider進(jìn)行加載,如圖4所示。
圖4 地形瓦片數(shù)據(jù)目錄結(jié)構(gòu)
對(duì)于界線數(shù)據(jù),本文采用發(fā)布成圖層服務(wù)的方式進(jìn)行加載顯示,如圖5所示。
圖5 系統(tǒng)基礎(chǔ)底圖
本文涉及的空間數(shù)據(jù)包括原始衛(wèi)星影像、糾正后衛(wèi)星影像、分幅正射影像、影像控制點(diǎn)數(shù)據(jù)等。
對(duì)于影像類(lèi)型的空間數(shù)據(jù),在數(shù)據(jù)入庫(kù)客戶(hù)端入庫(kù)時(shí)按其所屬子類(lèi)別、影像的獲取時(shí)間、衛(wèi)星類(lèi)型等入庫(kù)到服務(wù)器的對(duì)應(yīng)目錄,同時(shí)提取每個(gè)影像到數(shù)據(jù)范圍和縮略圖。為便于進(jìn)行空間查詢(xún),影像的數(shù)據(jù)范圍應(yīng)是去除黑邊后的有效覆蓋范圍。由于Cesium按實(shí)際位置加載縮略圖時(shí)需指定西南角、東北角的坐標(biāo),所以為了方便瀏覽縮略圖,建議在生成縮略圖時(shí),將縮略圖的長(zhǎng)寬像素值寫(xiě)入已記錄有左上角坐標(biāo)、橫豎分辨率的xml文件,便于瀏覽時(shí)計(jì)算西南角、東北角的坐標(biāo)。
對(duì)于影像控制點(diǎn)數(shù)據(jù),在數(shù)據(jù)入庫(kù)時(shí)將每個(gè)點(diǎn)位的坐標(biāo)文本信息轉(zhuǎn)換為空間矢量點(diǎn)存入數(shù)據(jù)庫(kù)中的空間表,點(diǎn)位的高程、所屬項(xiàng)目、地方坐標(biāo)系坐標(biāo)等信息存入相應(yīng)字段,點(diǎn)位的現(xiàn)場(chǎng)照片、刺點(diǎn)影像、相關(guān)文檔亦可存入數(shù)據(jù)庫(kù)或以文件的形式存放在磁盤(pán)。
對(duì)于影像數(shù)據(jù),將影像的空間覆蓋范圍數(shù)據(jù)配置好填充色及邊框色后借助ArcGIS Server發(fā)布成動(dòng)態(tài)服務(wù)圖層,Cesium環(huán)境下采用ArcGIS Map Server Imagery Provider進(jìn)行加載顯示(圖6)。具體查看某一幅影像時(shí),再借助Single Tile Imagery Provider加載顯示其縮略圖,需指定縮略圖的西南角、東北角坐標(biāo)。
圖6 影像數(shù)據(jù)展示效果
對(duì)于影像控制點(diǎn)數(shù)據(jù),將點(diǎn)圖層按像控點(diǎn)類(lèi)型配置好顏色借助ArcGIS Server統(tǒng)一發(fā)布成一個(gè)點(diǎn)要素的動(dòng)態(tài)服務(wù)圖層,Cesium環(huán)境下采用ArcGIS Map Server Imagery Provider進(jìn)行加載顯示(圖7)。具體查看某一個(gè)點(diǎn)的相關(guān)信息時(shí)再加載其信息及附件。
圖7 影像控制點(diǎn)數(shù)據(jù)展示效果
本文實(shí)現(xiàn)的查詢(xún)功能包括屬性查詢(xún)、空間查詢(xún)(包括導(dǎo)入shp數(shù)據(jù)查詢(xún))及兩者組合查詢(xún)。前端與后端的查詢(xún)條件及查詢(xún)結(jié)果的數(shù)據(jù)交互采用JSON格式(圖8),考慮到數(shù)據(jù)量大,后端分頁(yè)返回查詢(xún)結(jié)果及總量。
圖8 JSON格式的查詢(xún)條件
對(duì)于屬性查詢(xún),根據(jù)不同的數(shù)據(jù)類(lèi)型設(shè)置不同的查詢(xún)條件,包括所屬衛(wèi)星、分辨率、獲取時(shí)間等。由于后臺(tái)數(shù)據(jù)庫(kù)存儲(chǔ)了每類(lèi)數(shù)據(jù)的元數(shù)據(jù)信息,所以屬性查詢(xún)實(shí)現(xiàn)起來(lái)較為容易。
對(duì)于空間查詢(xún),支持手繪矩形、手繪多邊形、導(dǎo)入shp數(shù)據(jù)查詢(xún),手繪圖形借助ScreenSpaceEventHandler、ScreenSpaceEventType.LEFT_DOWN/MOUSE_MOVE/RIGHT_CLICK等實(shí)現(xiàn)鼠標(biāo)左鍵點(diǎn)擊、滑動(dòng)、右鍵點(diǎn)擊事件的監(jiān)聽(tīng),從而實(shí)現(xiàn)矩形、多邊形的實(shí)時(shí)繪制。對(duì)于導(dǎo)入shp數(shù)據(jù)進(jìn)行空間查詢(xún),本文只支持面圖層,取第一條要素進(jìn)行空間查詢(xún),需考慮其可能有空洞、多部件的情況。shp數(shù)據(jù)借助開(kāi)源ShpFile庫(kù)進(jìn)行讀取,record.shapeType為SHAPE_POLYGON、SHAPE_POLYGONM、SHAPE_POLYGONZ表示為面要素。在與后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)通訊時(shí),手繪的矩形、多邊形轉(zhuǎn)換成st_geometry形式的文本數(shù)據(jù)進(jìn)行交互。對(duì)于shp數(shù)據(jù),在實(shí)際使用中發(fā)現(xiàn)shp數(shù)據(jù)可能存在大量的坐標(biāo)點(diǎn),導(dǎo)致最后查詢(xún)數(shù)據(jù)庫(kù)的sql語(yǔ)句超長(zhǎng),因此本文推薦將shp數(shù)據(jù)存入一個(gè)動(dòng)態(tài)服務(wù)圖層,利用其圖斑編號(hào)進(jìn)行空間查詢(xún)。
數(shù)據(jù)查詢(xún)完后,在數(shù)據(jù)列表里顯示查詢(xún)的結(jié)果,列出每條數(shù)據(jù)的相關(guān)信息,在地圖窗口內(nèi)顯示對(duì)應(yīng)的數(shù)據(jù)范圍落圖等,如圖9所示。本文的圖層服務(wù)多采用ArcGIS Server發(fā)布的服務(wù),對(duì)于動(dòng)態(tài)服務(wù)圖層,需修改Cesiun的源碼增加ArcGisMapServerImageryProvider設(shè)置layerDefs的功能,實(shí)現(xiàn)圖層的過(guò)濾顯示,其中的空間范圍過(guò)濾采用st_intersects或st_contains。對(duì)于查詢(xún)后數(shù)據(jù)列表每一行數(shù)據(jù)的單擊定位,采用viewer.flyTo實(shí)現(xiàn)[8]。
定位的實(shí)現(xiàn)代碼:
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 查詢(xún)結(jié)果列表及地圖界面
Cesium支持加載3D Tiles格式的三維實(shí)景數(shù)據(jù),只需將數(shù)據(jù)放置在Web服務(wù)器內(nèi),然后通過(guò)Cesium3Dtileset連接加載即可。
本文實(shí)現(xiàn)了地名查詢(xún)輔助數(shù)據(jù)查詢(xún),輸入地名,查詢(xún)后臺(tái)數(shù)據(jù)庫(kù)中的地名POI,分頁(yè)返回與之匹配的地名數(shù)據(jù)集。地名點(diǎn)在地圖上采用Cesium的billboard進(jìn)行標(biāo)注,點(diǎn)擊地名列表里的每一行地圖自動(dòng)定位至其所在位置,標(biāo)注顏色由紅色改為藍(lán)色,如圖10所示。
圖10 地名查詢(xún)界面
對(duì)于加載到地圖容器里的圖層數(shù)據(jù),可通過(guò)layer的屬性show、alpha控制其是否顯示及圖層的透明度。
本文研究了Cesium對(duì)加載的瓦片數(shù)據(jù)、地形數(shù)據(jù)的格式等要求,在局域網(wǎng)環(huán)境下,搭建了Cesium框架下的基礎(chǔ)底圖,并研究了在Cesium環(huán)境下如何展示和查詢(xún)空間數(shù)據(jù)。數(shù)據(jù)的展示主要采用發(fā)布動(dòng)態(tài)地圖服務(wù)的方式,在數(shù)據(jù)查詢(xún)方面研究了屬性查詢(xún)、空間查詢(xún)及兩者組合查詢(xún),并對(duì)數(shù)據(jù)查詢(xún)中的關(guān)鍵技術(shù)進(jìn)行了闡述。研究表明,開(kāi)源三維web庫(kù)Cesium可替代傳統(tǒng)的ArcGIS API for JavaScrip、OpenLayers等,實(shí)現(xiàn)web端的空間數(shù)據(jù)的展示與查詢(xún),構(gòu)建三維模式下的WebGIS系統(tǒng)。