S3MTileslayer是SuperMap iClient3D for WebGL用于加載各類多源數(shù)據(jù)生成的s3m緩存的圖層堂飞,是在開發(fā)過程中必然會使用到的圖層滓玖,這節(jié)課程就來講解一個(gè)基礎(chǔ)功能湾戳,查詢。
S3MTileslayer有已經(jīng)封裝好的查詢,通過設(shè)置setQueryParameter和添加pickEvent事件來實(shí)現(xiàn)查詢。
//設(shè)置屬性查詢參數(shù)
layer.setQueryParameter({
url: 'http://www.supermapol.com/realspace/services/data-jinjiang/rest/data',
dataSourceName: 'jinjiang',
dataSetName: 'test',
keyWord: 'SmID'
});
//注冊鼠標(biāo)點(diǎn)擊事件
viewer.pickEvent.addEventListener(function(feature){
var title = Cesium.defaultValue(feature.NAME,'');
var description = Cesium.defaultValue(feature.DES,'');
title.innerText = title;
des.innerText = description;
myimg.src = "./images/" + title + ".jpg";
});
先說這種使用方式的優(yōu)點(diǎn):簡單易用寞冯,有明確的接口說明渴析。但這樣的應(yīng)用方式也有很大的弊端:(1)查詢條件過于苛刻晚伙,必須是數(shù)據(jù)服務(wù),keyword必須是SMID(2)必須同時(shí)設(shè)置查詢條件和pickEvent事件才能觸發(fā)查詢俭茧。
在很多應(yīng)用中咆疗,查詢的屬性表并不是通過數(shù)據(jù)服務(wù)來發(fā)布的,這個(gè)時(shí)候又怎么來實(shí)現(xiàn)點(diǎn)選查詢功能呢母债?
這里將實(shí)現(xiàn)步驟分為三步:
1午磁、擴(kuò)展鼠標(biāo)事件
2尝抖、獲取選中對象,構(gòu)建查詢參數(shù)
3迅皇、執(zhí)行查詢昧辽,解析結(jié)果
一、擴(kuò)展鼠標(biāo)事件
這里擴(kuò)展鼠標(biāo)左鍵單擊事件登颓,也可根據(jù)需求擴(kuò)展成右鍵搅荞、鼠標(biāo)移動等。
let selecthandler = new Cesium.ScreenSpaceEventHandler(scene.canvas );
selecthandler.setInputAction(e => {
//點(diǎn)擊回調(diào)事件
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
二框咙、獲取選中對象
在s3mTileslayer的方法中是通過getSelection來獲取選中對象的smid咕痛,在點(diǎn)擊的回調(diào)事件中加入獲取選中對象smid的方法
scene.pick(e.position);
let selectedLayer = scene.layers._selectedLayer;
let id = selectedLayer.getSelection()[0];
為防止對象選中較慢,獲取選中對象之前通過scene.pick再次選中對象
三喇嘱、執(zhí)行查詢
這里構(gòu)建一個(gè)最簡單的方式茉贡,通過smid直接獲取對象的方式來查詢對象。這里通過axios執(zhí)行g(shù)et請求
that.$http .get(dataconfig.dataurl + id + ".json").then(result => {
let data=result.data
})
到這里就完成了一個(gè)最簡單的自定義查詢者铜,下面來看完整代碼
let selecthandler = new Cesium.ScreenSpaceEventHandler(scene.canvas );
selecthandler.setInputAction(e => {
//點(diǎn)擊回調(diào)事件
scene.pick(e.position);
let selectedLayer = scene.layers._selectedLayer;
let id = selectedLayer.getSelection()[0];
that.$http .get(dataconfig.dataurl + id + ".json").then(result => {
let data=result.data
})
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
至于更復(fù)雜的查詢方式腔丧,都可以根據(jù)這種模式來實(shí)現(xiàn)。
這節(jié)課程就到這里作烟,下節(jié)課程再見悔据。歡迎留言、轉(zhuǎn)發(fā)俗壹、評論科汗。