Cesium事件处理

本文详细介绍了Cesium库在WebGIS应用中的鼠标左键、右键、移动、滚轮事件,键盘事件(如Shift+鼠标、Ctrl+鼠标、Alt+鼠标),以及相机事件和场景渲染事件的使用方法,包括如何实例化和配置事件处理器,提供示例代码供读者理解和实践。
摘要由CSDN通过智能技术生成

0.引言

无论是二维GIS应用系统还是三维GIS应用系统,都离不开各种事件的应用,特别是鼠标左键单击事件、鼠标左键双击事件等。根据事件的类型、用途,Cesium将事件大致分成了三大类,即屏幕空间事件处理程序(Screen Space Event Handler)、屏幕空间相机控制器(Screen Space Camera Controller)和场景渲染事件。

1.鼠标事件

1.1鼠标左键事件

Cesium的鼠标左键事件包括鼠标左键按下、弹起、单击及双击事件。我们可以在这些事件中添加自定义函数,以便用户在输入时执行某些操作。在使用鼠标左键事件前,我们需要先通过ScreenSpaceEventHandler类进行实例化,然后注册或删除相应的事件。
(1)关键代码
  在这里插入图片描述

3_1.1_鼠标左键事件.html
<!DOCTYPE html>
<html lang="en">  
  
<head>  
    <meta charset="UTF-8">  
    <meta http-equiv="X-UA-Compatible" content="IE=edge">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>鼠标事件_左键事件</title>  
    <script src="./Build/Cesium/Cesium.js"></script>  
    <link rel="stylesheet" href="./Build/Cesium/Widgets/widgets.css">  
    <style>  
        html,  
        body,  
        #cesiumContainer {  
            width: 100%;  
            height: 100%;  
            margin: 0;  
            padding: 0;  
            overflow: hidden;  
        }  
    </style>  
</head>  
  
