原文链接及内容
Building Explorer面板的下拉框默认选择Overview
选项, 效果如下:
注:由于我们在开发中默认不会使用Cesium封装组件(组件的样式方面基本不符合我们的需求),针对该组件的使用,大家可以自行研究,这里不再赘述。

我们还可以在选择Full Model
选项, 则可以选择建筑物的某一部分(层次), 具体如下所示:

示例代码如下:
注:关于I3S(Index 3D Scene)请参考文章:https://cesium.com/blog/2023/02/06/cesiumjs-adds-support-for-indexed-3d-scene-layers-i3s/ 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
const viewer = new Cesium.Viewer("cesiumContainer", { geocoder: false, sceneModePicker: false, baseLayerPicker: false, navigationHelpButton: false, navigationInstructionsInitiallyVisible: false, animation: false, timeline: false, fullscreenButton: false, selectionIndicator: false, skyBox: false, shouldAnimate: true, terrain: new Cesium.Terrain( Cesium.ArcGISTiledElevationTerrainProvider.fromUrl( "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" ) ), orderIndependentTranslucency: false, }); viewer.cesiumWidget.creditContainer.style.display = "none";
const tours = { "Turanga Library": "https://tiles.arcgis.com/tiles/cFEFS0EWrhfDeVw9/arcgis/rest/services/Turanga_Library/SceneServer", };
try {
const i3sOptions = {
adjustMaterialAlphaMode: true, showFeatures: true, applySymbology: true, calculateNormals: true, };
const i3sProvider = await Cesium.I3SDataProvider.fromUrl( tours["Turanga Library"], i3sOptions );
Cesium.I3SBuildingSceneLayerExplorer("toolbar", i3sProvider);
viewer.scene.primitives.add(i3sProvider);
const center = Cesium.Rectangle.center(i3sProvider.extent); center.height = 300.0; let bslLayer = i3sProvider.data; if (Cesium.defined(bslLayer.layers) && bslLayer.layers.length > 0) { bslLayer = bslLayer.layers[0]; } if ( Cesium.defined(bslLayer.fullExtent) && Cesium.defined(bslLayer.fullExtent.zmax) ) { center.height += bslLayer.fullExtent.zmax; } const destination = Cesium.Ellipsoid.WGS84.cartographicToCartesian(center); viewer.camera.setView({ destination: destination, });
viewer.homeButton.viewModel._command = Cesium.createCommand(function () { viewer.camera.flyTo({ destination: destination, }); }); } catch (error) { console.error(`创建 I3S Data Provider时出错: ${error}`); }
const selected = { feature: undefined, originalColor: new Cesium.Color(), };
const selectedEntity = new Cesium.Entity();
viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) { const selectedFeature = selected.feature;
const pickedFeature = viewer.scene.pick(movement.position); if (selectedFeature === pickedFeature) { return; }
if (Cesium.defined(selected.feature)) { selected.feature.color = selected.originalColor; selected.feature = undefined; }
if ( !Cesium.defined(pickedFeature) || !Cesium.defined(pickedFeature.content) || !Cesium.defined(pickedFeature.content.tile.i3sNode) ) { viewer.selectedEntity = undefined; return; }
selected.feature = pickedFeature; Cesium.Color.clone(pickedFeature.color, selected.originalColor); pickedFeature.color = Cesium.Color.BLUE;
const i3sNode = pickedFeature.content.tile.i3sNode; i3sNode.loadFields().then(function () { let description = "No attributes"; let name;
const fields = i3sNode.getFieldsForFeature(pickedFeature.featureId); if (Object.keys(fields).length > 0) { description = '<table class="cesium-infoBox-defaultTable"><tbody>'; for (const fieldName in fields) { if (i3sNode.fields.hasOwnProperty(fieldName)) { description += `<tr><th>${fieldName}</th><td>`; description += `${fields[fieldName]}</td></tr>`; if (!Cesium.defined(name) && isNameProperty(fieldName)) { name = fields[fieldName]; } } } description += `</tbody></table>`; } if (!Cesium.defined(name)) { name = "unknown"; } selectedEntity.name = name; selectedEntity.description = description; viewer.selectedEntity = selectedEntity; }); }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
function isNameProperty(propertyName) { const name = propertyName.toLowerCase(); if ( name.localeCompare("name") === 0 || name.localeCompare("objname") === 0 || name.localeCompare("category") === 0 ) { return true; } return false; }
|