Cesium 点击模型获取模型属性并高亮模型

新版的的cesium .getPropertyNames 已被弃用,应使用 .getPropertyIds

获取指定属性 pickedObject.getProperty('id') 获取对象的id属性值,

Cesium3DTileFeatureCesium3DTilePointFeatureModelFeature 都有命名的元数据方法。这些在CesiumJS 1.95中已弃用,取而代之的是方法,以便与其他类保持更好的一致性
该PR为 Cesium3DTileFeatureCesium3DTilePointFeatureModelFeature 等类添加了方法,以更好地与其他类保持一致。.getPropertyIds 3DTiles_metadata


let clickHandler: Cesium.ScreenSpaceEventHandler | null = null // 点击事件处理器


/**
 * 添加点击事件
 */
function addClickEvent() {
  // 记录上一次选中的对象和颜色,用于清除高亮
  let lastPickedObject: Cesium.Cesium3DTileFeature | null = null
  let lastColor: Cesium.Color | null = null

  /**
   * 点击事件处理函数
   * @param click 点击事件对象,包含点击位置信息
   */
  const onMouseClick = (click: Cesium.ScreenSpaceEventHandler.PositionedEvent) => {
    const pickedObject = viewer.scene.pick(click.position) // 拾取场景中的对象

    // 如果之前有高亮的对象,且不是当前点击的对象(或者点击了空白处),则恢复颜色
    if (Cesium.defined(lastPickedObject) && lastPickedObject !== pickedObject) {
      // 恢复之前高亮的对象颜色
      if (lastColor) {
        lastPickedObject.color = lastColor
      }
      lastPickedObject = null // 清除记录的高亮对象
      lastColor = null // 清除记录的高亮颜色
    }

    // 如果点击的是 3D 模型对象(如建筑)
    if (Cesium.defined(pickedObject)) {
      // 如果点击的是同一个对象,直接返回
      if (pickedObject === lastPickedObject) return

      console.log('拾取到的对象:', pickedObject) // 打印拾取到的对象
      console.log('属性ID列表:', pickedObject.getPropertyIds())

      // 遍历并打印所有属性ID和对应值
      for (const id of pickedObject.getPropertyIds()) {
        console.log(id, pickedObject.getProperty(id))
      }

      // 保存当前对象和原始颜色
      lastPickedObject = pickedObject
      // 克隆颜色对象,防止引用被修改
      lastColor = pickedObject.color.clone()

      // 改变颜色为红色
      pickedObject.color = Cesium.Color.fromCssColorString('red').withAlpha(0.5)
      console.log('pickedObject.color', pickedObject.color)
    }
  }

  // 鼠标单击左键事件
  if (clickHandler) {
    clickHandler.destroy()
    clickHandler = null
  }

  // //鼠标单击左键事件
  // viewer.screenSpaceEventHandler.setInputAction(
  //   onMouseClick,
  //   Cesium.ScreenSpaceEventType.LEFT_CLICK,
  // )
  clickHandler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)
  clickHandler.setInputAction(onMouseClick, Cesium.ScreenSpaceEventType.LEFT_CLICK)
}

官方示例

// On mouse over, display all the properties for a feature in the console log.
handler.setInputAction(function(movement) {
    const feature = scene.pick(movement.endPosition);
    if (feature instanceof Cesium.Cesium3DTileFeature) {
        const propertyIds = feature.getPropertyIds();
        const length = propertyIds.length;
        for (let i = 0; i < length; ++i) {
            const propertyId = propertyIds[i];
            console.log(`{propertyId}: ${feature.getProperty(propertyId)}`);
        }
    }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

四下皆无人