<body>  
    <div id="cesiumContainer">  
    </div>  
  
    <script>  
        Cesium.Ion.defaultAccessToken = '你的token';  
        var viewer = new Cesium.Viewer("cesiumContainer", {  
            geocoder: true,  //是否显示地名查找工具  
            homeButton: true,    //是否显示首页位置工具  
            sceneModePicker: true,   //是否显示视角模式切换工具  
            baseLayerPicker: true,   //是否显示默认图层选择工具  
            navigationHelpButton: true,  //是否显示导航帮助工具  
            animation: true, //是否显示动画工具  
            timeline: true,  //是否显示时间轴工具  
            fullscreenButton: true,  //是否显示全屏按钮工具  
        });  
  
        var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  
        handler.setInputAction(function (event) {  
            console.log('左键按下:', event.position);//左键按下时响应  
        }, Cesium.ScreenSpaceEventType.LEFT_DOWN);  
        handler.setInputAction(function (event) {  
            console.log('左键弹起:', event.position);//左键弹起时响应  
        }, Cesium.ScreenSpaceEventType.LEFT_UP);  
        handler.setInputAction(function (event) {  
            console.log('左键点击:', event.position);//左键按下和弹起记作一次点击,点击后响应  
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);  
        handler.setInputAction(function (event) {  
            console.log('左键双击:', event.position);//左键双击后响应  
        }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);  
        // 移除屏幕空间事件  
        //handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);  
    </script>  
</body>  
  
</html>

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,在地球体上任意位置左键双击,双击结果如下图右侧控制台响应消息。
  在这里插入图片描述

1.2鼠标右键事件

Cesium的鼠标右键事件包括鼠标右键按下、弹起及单击事件。我们可以在这些事件中添加自定义函数,以便用户在输入时执行某些操作。在使用鼠标右键事件前,我们需要先通过ScreenSpaceEventHandler类进行实例化,然后注册或删除相应的事件。
(1)关键代码
  在这里插入图片描述

3_1.2_鼠标右键事件.html
Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    geocoder: true,  //是否显示地名查找工具  
    homeButton: true,    //是否显示首页位置工具  
    sceneModePicker: true,   //是否显示视角模式切换工具  
    baseLayerPicker: true,   //是否显示默认图层选择工具  
    navigationHelpButton: true,  //是否显示导航帮助工具  
    animation: true, //是否显示动画工具  
    timeline: true,  //是否显示时间轴工具  
    fullscreenButton: true,  //是否显示全屏按钮工具  
});  
  
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  
handler.setInputAction(function (event) {  
    console.log('右键按下:', event.position);//右键按下时响应  
}, Cesium.ScreenSpaceEventType.RIGHT_DOWN);  
handler.setInputAction(function (event) {  
    console.log('右键弹起:', event.position);//右键弹起时响应  
}, Cesium.ScreenSpaceEventType.RIGHT_UP);  
handler.setInputAction(function (event) {  
    console.log('右键点击:', event.position);//右键按下和弹起记作一次点击,点击后响应  
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);  
// 移除屏幕空间事件  
//handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT);

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,在地球体上任意位置右击,右键单击结果如下图右侧控制台响应消息。
  在这里插入图片描述

1.3鼠标移动事件

首先实例化一个ScreenSpaceEventHandler对象,然后注册鼠标移动事件MOUSE_MOVE,并通过setInputAction设置要在鼠标移动事件上执行的功能。例如,在鼠标移动事件上打印“鼠标正在移动”这句话,则只要鼠标移动,控制台就会不断打印这句话。
(1)关键代码
  在这里插入图片描述

Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    animation: false, //是否显示动画工具  
    timeline: false,  //是否显示时间轴工具  
    fullscreenButton: false,  //是否显示全屏按钮工具  
});  
  
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  
handler.setInputAction(function (event) {  
    console.log('鼠标正在移动');  
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);  
// 移除屏幕空间事件  
//handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT);

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,在地球体上移动鼠标,移动结果如下图右侧控制台响应消息。
  在这里插入图片描述

1.4鼠标滚轮事件

Cesium的鼠标滚轮事件包括鼠标滚轮按下、弹起、单击及滚动事件。我们可以在这些事件中添加自定义函数,以便用户在输入时执行某些操作。在使用鼠标滚轮事件前,我们需要先通过ScreenSpaceEventHandler类进行实例化,然后注册或删除相应的事件。
(1)关键代码
  在这里插入图片描述

Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    geocoder: true,  //是否显示地名查找工具  
    homeButton: true,    //是否显示首页位置工具  
    sceneModePicker: true,   //是否显示视角模式切换工具  
    baseLayerPicker: true,   //是否显示默认图层选择工具  
    navigationHelpButton: true,  //是否显示导航帮助工具  
    animation: true, //是否显示动画工具  
    timeline: true,  //是否显示时间轴工具  
    fullscreenButton: true,  //是否显示全屏按钮工具  
});  
  
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  
handler.setInputAction(function (event) {  
    console.log('中键按下:', event.position);  
}, Cesium.ScreenSpaceEventType.MIDDLE_DOWN);  
handler.setInputAction(function (event) {  
    console.log('中键弹起:', event.position);  
}, Cesium.ScreenSpaceEventType.MIDDLE_UP);  
handler.setInputAction(function (event) {  
    console.log('中键点击:', event.position);  
}, Cesium.ScreenSpaceEventType.MIDDLE_CLICK);  
handler.setInputAction(function (event) {  
    console.log('鼠标滚轮正在滚动', event.position);  
}, Cesium.ScreenSpaceEventType.WHEEL);  
// 移除屏幕空间事件  
//handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT);

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,在地球体上任意位置单击一次滚轮并滚动滚轮,结果如下图右侧控制台响应消息。
  在这里插入图片描述

2.键盘事件

键盘事件也属于屏幕空间事件处理程序中的一种,但是它们不能单独使用,而是需要配合鼠标事件一起使用,如鼠标左键+Shift键、鼠标右键+Alt键等。
在Cesium中,键盘事件主要包括Shift键被按住、Ctrl键被按住及Alt键被按住3种类型。
(1)关键代码
  在这里插入图片描述

Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    animation: false, //是否显示动画工具  
    timeline: false,  //是否显示时间轴工具  
    fullscreenButton: false,  //是否显示全屏按钮工具  
});  
  
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  
handler.setInputAction(function (event) {  
    console.log('SHIFT+鼠标左键点击:', event.position);  
}, Cesium.ScreenSpaceEventType.LEFT_CLICK,Cesium.KeyboardEventModifier.SHIFT);  
handler.setInputAction(function (event) {  
    console.log('CTRL+鼠标左键点击:', event.position);  
}, Cesium.ScreenSpaceEventType.LEFT_CLICK,Cesium.KeyboardEventModifier.CTRL);  
handler.setInputAction(function (event) {  
    console.log('ALT+鼠标左键点击:', event.position);  
}, Cesium.ScreenSpaceEventType.LEFT_CLICK,Cesium.KeyboardEventModifier.ALT);  
// 移除屏幕空间事件  
//handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT);

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,在地球体上分别按SHIFT+左击、CTRL+左击和ALT+左击,结果如下图右侧控制台响应消息。
  在这里插入图片描述

