ceisum 鼠标拖拽移动实体

这篇具有很好参考价值的文章主要介绍了ceisum 鼠标拖拽移动实体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

鼠标拖拽主要分为3步:鼠标按下事件,鼠标移动事件,鼠标抬起事件。

  1. 当鼠标按下时获取该实体。viewer.scene.pick 来进行获取实体,并锁定相机(需加判断如果不是实体不能锁定相机)
  2. 当鼠标移动时动态改变实体经纬度。鼠标移动时,我们需要给刚刚左键按下获取的实体动态赋值新的经纬度,这样实体才能跟随鼠标移动
  3. 当鼠标抬起时,销毁事件 

效果图:

cesium 拖拽,Cesium,javascript,开发语言,ecmascript文章来源地址https://www.toymoban.com/news/detail-641150.html

  实现代码:

<template>
    <div id="cesiumContainer"></div>
    <div style="position:absolute;top:10px;left:10px;z-index:9;">
        <el-button @click="state.dragtool?.startDrag()">开始拖拽</el-button>
        <el-button @click="state.dragtool?.cancelDrag()">取消拖拽</el-button>

    </div>
</template>
    
<script setup>
import * as Cesium from "cesium";
import { onMounted, reactive } from "vue";
import DragTool from './DragTool.js'

const state = reactive({
    dragtool: null
})
onMounted(() => {
    const viewer = new Cesium.Viewer("cesiumContainer", {
        infoBox: false, // 禁用沙箱,解决控制台报错
        selectionIndicator: false, //选择指示器
    });
    viewer._cesiumWidget._creditContainer.style.display = "none"; //隐藏logo版权
    viewer.entities.add({
        name: "点",
        position: Cesium.Cartesian3.fromDegrees(-75.0, 30.0), //经纬度转世界坐标
        point: {
            show: true,
            color: Cesium.Color.GREEN,
            pixelSize: 20,
            outlineColor: Cesium.Color.YELLOW,
            outlineWidth: 3,
        },
    })

    state.dragtool = new DragTool({ viewer })

});
</script>
    
<style scoped>
#cesiumContainer {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0px;
    left: 0px;
    margin: 0;
    padding: 0;
    overflow: hidden;
}
</style>

 封装DragTool.js

