/*獲取geojson數據*/ function get_geojson(name,h,n){ let x=document.getElementById(n); if(x.className === "la"){ loadgeojson(name,h,n); x.className = "la2"; }else{ x.className = "la"; let len = viewer.dataSources.length; if(len>0){ for(let i=0;i<len;i++){ var dataSource = viewer.dataSources.get(i); if(dataSource._name === n){ viewer.dataSources.remove(dataSource); } } } } } var promise=new Array(9); function loadgeojson(name,h,n){ let xmlhttp,p; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP_geo"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200 ) { p=xmlhttp.response; Cesium.Math.setRandomNumberSeed(0);//設置隨機數種子 promise[n] = Cesium.GeoJsonDataSource.load(p); promise[n].then(function (dataSource) { viewer.dataSources.add(dataSource); dataSource.name= n; let entities = dataSource.entities.values; entities.id=n; let colorHash = {}; //可對單個實體進行設置 for (let i = 0; i < entities.length; i++) { let entity = entities[i];//geojson里面必須得有一個name屬性,entity.name對應 let name = entity.name;//可以使兩個同名要素使用同一種顏色 let color = colorHash[name]; if (!color) { color = Cesium.Color.fromRandom({ alpha : 1.0 }); colorHash[name] = color; } entity.polygon.material = color; entity.polygon.outline = true;// polygon邊線顯示與否 entity.polygon.height=h;//底面距離地面高度 entity.polygon.extrudedHeight =h+0.2;//頂面距離地面高度 } }); /*viewer.flyTo(promise[n]);*/ } }; xmlhttp.open("GET","./jsp/get_geojson.jsp?floor_name="+name,true); xmlhttp.send(); }
完整代碼如上所示。
1創建promise數組,長度為geojson數據的個數;
2loadgeojson(name,h,n)函數異步加載geojson文件(服務器后台從數據庫中下載json數據到本地,返回文件地址p),name為geojson數據名稱,h為高度,n為id,設為datasource名稱;
3getjson(name,h,n)函數,name為geojson數據名稱,h為高度,n為datasource名稱(參數與loadgeojson相同),datasource的id從1開始記錄geojson加載順序,判斷名稱是否一致,刪除該資源(無序)。
4代碼實現了在頁面通過button控制geojson的加載和移除,對於已經加載的geojson數據,button.style.backgroundcolor變為紅色(.la2樣式),當移除該數據時,button回到.la樣式。
