前端开发中如何实现WebGIS数据可视化(四)——鼠标事件

前言

在之前的历史文章中介绍了 leaflet、mapbox、cesium 三种框架下的一些基本操作(点、线、面绘制),除简单的绘制之外,日常基本开发中可能还会用到地图的事件系统(如地图点击),这篇文章先通过点位拾取的功能简单了解下三种框架下不同的事件处理。

通过这篇文章,能够有这些收获:

  • 在 leaflet、cesium、mapBox 中如何进行鼠标事件

文章中相关代码均已提交到 github,欢迎 star。

代码地址

预览地址

leaflet

leaflet 框架下对鼠标的操作较为简单,直接对 map 实例进行 addEventListener 事件即可,常用的鼠标事件如下:

type eventType =
    'click'       |
    'dblclick'    |
    'mousedown'   |
    'mouseup'     |
    'mouseover'   |
    'mouseout'    |
    'mousemove'   |
    'contextmenu' |
    'preclick';

简单实现

const addListerEventLeaflet = () => {
      window.leafletMap.on('click', leafletHandler)
}
const removeListerEventLeaflet = () => {
      window.leafletMap.off('click', leafletHandler)


const leafletHandler = (e: LeafletMouseEvent) => {
    // TODO 通过 e 参数可以进行一些操作,诸如打点等, 通过 e.latlng.lat, e.latlng.lng 可拿到点位的经纬度
    // code......
   
}}

cesium

cesium 中对鼠标事件处理稍微复杂些,需要先实例化 ScreenSpaceEventHandler,然后通过 setInputAction 处理相关的逻辑。

简单实现

let handlerCesium = null;
// 监听 cesium 鼠标事件
const addListerEventCesium = () => {
    handlerCesium = new ScreenSpaceEventHandler(window.cesiumMapMap.scene.canvas);
    handlerCesium.setInputAction((click: any) =>  {
        console.log(click);
        cesiumHandler(click)
    }, ScreenSpaceEventType.LEFT_CLICK);
}
const cesiumHandler = (click: any) => {
    // 将鼠标点击的点转换为经纬度
    const pick: {longitude: number; latitude: number; altitude: number } = window.cesiumMapService.getCoordinate(click)
    // TODO 通过拿到的经纬度可以进行其他的业务逻辑
}
const removeListerEventCesium = () => {
    handlerCesium.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
}

其中 window.cesiumMapService.getCoordinate 方法的具体 实现逻辑

mapbox

mapbox 下对鼠标事件的处理同 leaflet 类似,通过对地图实例进行事件监听即可。

简单实现

let handlerCesium = null;
const addListerEventMapbox = () => {
    window.mapboxMap.on('click', mapBoxHandler)
}
const mapBoxHandler = (e: any) => {
    // TODO 通过 e 参数可以进行一些操作,诸如打点等, 通过 e.lngLat.lat, e.latlng.lng 可拿到点位的经纬度
    const latitude = parseFloat(e.lngLat.lat);
    const longitude = parseFloat(e.lngLat.lng);
    
    // TODO .......code
}
/**
 * mapbox 事件监听
 */
const removeListerEventMapbox = () => {
    window.mapboxMap.off('click', mapBoxHandler)
}

最后

这篇文章只是对 leaflet、mapbox、cesium 中鼠标事件的简单入门,日常开发中常见的诸如 空间测量、坐标系转换等功能后续的文章中再更新。

历史文章

  1. 前端开发中如何实现WebGIS数据可视化(一)——地图创建、点位绘制
  2. 前端开发中如何实现WebGIS数据可视化(二)——线、面绘制

