news 2026/8/14 14:10:01

cesium 实战系列之鼠标拾取、点击、双击、悬浮、信息查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cesium 实战系列之鼠标拾取、点击、双击、悬浮、信息查询

初始化cesium鼠标事件handler

大家是否还记得我之前在初始化cesium地图的时候,里面有一行代码

handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

这行代码就是初始化cesium地图鼠标事件的,可能都不记得了,那简单的回顾一下。

function cesiumMapInit() { //初始化cesium三维地球 Cesium.Ion.defaultAccessToken ="xxxxxxxxxxxx"; viewer = new Cesium.Viewer("cesiumContainer", {地图初始化参数}); //初始化handler handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); }

简单运用鼠标事件

在地图图斑点击、地块信息查询、图标点击、地图绘制等等都需要用到鼠标事件,那在初始化之后,如何运用呢?

注册鼠标左键

handler.setInputAction((movement) => {}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

注册鼠标右键

handler.setInputAction((movement) => {}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

注册左键双击

handler.setInputAction((movement) => {}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

注册鼠标移动事件

handler.setInputAction((movement) => {}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

以上是较为常用的几个鼠标事件,除此之外还有

事件说明
LEFT_CLICK左键单击
LEFT_DOUBLE_CLICK左键双击
LEFT_DOWN左键按下
LEFT_UP左键抬起
RIGHT_CLICK右键单击
RIGHT_DOWN右键按下
RIGHT_UP右键抬起
MIDDLE_CLICK中键单击
MOUSE_MOVE鼠标移动
WHEEL鼠标滚轮

具体实例

以鼠标左键为例,比如要查看鼠标位置的经纬度,那么就可以这样写

handler.setInputAction((movement) => { //注册左键点击事件 //获取点击坐标 let cartesian = viewer.scene.camera.pickEllipsoid( movement.position, viewer.scene.globe.ellipsoid ); if (cartesian) { let cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian); //将弧度转为度的十进制度表示 let lng = Cesium.Math.toDegrees(cartographic.longitude); let lat = Cesium.Math.toDegrees(cartographic.latitude); console.log(lng, lat); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

这样就可以通过鼠标左键点击地图的某个位置来获取此位置的经纬度信息。

比如地图上加载了一些模型,要通过鼠标点击获取模型信息,就可以这样写

handler.setInputAction((movement) => { //注册左键点击事件 //获取点击模型 let pick = viewer.scene.pick(movement.position); if (Cesium.defined(pick) && pick.id) { let c = new Cesium.Cartesian2( movement.position.x, movement.position.y ); this.name = pick.id.name; } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

比如想要获取图层上某一点的信息,那么就需要借助wms图层的请求方法,可以这样写

handler.setInputAction((movement) => { //注册左键点击事件 let cartesian = viewer.scene.camera.pickEllipsoid( movement.position, viewer.scene.globe.ellipsoid ); if (cartesian) { let cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic( cartesian ); //将弧度转为度的十进制度表示 let lng = Cesium.Math.toDegrees(cartographic.longitude); let lat = Cesium.Math.toDegrees(cartographic.latitude); let bbox = getBBox(lng, lat); let layerName = "你的图层名称"; // 模拟Geoserver的点击事件 this.api.getMapInfo( { query_layers: layerName, layers: layerName, bbox: bbox, }).then(res => { if (res.features) { // 获取最后一条数据 let data = res.features[0].properties; } else { } }); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

其中的getBBox、getMapInfo 的相关写法其实之前的文章中已经给出过,这里再attach一份

function getMapInfo(params) { params.service = "WMS"; params.version = "1.1.1"; params.request = "GetFeatureInfo"; params.transparent = true; params.exceptions = "application/vnd.ogc.se_inimage"; params.info_format = "application/json"; params.feature_count = 50; params.x = 50; params.y = 50; params.srs = "EPSG:4326"; params.width = 101; params.height = 101; params.format = "image/png"; return get("/geoserver/wms", params); } function getBBox(lng, lat) { var lng1 = lng - 0.000332; var lng2 = lng + 0.000332; var lat1 = lat - 0.000332; var lat2 = lat + 0.000332; var bbox = lng1.toFixed(6) + "," + lat1.toFixed(6) + "," + lng2.toFixed(6) + "," + lat2.toFixed(6); return bbox; }

鼠标事件销毁

在页面结束的时候进行组件销毁,防止内存泄漏

handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); // 全部清空 handler.destroy();
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 14:06:49

Java 21 + Spring Boot 3.x vs Spring Boot 2.x:忆笙智云的技术选型思路

文章目录一、背景二、版本对比总览三、Java 21带来的实际收益3.1 Virtual Threads(虚拟线程)3.2 Record类3.3 Pattern Matching(模式匹配)3.4 Switch表达式四、Spring Boot 3.x vs 2.x4.1 Jakarta EE迁移4.2 Observability&#x…

作者头像 李华
网站建设 2026/8/14 14:02:40

【深入浅出:Linux 应用层访问 I2C 设备的全景指南与选型指南】

深入浅出:Linux 应用层访问 I2C 设备的全景指南与选型指南 文章目录深入浅出:Linux 应用层访问 I2C 设备的全景指南与选型指南一、 核心认知:设备号 vs 内核通信机制二、 方案详解:用户态访问 I2C 的 5 种路径1. 标准内核驱动子系…

作者头像 李华