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)
        }
      }
相关推荐
xiaotao131几秒前
Vite 完全学习指南
前端·vite·前端打包
军军君0114 分钟前
Three.js基础功能学习十五:智能黑板实现实例二
开发语言·前端·javascript·vue.js·3d·threejs·三维
IT枫斗者22 分钟前
构建具有执行功能的 AI Agent:基于工作记忆的任务规划与元认知监控架构
android·前端·vue.js·spring boot·后端·架构
hotlinhao23 分钟前
Nginx rewrite last 与 redirect 的区别——Vue history 模式短链接踩坑记录
前端·vue.js·nginx
ZC跨境爬虫25 分钟前
海南大学交友平台开发实战day7(实现核心匹配算法+解决JSON请求报错问题)
前端·python·算法·html·json
下北沢美食家29 分钟前
CSS面试题2
前端·css
weixin_4617694035 分钟前
npm create vue@latest 错误
前端·vue.js·npm
WindrunnerMax36 分钟前
从零实现富文本编辑器#13-React非编辑节点的内容渲染
前端·架构·github
四千岁37 分钟前
Ollama+OpenWebUI 最佳组合:本地大模型可视化交互方案
前端·javascript·后端
写不来代码的草莓熊39 分钟前
el-date-picker ,自定义输入数字自动转换显示yyyy-mm-dd HH:mm:ss格式
前端·javascript·vue.js