当前位置: 首页 > article >正文

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

文章目录

  • 一、前言
  • 二、实现方法
  • 三、App.vue

一、前言

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

本文参考文章:

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知识,敬请关注。


http://www.kler.cn/a/469213.html

相关文章:

  • AI Development Notes 1 - introduction with the OpenAI API Development
  • Linux(Centos 7.6)命令详解:mkdir
  • 五个不同类型的数据库安装
  • 【微服务与K8S】
  • QT上实现SVM进行数据分类
  • Linux中rsync命令使用
  • Chrome 查看 session 信息
  • 后端Java开发:第七天
  • ref() 和 reactive() 区别
  • Genome Research | 俄亥俄州立于忠堂组-结合深度学习与蛋白质数据库系统探究反刍动物真核微生物...
  • 解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canc
  • 如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程
  • SQL Server 中生成等差数列的方法研究
  • 【操作系统不挂科】<内存管理-文件系统-磁盘调度(19)>选择题+简答题(带答案与解析)
  • 挖掘建模之分类与预测
  • Jmeter进阶篇(31)解决java.net.BindException: Address already in use: connect报错
  • Dexcap复现代码数据预处理全流程(一)——replay_human_traj_vis.py
  • leecode1143.最长公共子序列
  • 成语接龙游戏生成器:结合 ZhipuAI 的 Python 实现
  • MySql核心面试面试问题解析
  • Redis - 4 ( 9000 字 Redis 入门级教程 )
  • VSCode突然消失,只好重新下载安装
  • Redis(基础篇 + 实践篇 )
  • 青少年编程与数学 02-006 前端开发框架VUE 04课题、组合式API
  • 后端Java开发:第八天
  • 【网络云SRE运维开发】2025第1周-每日【2025/01/04】小测-【第5章 交换机的工作原理】理论和实操-解析