【Cesium】九、Cesium点击地图获取点击位置的坐标,并在地图上添加图标

文章目录

一、前言

查找发现好几种方法可以获取到点击位置的坐标。这里我实现需求就不深究学习了。将几位大佬的方法学习过来稍微整合了一下。

本文参考文章:

cesium 4种拾取坐标的方法
【Cesium基础学习】拾取坐标
cesium拾取当前地图点击位置坐标,并在添加点到图上显示

图一黄色的图标是点击的位置,图二是点击位置答应的经纬度点。

二、实现方法

复制代码
 viewer.scene.globe.depthTestAgainstTerrain = true;
  // 创建一个事件处理器来处理屏幕空间事件
  var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
  // 监听鼠标点击事件
  handler.setInputAction(function (click) {
    // 使用pick函数获取点击位置的实际位置
    var cartesian = viewer.scene.pickPosition(click.position);
    if (Cesium.defined(cartesian)) {
      // 将笛卡尔坐标转换为经纬度坐标
      var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
      var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
      var heightString = cartographic.height.toFixed(2);
      console.log('经度:' + longitudeString + ',纬度:' + latitudeString + ',高度:' + heightString)

      // 添加点
      let clickPosition = viewer.scene.camera.pickEllipsoid(click.position);
      viewer.entities.add({
        position: clickPosition,
        point: {
          color: Cesium.Color.YELLOW,
          pixelSize: 30
        }
      })
    }
    // 使用Scene.pick来获取3D Tiles的实际高度
    var pickedObject = viewer.scene.pick(click.position);
    if (Cesium.defined(pickedObject)) {
      // 获取到3D Tiles的高度
      const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      const height = cartographic.height;
      const lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
      const lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
      console.log('点击位置的经度是: ' + lon);
      console.log('点击位置的纬度是: ' + lat);
      console.log('点击位置的高度是: ' + height);
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

其中 开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true),否则在没有没有3dTile模型的情况下,会出现空间坐标不准的问题。

关于注意事项,需要根据具体的业务场景和需求进行判断和处理。在实际应用中,通常需要根据拾取到的物体进行相应的业务逻辑处理,例如显示信息窗口、执行特定操作等。

三、App.vue

附上App.vue 完整代码,仅供参考:

复制代码
<template>
  <div id="cesiumContainer"></div>
</template>
<script setup>
import { onMounted, reactive, ref } from "vue";
import * as Cesium from "cesium";
const initFn = async () => {
  const viewer = new Cesium.Viewer("cesiumContainer", {
    infoBox: false,
    geocoder: false,
    homeButton: false,
    sceneModePicker: false,
    baseLayerPicker: true,
    navigationHelpButton: false,
    animation: false,
    timeline: false,
    fullscreenButton: false,
    vrButton: false,
  });

  // 将 viewer 暴露到全局
  window.viewer = viewer;

  viewer._cesiumWidget._creditContainer.style.display = "none"; //取消版权信息


  viewer.scene.globe.depthTestAgainstTerrain = true;
  // 创建一个事件处理器来处理屏幕空间事件
  var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
  // 监听鼠标点击事件
  handler.setInputAction(function (click) {
    // 使用pick函数获取点击位置的实际位置
    var cartesian = viewer.scene.pickPosition(click.position);
    if (Cesium.defined(cartesian)) {
      // 将笛卡尔坐标转换为经纬度坐标
      var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
      var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
      var heightString = cartographic.height.toFixed(2);
      console.log('经度:' + longitudeString + ',纬度:' + latitudeString + ',高度:' + heightString)

      // 添加点
      let clickPosition = viewer.scene.camera.pickEllipsoid(click.position);
      viewer.entities.add({
        position: clickPosition,
        point: {
          color: Cesium.Color.YELLOW,
          pixelSize: 30
        }
      })
    }
    // 使用Scene.pick来获取3D Tiles的实际高度
    var pickedObject = viewer.scene.pick(click.position);
    if (Cesium.defined(pickedObject)) {
      // 获取到3D Tiles的高度
      const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      const height = cartographic.height;
      const lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
      const lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
      console.log('点击位置的经度是: ' + lon);
      console.log('点击位置的纬度是: ' + lat);
      console.log('点击位置的高度是: ' + height);
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

};



onMounted(() => {
  // Cesium 初始化
  initFn();
});
</script>
<style>
#app {
  width: 100%;
  height: 100%;
  font-family: sans-serif;
  text-align: center;
}

html,
body,
#cesiumContainer {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
}
</style>

注意:上面方法虽然在地图上添加了黄色的图标,但是只有一半,下一篇文章 【Cesium】十、Cesium画点只有一半的问题,亲测有用 会解决。

后面我还会更新更多关于cesium知识,敬请关注。

相关推荐
林语琛39 分钟前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel
liuchangng1 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习
weixin_307779132 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
2601_966949652 小时前
为什么量化回测中 for 循环比 DataFrame 慢三个数量级?从向量化原理讲起
开发语言·python·pandas·股票数据·quantdash
我命由我123452 小时前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
边境悍匪3 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao3 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob2333 小时前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab
quantdash_cc4 小时前
量化策略为什么需要实时行情数据?从信号产生到交易决策的时间差说起
开发语言·python·数据分析·量化交易·股票数据·quantdash
志尊宝5 小时前
Vue3 零基础每日笔记(048):嵌套路由与命名视图——后台管理系统布局雏形
前端·javascript·vue.js·笔记·html5