当前位置: 首页 > article >正文

iClient3D for Cesium在Vue中快速实现场景卷帘

作者:gaogy

1、背景

iClient3D for Cesium是由SuperMap提供的一个前端3D地图客户端,提供了丰富的功能与接口,使得开发者能够在Web应用中快速集成并展现3D地理信息。而在Vue框架中集成iClient3D,不仅可以利用Vue的响应式特性提高开发效率,还可以通过简洁的代码实现丰富的交互效果。通过结合Vue的组件化思维和iClient3D的强大功能,开发者可以快速实现复杂的3D场景效果。

在动态效果丰富的地图场景中,场景卷帘是一个常用的功能,通常用于展示不同位置例如地上地下的数据。SuperMap iClient3D for Cesium官网已有场景卷帘示例(示例地址:http://support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/editor.html#rollerShutter),但是其代码较多,且使用较老的Vue代码书写方式,故本文将详细介绍在Vue setup语法糖下如何使用iClient3D for Cesium封装的Hook快速实现一个场景卷帘效果,帮助开发者通过简单的步骤,在项目中实现场景卷帘功能。

2、卷帘效果

iClient3D for Cesium实现场景卷帘

3、Vue Hook 实现场景卷帘

具体封装iClient3D for Cesium的 hook 如下:

import { ref, onMounted, onBeforeUnmount } from 'vue'

export default function useCustomRollerShutter(s3mLayers, rollDOMID) {
  let rollDOM = null
  const _rollerShutterConfig = ref({ startX: 0.33, startY: 0.33, endX: 0.66, endY: 0.66, index: 0.66 })
  const _scratchSwipeRegion = new Cesium.BoundingRectangle()
  const updateSwipeRegion = () => {
    Cesium.BoundingRectangle.unpack([_rollerShutterConfig.value.startX, 0, 1, 1], 0, _scratchSwipeRegion)
  }
  const mouseMoveHandler = (e) => {
    e.preventDefault()
    rollDOM.style.left = `${e.clientX}px`
    _rollerShutterConfig.value.startX = e.clientX / document.body.clientWidth
    updateSwipeRegion()
    for (const layer of s3mLayers) layer.swipeRegion = _scratchSwipeRegion
  }
  const onMouseDown = () => {
    _rollerShutterConfig.value.index = 1
    document.addEventListener('mousemove', mouseMoveHandler)
  }
  const onMouseUp = () => document.removeEventListener('mousemove', mouseMoveHandler)
  const startRollerShutter = () => {
    rollDOM.style.display = 'block'
    updateSwipeRegion()
    for (const layer of s3mLayers) {
      layer.swipeEnabled = true
      layer.swipeRegion = _scratchSwipeRegion
    }
  }
  const closeRollerShutter = () => {
    rollDOM.style.display = 'none'
    for (const layer of s3mLayers) layer.swipeEnabled = false
  }
  onMounted(() => {
    rollDOM = document.getElementById(rollDOMID)
    rollDOM.addEventListener('mousedown', onMouseDown)
    document.addEventListener('mouseup', onMouseUp)
  })
  onBeforeUnmount(() => {
    rollDOM.removeEventListener('mousedown', onMouseDown)
    document.removeEventListener('mouseup', onMouseUp)
    document.removeEventListener('mousemove', mouseMoveHandler)
  })
  return { startRollerShutter, closeRollerShutter }
}

其中,s3mLayers 是需要参加卷帘的S3MTilesLayer数组,rollDOMID 是卷帘的 DOM 元素 id;hook 返回的是两个函数,其中 startRollerShutter 是开启卷帘的方法,而 closeRollerShutter 是关闭卷帘的方法。

4、Vue 页面使用 Hook

<script setup>
import useCustomRollerShutter from '@/hooks/useCustomRollerShutter'

const viewerContainer = document.getElementById('app')
window.viewer = new Cesium.Viewer(viewerContainer, { infoBox: false })
window.viewer.scene.open('http://www.supermapol.com/realspace/services/3D-CBD/rest/realspace')

const layers = window.viewer.scene.layers.layerQueue
const { startRollerShutter, closeRollerShutter } = useCustomRollerShutter(layers, 'vertical-slider-left')
</script>

<template>
  <div style="display: none" class="vertical-slider" id="vertical-slider-left" data-slider="left"></div>
  <el-card class="card">
    <el-button type="primary" @click="startRollerShutter">开启卷帘</el-button>
    <el-button type="primary" @click="closeRollerShutter">关闭卷帘</el-button>
  </el-card>
</template>

5、总结

本文介绍了一个基于iClient3D for Cesium封装的 vue hook,并演示了其具体用法。旨在帮助开发者快速在Vue项目中,通过简单的步骤实现场景卷帘功能。


http://www.kler.cn/a/450281.html

相关文章:

  • 【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
  • git clone必须使用sudo否则失败 git推送错误想再次编辑和推送
  • mapbox基础,加载mapbox官方地图
  • 深入了解蓝牙Profile类型与设备的对应关系
  • 门户系统需要压测吗?以及门户系统如何压力测试?
  • Linux 中 grep、sed、awk 命令
  • 202411 第十六届蓝桥杯青少组 STEMA 考试真题 汇总
  • JavaScript--WebAPI查缺补漏
  • 绿盟CSSP靶场-挂载虚拟化磁盘
  • Android Bootable Recovery 中的 `freecache.cpp` 文件详解
  • Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
  • iDP3复现代码数据预处理全流程(二)——vis_dataset.py
  • 解决“SVN无法上传或下载*.so、*.a等二进制文件“问题
  • 汽车经销商门店管理新趋势:信息化工具助力精益运营
  • 网安入门|前端基础之Html_css基础
  • idea2024创建JavaWeb项目以及配置Tomcat详解
  • 水利水电安全员考试题库及答案
  • 捋一捋相关性运算,以及DTD和NLP中的应用
  • 【超详细实操内容】django的身份验证系统之权限与权限管理
  • 【漏洞复现】CVE-2021-45788 SQL Injection
  • Ansible 批量管理华为 CE 交换机
  • 高性能卡尺找圆工具
  • http反向代理
  • ubuntu22.04安装PaddleX3
  • PyCharm专业版安装和学生认证教程
  • 没想到互联网大厂都喜欢问MySQL中的数据类型?