ceisum 鼠标拖拽移动实体

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

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

效果图:

 在线预览:

WebGIS之家WebGIS之家,openlayers示例源码,cesium示例源码,openlayers在线调试预览,cesium在线调试预览,webgis,数字地球,数字孪生icon-default.png?t=N7T8https://www.webgishome.com/preview?id=47&example_name=dragEntity&title=%E6%8B%96%E6%8B%BD%E5%AE%9E%E4%BD%93

 实现代码:

<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);
    }
}

Cesium中,移动实体的位置可以通过多种方式实现。以下是几种常见的方法: 1. **直接设置实体的位置**: 可以通过直接设置实体的`position`属性来移动实体。位置通常使用`Cartesian3`对象来表示。 ```javascript // 创建一个Cesium Viewer实例 var viewer = new Cesium.Viewer('cesiumContainer'); // 创建一个实体 var entity = viewer.entities.add({ name: '移动实体', position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), point: { pixelSize: 10, color: Cesium.Color.RED } }); // 更新实体的位置 entity.position = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 1000); // 在原有位置的基础上增加高度 ``` 2. **使用`setView`方法**: 可以使用Cesium的`camera`对象的`setView`方法来移动相机的位置,从而改变实体的位置。 ```javascript // 设置相机的位置 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 1000), orientation: { heading: Cesium.Math.toRadians(0.0), pitch: Cesium.Math.toRadians(-90.0), roll: 0.0 } }); ``` 3. **使用`callback`函数动态更新位置**: 可以使用Cesium的`callback`函数来动态更新实体的位置,例如在动画中使用。 ```javascript // 创建一个实体 var entity = viewer.entities.add({ name: '动态移动实体', position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), point: { pixelSize: 10, color: Cesium.Color.BLUE } }); // 定义一个动画函数 viewer.scene.preUpdate.addEventListener(function (scene, time) { var newPosition = Cesium.Cartesian3.fromDegrees(-75.59777 + time.secondsOfDay, 40.03883); entity.position = newPosition; }); ``` 通过以上方法,你可以根据具体需求在Cesium移动实体的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值