3D瓦片要素样式

创建日期:2025-01-24
更新日期:2025-01-25

示例代码

<template>
  <div class="container" id="cesiumContainer"></div>
</template>
<script setup lang="ts">
import '../utils/NoNeed'
import { onMounted } from 'vue'
import * as Cesium from 'cesium'

window.Cesium = Cesium

let viewer: Cesium.Viewer
let handler: Cesium.ScreenSpaceEventHandler
let osmBuildingsTimeset: Cesium.Cesium3DTileset

onMounted(async () => {
  viewer = new Cesium.Viewer('cesiumContainer', {
    terrain: Cesium.Terrain.fromWorldTerrain()
  })
  handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)

  osmBuildingsTimeset = await Cesium.createOsmBuildingsAsync()
  viewer.scene.primitives.add(osmBuildingsTimeset)

  viewer.scene.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(
      -122.34683683831891,
      47.60533384634795,
      205.5576291312336
    ),
    orientation: {
      heading: Cesium.Math.toRadians(10),
      pitch: Cesium.Math.toRadians(-10)
    }
  })

  osmBuildingsTimeset.style = new Cesium.Cesium3DTileStyle({
    defines: {
      name: "${feature['name']}"
    },
    color: {
      // 根据要素name属性,Market Place North设置成红色,World Trade Center East设置成绿色
      conditions: [
        ['${name} === "Market Place North"', "color('red')"],
        ['${name} === "World Trade Center East"', "color('green')"],
        ['true', "color('white')"]
      ]
    },
    // 只显示要素name属性是Market Place North或World Trade Center East的要素
    show: '${name} === "Market Place North" || ${name} === "World Trade Center East"'
  })

  window.viewer = viewer
})
</script>
<style lang="less" scoped>
.container {
  position: absolute;
  width: 100%;
  height: 100%;
}
</style>