Cesium 处理屏幕空间事件(鼠标点击、移动、滚轮)的示例

  • 鼠标点击事件通过LEFT_CLICK类型监听,使用drillPick方法获取点击的对象并打印其名称。
  • 鼠标移动事件通过MOUSE_MOVE类型监听,使用pickEllipsoid方法获取鼠标位置对应的经纬度并打印。
  • 鼠标滚轮事件通过WHEEL类型监听,通过调整相机的高度来实现缩放效果。
javascript 复制代码
const viewerDivRef = ref<HTMLDivElement>()
// 初始化Cesium Viewer
      viewer = new Cesium.Viewer(cesiumContainer.value, {
      timeline: true,
      animation: true,
      shouldAnimate: true,
      homeButton: false, // 是否显示Home按钮
      fullscreenButton: false, // 是否显示全屏按钮
      baseLayerPicker: true, // 是否显示图层选择控件
      geocoder: false, // 是否显示地名查找控件
      sceneModePicker: false, // 是否显示投影方式控件
      navigationHelpButton: false, // 是否显示帮助信息控件
      infoBox: false, // 是否显示点击要素之后显示的信息
      requestRenderMode: true, // 启用请求渲染模式
      scene3DOnly: false, // 每个几何实例将只能以3D渲染以节省GPU内存
      sceneMode: 3, // 初始场景模式 1 2D模式 2 2D循环模式 3 3D模式  Cesium.SceneMode
      });
 // 鼠标点击事件
      viewer.screenSpaceEventHandler.setInputAction((movement) => {
        const pickedObjects = viewer.scene.drillPick(movement.position);
        if (pickedObjects.length > 0) {
          const pickedObject = pickedObjects[0];
          console.log('点击了:', pickedObject.name);
        }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

      // 鼠标移动事件
      viewer.screenSpaceEventHandler.setInputAction((movement) => {
        const cartesian = viewer.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
        if (cartesian) {
          const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
          const longitude = Cesium.Math.toDegrees(cartographic.longitude);
          const latitude = Cesium.Math.toDegrees(cartographic.latitude);
          console.log('鼠标移动到经纬度:', longitude, latitude);
        }
      }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

      // 鼠标滚轮事件
      viewer.screenSpaceEventHandler.setInputAction((wheel) => {
        const camera = viewer.camera;
        const distance = camera.positionCartographic.height;
        const newDistance = distance * (1 - wheel.delta * 0.1);
        camera.setView({
          destination: Cesium.Cartesian3.fromRadians(camera.positionCartographic.longitude, camera.positionCartographic.latitude, newDistance)
        });
      }, Cesium.ScreenSpaceEventType.WHEEL);

// 强制刷新场景
        try {
          if (viewer && viewer.scene) {
            viewer.scene.requestRender()
            setTimeout(() => {
              if (viewer && viewer.scene) {
                viewer.scene.requestRender()
              }
            }, 0)
          }
        } catch (e) {
          console.warn('刷新场景时出错:', e)
        }
      }
相关推荐
带娃的IT创业者8 分钟前
PostHog 的 TypeScript 原生移植:一场开源产品工程化的自我革命
javascript·typescript·开源·开源软件·posthog·技术重构
人间凡尔赛15 分钟前
React Compiler 正式落地一年:告别手动 useMemo/useCallback 的全栈实践
前端·性能优化·react
LaughingZhu27 分钟前
Product Hunt 每日热榜 | 2026-08-02
前端·神经网络·react.js·搜索引擎·前端框架
90后的晨仔10 小时前
从 H5 到 uni-app:一篇写给前端小白的"翻译指南"
前端·vue.js·前端框架
陈随易11 小时前
moon,apt和yum之外linux系统命令安装新选择
前端·后端·程序员
IT小盘11 小时前
13-企业Prompt模板-角色任务约束与输出格式
java·前端·prompt
徐小夕12 小时前
开源!我用SQLite + DuckDB打造了一款可视化AI问数平台
前端·算法·github
leslie11812 小时前
babel笔记
前端
用户0595401744613 小时前
Redis 记忆存储踩坑实录:一个并发写入 Bug 让我排查了 4 小时
前端·css
小徐_233313 小时前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·微信小程序·uni-app