3.相机事件

根据画布上的鼠标移动或键盘输入修改摄像机的位置和方向,可被理解为我们常说的相机事件,它是与屏幕空间相机控制器相关的事件处理程序。
相机事件与之前所说的鼠标事件、键盘事件不同,它不需要先实例化,而是在Viewer类的实例化过程中就将实例化结果赋给了viewer.scene.screenSpaceCameraController,所以,我们直接操作viewer.scene.screenSpaceCameraController即可。
(1)关键代码
  在这里插入图片描述

3_3_相机事件.html
Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    geocoder: true,  //是否显示地名查找工具  
    homeButton: true,    //是否显示首页位置工具  
    sceneModePicker: true,   //是否显示视角模式切换工具  
    baseLayerPicker: true,   //是否显示默认图层选择工具  
    navigationHelpButton: true,  //是否显示导航帮助工具  
    animation: true, //是否显示动画工具  
    timeline: true,  //是否显示时间轴工具  
    fullscreenButton: true,  //是否显示全屏按钮工具  
});  
  
//修改鼠标右键为相机旋转  
viewer.scene.screenSpaceCameraController.tiltEventTypes = [  
    Cesium.CameraEventType.RIGHT_DRAG,//添加右键  
];  
//修改鼠标中键为相机缩放  
viewer.scene.screenSpaceCameraController.zoomEventTypes = [  
    Cesium.CameraEventType.MIDDLE_DRAG,//添加中键  
    Cesium.CameraEventType.WHEEL,//可添加其他事件,如滚轮等  
];

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,在地球上测试鼠标右键和鼠标中键操作相机情况。
  在这里插入图片描述

4.场景渲染事件

场景渲染事件是Cesium中十分重要的事件,特别是当我们需要实时监听场景渲染时,这几个事件是必不可少的。例如,我们要实时监听标签位置或者实时动态更新实体坐标时,就需要在场景渲染事件中进行回调。
Cesium的场景渲染事件主要包括4种,preUpdate、postUpdate、preRender、postRender。
(1)关键代码
  在这里插入图片描述

Cesium.Ion.defaultAccessToken = '你的token';
var viewer = new Cesium.Viewer("cesiumContainer", {  
    geocoder: true,  //是否显示地名查找工具  
    homeButton: true,    //是否显示首页位置工具  
    sceneModePicker: true,   //是否显示视角模式切换工具  
    baseLayerPicker: true,   //是否显示默认图层选择工具  
    navigationHelpButton: true,  //是否显示导航帮助工具  
    animation: true, //是否显示动画工具  
    timeline: true,  //是否显示时间轴工具  
    fullscreenButton: true,  //是否显示全屏按钮工具  
});  
  
// 需要回调的函数   
function callbackFunc(event) {  
    console.log("注册更新之前执行了回调函数");  
}  
// 注册更新之前执行回调函数  
viewer.scene.preUpdate.addEventListener(callbackFunc);  
// 需要回调的函数   
function callbackFun(event) {  
    console.log("注册更新之后执行了回调函数");  
}  
// 注册更新之后执行回调函数  
viewer.scene.postUpdate.addEventListener(callbackFun);  
// 需要回调的函数   
function callbackFun(event) {  
    console.log("注册渲染之前执行了回调函数");  
}  
// 注册渲染之前执行回调函数  
viewer.scene.preRender.addEventListener(callbackFun);  
// 需要回调的函数   
function callbackFun(event) {  
    console.log("注册渲染之后执行了回调函数");  
}  
// 注册渲染之后执行回调函数  
viewer.scene.postRender.addEventListener(callbackFun);  
// 注销之前所注册的回调函数  
//viewer.scene.preUpdate.removeEventListener (callbackFunc);

其他代码参见1.1

(2)加载效果
运行代码后出现网页地球,按F12,调出控制台,下图右侧控制台刷新场景渲染事件。
  在这里插入图片描述

[1] 郭明强. 《WebGIS之Cesium三维软件开发》; 2023-04-01 [accessed 2024-01-26].
[2] GISer小辉. Cesium 事件详解(鼠标事件、相机事件、键盘事件、场景触发事件); 2023-01-01 [accessed 2024-01-26].
[3] Codifier. Cesium 更改默认的鼠标操作; 2019-10-09 [accessed 2024-01-26].
[4] 锦岁. cesium教程(二):Viewer、Scene、影像、地形、坐标、相机、追踪、交互; 2022-01-27 [accessed 2024-01-26].

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值