最新版cesium+vue3+ts+vite实现鼠标画点标记采集

该代码示例展示了如何在Cesium地图上利用Vue框架监听鼠标点击事件,创建标记点并在控制台输出点的经纬度。通过ScreenSpaceEventHandler处理鼠标交互,添加点到场景,并显示带有经纬度信息的标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:
image.png
目标:
点击点采集,进行标记点,同时控制台输出点的经纬度
完整代码:

<script setup lang="ts">
import { onMounted, watch, ref } from "vue";
import * as Cesium from "cesium";
import initViewer from "@/cesium/initViewer";
// import MousePosition from '@/cesium/MousePosition'

let viewer: Cesium.Viewer | null = null;
//定义鼠标事件
let handler: Cesium.ScreenSpaceEventHandler | null = null;
//定义点集合
let pointArr = null;

onMounted(() => {
  // 加载底图
  viewer = initViewer();
  //根据鼠标移动获取经纬度
  // let mousePosition = new MousePosition(viewer);
});
const drawPoint = () => {
  // viewer是否为空
  if (viewer == null) {
    return;
  }
  //添加鼠标左键点击事件
  handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  //鼠标变成十字
  document.body.style.cursor = "crosshair";
  //鼠标左键点击事件
  handler.setInputAction((movement: any) => {
    if (viewer == null) {
      return;
    }
    // 获取经纬度和高程:地理坐标
    let ray: any = viewer.camera.getPickRay(movement.position); // 获取射线
    let cartesian = viewer.scene.globe.pick(ray, viewer.scene); // 获取地理坐标
    console.log("地理坐标:", cartesian);
    pointArr = viewer.entities.add({
      position: cartesian, //位置
      point: {
        pixelSize: 10,
        color: Cesium.Color.RED,
        outlineColor: Cesium.Color.WHITE,
        outlineWidth: 2,
      },
      label: {
        text: "紧贴地面(点)",
        font: "14pt sans-serif",
        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, //高度参考
        horizontalOrigin: Cesium.HorizontalOrigin.LEFT, //水平方向左对齐
        verticalOrigin: Cesium.VerticalOrigin.BASELINE, //垂直方向基线对齐
        pixelOffset: new Cesium.Cartesian2(20, 0), //偏移量 x,y
        fillColor: Cesium.Color.BLACK, //填充颜色
        showBackground: true,
        backgroundColor: new Cesium.Color(1, 1, 1, 0.5), //背景颜色
        backgroundPadding: new Cesium.Cartesian2(8, 4), //背景填充
        distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 2000), //距离显示条件 min,max单位米
        disableDepthTestDistance: Number.POSITIVE_INFINITY, //禁用深度测试距离
      },    
    });
    if (cartesian) {
      const cartographic = Cesium.Cartographic.fromCartesian(cartesian); //将笛卡尔坐标转换为地理坐标
      const longitudeString = Cesium.Math.toDegrees(
        cartographic.longitude
      ).toFixed(5); //将弧度转为度的十进制度表示
      const latitudeString = Cesium.Math.toDegrees(
        cartographic.latitude
      ).toFixed(5); //将弧度转为度的十进制度表示
      console.log(
        "经度:" +
        longitudeString +
        ",纬度:" +
        latitudeString +
        ",经纬度:(" +
        longitudeString +
        "," +
        latitudeString +
        ")"
      );
    }
    //鼠标变成默认
    // document.body.style.cursor = "default";
    //移除鼠标左键点击事件
    // handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};
const endDrewPoint = () => {
  //鼠标变成默认
  document.body.style.cursor = "default";
  //移除鼠标左键点击事件
  handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
};
</script>

<template>
  <div id="cesiumContainer"></div>

  <div class="btndiv">
    <button class="drawPoint" @click="drawPoint">画点(点采集)</button>
    <button class="endDrewPoint" @click="endDrewPoint">画点结束</button>
  </div>
</template>

<style scoped>
#cesiumContainer {
  width: 100vw;
  /*屏幕宽度*/
  height: 100vh;
  /*屏幕高度*/
  overflow: hidden;
  /*隐藏滚动条*/
}

.btndiv {
  position: fixed;
  display: flex;
  width: 250px;
  top: 50px;
  flex-direction: column;
  align-items: center;
  z-index: 999;
}

.btndiv button {
  /* position: absolute; */
  margin-top: 50px;
  /*绝对定位*/
  /* background-color: darkcyan; */
  background: linear-gradient(315deg, #42d392 25%, #647eff);
  color: white;
  font-size: 20px;
  width: 200px;
  height: 50px;
  padding: 10px;
  top: 20px;
  left: 20px;
  z-index: 999;
  border-radius: 5px;
  border: none;
  opacity: 0.8;
}

button:hover {
  /* background-color: darkturquoise; */
  background: linear-gradient(315deg, #2d2adf 25%, #0c911e);
}

button:active {
  /* background-color: darkslategray; */
  background: linear-gradient(315deg, #2d2adf 25%, #0c911e);
  color: #cccec7;
}


</style>

备注:其他鼠标事件可以自行扩展
点标签和样式设置

 label: {
        text: "紧贴地面(点)",
        font: "14pt sans-serif",
        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, //高度参考
        horizontalOrigin: Cesium.HorizontalOrigin.LEFT, //水平方向左对齐
        verticalOrigin: Cesium.VerticalOrigin.BASELINE, //垂直方向基线对齐
        pixelOffset: new Cesium.Cartesian2(20, 0), //偏移量 x,y
        fillColor: Cesium.Color.BLACK, //填充颜色
        showBackground: true,
        backgroundColor: new Cesium.Color(1, 1, 1, 0.5), //背景颜色
        backgroundPadding: new Cesium.Cartesian2(8, 4), //背景填充
        distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 2000), //距离显示条件 min,max单位米
        disableDepthTestDistance: Number.POSITIVE_INFINITY, //禁用深度测试距离
      },   

鼠标样式

 //鼠标变成十字
  document.body.style.cursor = "crosshair";
//鼠标变成默认
// document.body.style.cursor = "default";

鼠标事件的控制

//移除鼠标左键点击事件
  handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缠中说禅87

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值