文章目录
- 0.引言
- 1.鼠标事件
- 1.1鼠标左键事件
- 1.2鼠标右键事件
- 1.3鼠标移动事件
- 1.4鼠标滚轮事件
- 2.键盘事件
- 3.相机事件
- 4.场景渲染事件
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].