有了BIM+GIS,實作室内室外一體化,室内導航等不再是夢想了哈!
最近為了學bim+gis,斷斷續續開始學超圖産品,還是小白一枚,若分享中有錯誤,歡迎批評指正!
關于BIM的屬性查詢,之前在網上沒找到合适的解決方案,走了不少彎路,終于解決了!廢話不多說,直接上幹貨!
相信有不少小夥伴像我一樣,學習時候參考的這個範例http://support.supermap.com.cn:8090/webgl/examples/editor.html#S3MTiles_BIM
但是,這是個坑啊!入坑的小夥伴們讓我看到你們的雙手,知道自己不是一個人
我聯系了超圖的技術人員,給出的答複是這個BIM模型是矢量面貼上去的,釋出的資料服務是多個資料聚合雲雲的(具體說法忘了,總之不要用這個撒)
需要參考的正确範例是這個http://support.supermap.com.cn:8090/webgl/examples/editor.html#S3MTiles
先把我的代碼貼上來吧,後面解釋一下幾點需要注意的地方。
<!DOCTYPE html>
<html >
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<title>屬性查詢</title>
<link href="./Build/Cesium/Widgets/widgets.css" target="_blank" rel="external nofollow" rel="stylesheet">
<link href="./css/pretty.css" target="_blank" rel="external nofollow" rel="stylesheet">
<script src="./js/jquery.min.js"></script>
<script src="./js/config.js"></script>
<script type="text/javascript" src="./js/require.min.js" data-main="js/main"></script>
<style>
html, body, #cesiumContainer {
width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;background-color: #000000;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<div id='loadingbar' class="spinner">
<div class="spinner-container container1">
<div class="circle1"></div>
<div class="circle2"></div>
<div class="circle3"></div>
<div class="circle4"></div>
</div>
<div class="spinner-container container2">
<div class="circle1"></div>
<div class="circle2"></div>
<div class="circle3"></div>
<div class="circle4"></div>
</div>
<div class="spinner-container container3">
<div class="circle1"></div>
<div class="circle2"></div>
<div class="circle3"></div>
<div class="circle4"></div>
</div>
</div>
<blockquote id="bubble" class="bubble">
<h2 id="title"></h2>
<p id="des" class="word"></p>
</blockquote>
<script type="text/javascript">
function onload(Cesium) {
var infoboxContainer = document.getElementById("bubble");
//初始化viewer部件
var viewer = new Cesium.Viewer('cesiumContainer',{
imageryProvider: new Cesium.BingMapsImageryProvider({
url : 'https://dev.virtualearth.net',
mapStyle : Cesium.BingMapsStyle.AERIAL
})
});
viewer.scene.undergroundMode = true; //設定開啟地下場景
viewer.customInfobox = infoboxContainer;
var scene = viewer.scene;
var canvas = scene.canvas;
var widget = viewer.cesiumWidget;
$('#loadingbar').remove();
try {
//添加S3M圖層服務
var promise = scene.addS3MTilesLayerByScp('http://localhost:8090/iserver/services/3D-JiaNianHuaZhan2/rest/realspace/datas/[email protected]建築整合/config', {
name: 'jinjiang'
});
Cesium.when(promise, function (layer) {
if(!scene.pickPositionSupported){
alert('不支援深度拾取,屬性查詢功能無法使用!');
}
//設定屬性查詢參數
layer.setQueryParameter({
url: 'http://localhost:8090/iserver/services/data-JiaNianHuaZhan/rest/data',
dataSourceName: '建築整合',
dataSetName: 'PrjRegionResult',
keyWord: 'SmID'
});
//設定相機視角
scene.camera.setView({
//将經度、緯度、高度的坐标轉換為笛卡爾坐标
destination : new Cesium.Cartesian3.fromDegrees(120.398294317173950,36.117298362827277,50),
orientation : {
heading : 4.7793869967010565,
pitch : -0.5899023527373464,
roll : 8.539835505416704e-12
}
});
}, function (e) {
if (widget._showRenderLoopErrors) {
var title = '渲染時發生錯誤,已停止渲染。';
widget.showErrorPanel(title, undefined, e);
}
});
}
catch (e) {
if (widget._showRenderLoopErrors) {
var title = '渲染時發生錯誤,已停止渲染。';
widget.showErrorPanel(title, undefined, e);
}
}
//添加自定義infobox
var title = document.getElementById("title");
var des = document.getElementById("des");
var myimg = document.getElementById("myimg");
//注冊滑鼠點選事件
viewer.pickEvent.addEventListener(function(feature){
console.log(feature);
var title = Cesium.defaultValue(feature.NAME,'');
var description=new Array()
description[0]=Cesium.defaultValue("SMID:"+feature.SMID,'');
description[1]=Cesium.defaultValue("SMSDRIW:"+feature.SMSDRIW,'');
description[2]=Cesium.defaultValue("SMSDRIN:"+feature.SMSDRIN,'');
description[3]=Cesium.defaultValue("ELEMENTID:"+feature.ELEMENTID,'');
title.innerText = title;
des.innerText = description;
});
}
</script>
</body>
</html>
回到小白的解決曆程上來:
1.關于BIM模型的服務,你釋出對了嗎?
需要注意的幾個點:
(1)BIM模型的資料源添加到場景中(友情提示,減少出錯機會,初學者最好先用一個圖層)
(2)打開場景,選擇上方工具條中的【對象操作】->【截面與投影】->【投影面】,選擇對應資料擷取其投影面資料(非常重要!!!不然資料量太大,想進行屬性查詢?不存在可能性的)
(3)場景右鍵生成緩存,儲存并關閉場景(關閉很重要!!!同一資料不能同時在desktop 和iServer中打開)
生成場景緩存時會有這樣的提示,我就一個建議,别聽它忽悠,别聽它吓唬你!勇敢的生成場景緩存吧!離革命勝利又近了一步啦!
根據個人喜好修改下路徑啥的,然後坐等進度條跑完。再提醒一次,完事兒記得儲存并關閉!因為檔案型資料源具有獨占性!!!
(4)然後打開SUPERMAP ISERVER進行服務的釋出,包括REST三維服務和資料服務!
我的iServer是免安裝版的,是以要先start.bat啟動服務.服務啟動之後通路iserver就是這個界面。釋出服務需要選擇服務管理。
個人經驗:這個路徑盡量不要包含中文,否則點選下一步沒反應!
選擇這兩種服務類型點選下一步釋出即可。然後釋出的資料服務就可以用在上述的DEMO代碼中調試檢視效果啦!給大家看下我的效果。作為一個妹子,我也深知這樣的界面醜到你了,哈哈,我也覺得彈窗好醜,功能實作了最重要。
如果您有任何問題,歡迎聯系我,我們一起讨論呀