export default class DragTool {
    constructor({ viewer }) {
        this.viewer = viewer
        this.leftDownFlag = false
        this.pick = null;//储存实体
        this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
    }
    // 开始拖拽
    startDrag() {
        this.leftDownAction()
        this.mouseMoveAction()
        this.leftUpAction()
    }
    leftDownAction() {
        this.handler.setInputAction(e => {
            let pick = this.viewer.scene.pick(e.position);
            if (Cesium.defined(pick) && (pick.id.id)) {
                this.pick = pick
                this.leftDownFlag = true;
                this.viewer.scene.screenSpaceCameraController.enableRotate = false;//锁定相机
            }
        }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
    }

    mouseMoveAction() {
        this.handler.setInputAction(e => {
            if (this.leftDownFlag === true && this.pick != null) {
                let ray = this.viewer.camera.getPickRay(e.endPosition);
                let cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);

                this.pick.id.position = cartesian;
                // this.pick.id.position = new Cesium.CallbackProperty(function () {
                //     return cartesian;
                // }, false);//感觉拖拽有点卡顿

            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    }
    leftUpAction() {
        this.handler.setInputAction(e => {
            if (this.leftDownFlag === true && this.pick != null) {
                this.leftDownFlag = false;
                this.pointDraged = null;
                this.viewer.scene.screenSpaceCameraController.enableRotate = true;//解锁相机
            }
        }, Cesium.ScreenSpaceEventType.LEFT_UP);
    }
    //清除鼠标事件
    cancelDrag() {
        this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
        this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
        this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    }
}

到了这里,关于ceisum 鼠标拖拽移动实体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium 视角切换到实体(entity)/ dataSources / 定位到模型(3DTiles)

    Cesium 的 camera.flyTo 是不可以直接飞到实体的。但是 viewer.flyTo 可以直接飞到实体。 viewer.flyTo (target, options) :将相机飞到提供的实体、实体或数据源。如果数据源仍在加载过程中或可视化仍在加载中,则此方法在执行飞行之前等待数据准备好 viewer.flyTo 的 target` 可以是:要查看

    2024年02月11日
    浏览(38)
  • Cesium 修改鼠标样式

    鼠标样式,有着特别重要的提示作用,合理使用鼠标样式可以让用户对系统操作有很大理解。 Cesium中 修改鼠标样式的代码如下: 这句代码将鼠标样式变成了小手,一般表示该对象可操作,可选中,拖拽等等。 解释一下啊这个代码:_container 这个对象是我们创建viewer传入的di

    2024年02月12日
    浏览(33)
  • cesium视椎体的移动旋转

    前面我讲过视椎体的创建,今天讲一下椎体的旋转移动了。 首先有个方法就是确定两个点,就比如电灯一样从一点望向另一点, 第二种方法可以直接通过计算两个点的方向 然后去设置一些自己需要的角度去旋转 上面就是可以直接输入一个想要的角度就可以去旋转了,如果要

    2024年02月15日
    浏览(31)
  • cesium常见操作:鼠标点击获取对象

       目录 一、viewer.scene.pick(获取Cartesian2) 二、 viewer.scene.pickPosition(获取Cartesian3) 三、viewer.scene.drillPick(穿透拾取,获取所有对象) 四、viewer.scene.globe.pick(获取加载地形后的经纬度(弧度)和高程) 五、 viewer.scene.camera.pickEllipsoid 六、window.viewer.imageryLayers.pickImageryLayer

    2024年02月11日
    浏览(36)
  • Cesium 鼠标滚轮事件获取地图缩放等级

    Cesium 监听鼠标滚轮,滚轮每次滚动获取当前地图瓦片等级。 灵感来自:cesium获取当前地图瓦片缩放级别_右弦GISer的博客-CSDN博客_cesium 获取缩放级别 实际使用时体验并不好,最后使用监听高度的方法。

    2024年02月11日
    浏览(38)
  • cesium学习记录08-鼠标绘制多边形

    上一篇学习了创建实体的一些基础知识,但有时还需要我们使用鼠标进行手动绘制,这一篇就来进行鼠标绘制实体的实现(点,线,矩形,圆,多边形)。 (这里需要掌握三个知识点,一是上一篇中的创建实体、二是鼠标事件、三是回调函数) 既然是鼠标绘制,自然离不开

    2024年02月12日
    浏览(32)
  • cesium 绘制工具 鼠标提示tips工具组件

    本专题主要是针对学习cesium小伙伴,在项目中实践总结的一些工具,以及会详细介绍,知识和封装的原理,废话不多说,此文介绍的是,鼠标提示tips工具组件,在项目中使用会优化交互效果,对客户友好,例如标绘工具,地图操作。 之前在网上看到的都是,通过动态创建,

    2024年03月21日
    浏览(41)
  • vue+cesium 获取鼠标浮动的经纬度

    是在地图中展示鼠标的经纬度 html 属性 css cesium鼠标移动的方法在初始化cesium之后调用这个方法

    2024年02月12日
    浏览(30)
  • 解决cesium中3dtiles模型随视角移动

    我们在使用cesium的时候有时会遇到一个问题就是模型导入之后,模型没有固定住会随着视角的变化而移动,研究发现模型在地底下。我认为是建模的问题有可能是建模软件使用的坐标不是wgs84导致高程不一的原因,但我没试过。 解决方案是:1.打开深度检测 2.手动把模型提上

    2024年02月16日
    浏览(30)
  • Cesium 在地图鼠标点击进行定位,并显示经纬度

    vue工程加载cesium 可以参考之前的文章:vue 使用cesium简单介绍_vue使用cesium_夜跑者的博客-CSDN博客 这篇文章介绍一下如何响应鼠标左键获取经纬度,以及在地图上添加广告牌。 1)响应鼠标左键,并获取经纬度         主要用到了2个接口ScreenSpaceEventHandler, setInputAction,代码

    2024年02月17日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包