后续规划总结

  1. 空间测量
  2. 三种框架结合 echarts 做数据可视化
  3. cesium、mapbox 各种模型加载、交互
  4. 高阶数据可视化,诸如迁徙图、洋流、风场、各种数据模型分析等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Cesium 加载 20W 个面数据,可以使用 3D Tiles 技术。3D Tiles 是一种用于加载和渲染大型 3D 模型的技术,可以有效地管理内存,并可以根据视图进行优化渲染。 要使用 3D Tiles,首先需要将数据转换为 3D Tiles 格式。可以使用工具如 Cesium Ion 或 FME 将数据转换为 3D Tiles 格式。 然后,可以使用 Cesium 的 3D Tiles 加载器加载 3D Tiles 数据,方法如下: ```javascript var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url : 'path/to/tileset.json' })); ``` 还可以通过设置相关参数来控制 3D Tiles 的渲染行为,如瓦片级别细节、瓦片可见性等。具体可以参考 Cesium 的官方文档:https://cesium.com/docs/cesiumjs-ref-doc/Cesium3DTileset.html 。 此外,还可以考虑使用其他优化技术,如瓦片压缩、瓦片缓存等,来帮助加载和渲染大型 3D 模型。 ### 回答2: Cesium是一个用于构建地球、地图或3D场景的WebGIS开源框架。在加载20W个面数据时,可以通过以下几点来优化性能和提高加载速度: 1. 数据分块加载:将20W个面数据分成多块进行加载,可以将地球或场景划分为较小的区域,只加载可视区域以及周边的数据。这样可以减少一次性加载的数据量,提高加载速度。 2. 数据压缩:对数据进行压缩,可以使用一些压缩算法如Gzip或Deflate,减小数据的体积,提高数据传输的效率。 3. 网络优化:优化网络传输,使用合适的网络协议如HTTP/2进行数据传输,减少网络请求的次数,提高数据的加载速度。 4. 简化和优化数据:对数据进行简化和优化,去除冗余信息和不必要的细节。可以使用一些数据压缩工具或库来处理数据,减小数据的大小,提高加载速度。 5. 空间索引:对数据进行空间索引,以便快速检索和查询。常用的空间索引算法有Quadtree、Octree等,可以根据需要选择合适的索引算法进行数据的空间索引。 6. 数据缓存:将已加载的数据进行缓存,可以在后续的加载直接使用缓存的数据,减少数据的加载时间。 7. GPU加速:利用显卡的GPU进行渲染加速,可以使用一些基于WebGL的图形库如Three.js等来进行渲染和显示。 综上所述,通过数据分块加载、数据压缩、网络优化、简化和优化数据、空间索引、数据缓存以及GPU加速等手段,可以实现较好的性能和加载速度,使得Cesium可以加载和显示20W个面数据。但需要注意,加载大量数据可能会对性能和用户体验产生一定的影响,需根据具体应用场景和硬件环境来进行合理的优化和配置。 ### 回答3: 前端Cesium是一款基于WebGL的开源地理可视化引擎,用于创建高性能的三维地球、地图和GIS应用程序。要加载20W个面数据,可以考虑以下几种方法: 1. 数据分块加载:将大量数据分成小块,根据视图范围动态加载和卸载,以保持实时渲染性能。可以通过判断当前视图是否覆盖某个区域,然后进行异步加载和渲染。 2. 空间索引:使用空间索引数据结构(例如叉树或kd-tree)对数据进行组织和存储,以加速空间查询。这样可以减少需要渲染的面数量,提高性能。 3. LOD(层次细节):根据距离和缩放级别的不同,为不同的面数据定义不同的细节级别。只加载和显示当前视图所需的最合适的细节级别,降低数据量。 4. 数据压缩:对面数据进行压缩,减小数据的大小,降低网络传输时间。Cesium支持多种数据格式的压缩,如3D Tiles、Gzipped JSON等。 5. 懒加载:只有在用户需要查看或与之交互时才加载和显示面数据,可以通过设置阈值来判断何时加载数据。这样可以避免一次性加载大量数据对性能造成的影响。 6. GPU加速:利用WebGL和图形处理单元(GPU)的计算能力进行高效渲染。Cesium本身已经使用了GPU加速,可以充分利用硬件性能。 以上是几种常见的方法,可以根据具体的需求选择合适的方式来实现加载20W个面数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值