cesium实现右键框选

效果图: 

 实现代码:

<template>
  <div id="cesiumContainer"></div>
</template>
  
  <script setup>
import * as Cesium from "cesium";
import { onMounted } from "vue";
onMounted(() => {
  const viewer = new Cesium.Viewer("cesiumContainer", {
    infoBox: false, // 禁用沙箱,解决控制台报错
  });
  //cesium默认右键为放大缩小,此处给zoomEventTypes设置新值
  viewer.scene.screenSpaceCameraController.zoomEventTypes = [
    Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
  ];
  //earthsdk默认右键为改变视角,此处禁止。
  viewer.scene.screenSpaceCameraController.lookEventTypes = [];

  //右键按下标识
  var flag = false;
  //起点终点x,y
  var startX = null;
  var startY = null;
  var endX = null;
  var endY = null;
  //创建框选元素
  var selDiv = document.createElement("div");
  var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
  //右键按下事件,设置起点,div设置样式和位置,添加到页面
  handler.setInputAction(function (event) {
    flag = true;
    startX = event.position.x;
    startY = event.position.y;
    selDiv.style.cssText =
      "position:absolute;width:0;height:0;font-size:0;margin:0;padding:0;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;";
    selDiv.id = "selectDiv";
    selDiv.style.left = startX + "px";
    selDiv.style.top = startY + "px";
    document.body.appendChild(selDiv);
  }, Cesium.ScreenSpaceEventType.RIGHT_DOWN);
  //鼠标抬起事件,获取div坐上和右下的x,y 转为经纬度坐标
  handler.setInputAction(function (event) {
    flag = false;
    var l = parseInt(selDiv.style.left);
    var t = parseInt(selDiv.style.top);
    var w = parseInt(selDiv.style.width);
    var h = parseInt(selDiv.style.height);
    var earthPosition = viewer.camera.pickEllipsoid(
      { x: l, y: t },
      viewer.scene.globe.ellipsoid
    );
    var cartographic = Cesium.Cartographic.fromCartesian(
      earthPosition,
      viewer.scene.globe.ellipsoid,
      new Cesium.Cartographic()
    );
    console.log(
      "左上坐标为:" +
        [
          Cesium.Math.toDegrees(cartographic.longitude),
          Cesium.Math.toDegrees(cartographic.latitude),
        ]
    );
    earthPosition = viewer.camera.pickEllipsoid(
      { x: l + w, y: t + h },
      viewer.scene.globe.ellipsoid
    );
    cartographic = Cesium.Cartographic.fromCartesian(
      earthPosition,
      viewer.scene.globe.ellipsoid,
      new Cesium.Cartographic()
    );
    console.log(
      "右下坐标为:" +
        [
          Cesium.Math.toDegrees(cartographic.longitude),
          Cesium.Math.toDegrees(cartographic.latitude),
        ]
    );
    //根据业务确定是否删除框选div
    document
      .getElementById("selectDiv")
      .parentNode.removeChild(document.getElementById("selectDiv"));
  }, Cesium.ScreenSpaceEventType.RIGHT_UP);
  //鼠标移动事件,处理位置css
  handler.setInputAction(function (event) {
    if (flag) {
      endX = event.endPosition.x;
      endY = event.endPosition.y;
      selDiv.style.left = Math.min(endX, startX) + "px";
      selDiv.style.top = Math.min(endY, startY) + "px";
      selDiv.style.width = Math.abs(endX - startX) + "px";
      selDiv.style.height = Math.abs(endY - startY) + "px";
    }
  }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
});
</script>
  
  <style scoped>
#cesiumContainer {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0px;
  left: 0px;
  margin: 0;
  padding: 0;
  overflow: hidden;
}
</style>

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值