【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知识,敬请关注。
【Cesium】九、Cesium点击地图获取点击位置的坐标,并在地图上添加图标的更多相关文章
- JQuery点击table获取点击行的数据
$(function () {var TaskType = '';$("#data_table tr:gt(0)").click(function () { TaskType = ...
- C# 如何获取屏幕的截图,以及如何在图像上添加文字
关键代码为 Screen sc = Screen.PrimaryScreen; Rectangle rct = sc.Bounds; Image img = new Bitmap(rct.Width, ...
- Qt获取控件位置,坐标总结
总结的结果是: QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标. 总结一:经过试验,QMouseEvent::globalPos() 和 QCursor::pos()效果 ...
- 伟景行 citymaker 从入门到精通(3)——点击地图获取坐标,点击模型获取模型信息和属性信息
在地图上点击要素查看要素信息,也就是identify功能 script部分 // 通过枚举索引获取枚举名称 function getEnumTextByIdx(enumObj, idx) { for ...
- arcgis for silverlight 鼠标点击地图获取当前经纬度
silverlight代码: 地图的name值是myMap.后台在页面初始化的时候,添加地图的点击事件 myMap.MouseClick+=new EventHandler<Map.MouseE ...
- cesium加载gltf模型点击以及列表点击定位弹窗
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 之 ...
- reat + cesium。 实现 初始化时自动定位,鼠标移动实时展示坐标及视角高度, 淹没分析
只贴实现淹没分析这块的代码. import styles from './cesium.less'; import React from 'react'; import Cesium from 'ce ...
- 完整版百度地图点击列表定位到对应位置并有交互动画效果demo
1.前言 将地图嵌入到项目中的需求很多,好吧,我一般都是用的百度地图.那么今天就主要写一个完整的demo.展示一个列表,点击列表的任一内容,在地图上定位到该位置,并有动画效果.来来来,直接上demo ...
- 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址
简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
- 百度地图marker点击任意一个当前的变化,其余的marker不变
百度地图marker点击任意一个当前的变化,其余的marker不变 最近做的百度地图,遇到一个问题,就是在for循环里面执行marker的点击事件 没有可以比对的对象,每次点击marker的时候,i都 ...
随机推荐
- Phenomenon•Observation•Uncertainty/Certainty•Statistical law•Random phenomenon•Theory of Probability
Mathematics: the logic of certainty. Statistics: the logic of uncertainty. Certainty/Uncertainty: Ph ...
- SciTech-Logic:逻辑学-Critical Thinking:批判性思维: 专有名词解释
SciTech-Logic:逻辑学-Critical Thinking:批判性思维: 专有名词解释 大学版: Critical Thinking: A Students Introduction, 7 ...
- BIgdataAIML-IBM-A neural networks deep dive - An introduction to neural networks and their programming
https://developer.ibm.com/articles/cc-cognitive-neural-networks-deep-dive/ By M. Tim Jones, Publishe ...
- SciTech-EECS-PCB电路板设计-深思熟虑方可行动 :使用KiCad进行PCB设计的基本流程
聚焦人生的社交网.时间.精力.资源:人生方有成. 明确需求与产品设计: 大体的ideal开始,到深思熟虑,联系各方都通过,制定完好的计划方可行动. 是否已有成熟商品:直接采购即可? 目标用户群: 市场 ...
- SciTech-Mathematics-数学专业笔记总结
数学专业笔记总结: https://gitee.com/duanjinyi/real-number-set-and-function
- ES 7.8 速成笔记(中)
接上篇继续,本篇主要研究如何查询 一.sql方式查询 习惯于数据库开发的同学,自然最喜欢这种方式.为了方便讲解,先写一段代码,生成一堆记录 package com.cnblogs.yjmyzz; im ...
- JavaScript 编年史:探索前端界巨变的幕后推手
原文地址:https://deno.com/blog/history-of-javascript JavaScript 简史 今年,JavaScript 迎来了 30 岁生日. 在这三十年里,Java ...
- CF937Div4E :分段比较
Nearly Shortest Repeating Substring 题面翻译 给你一个长度为 \(n\) 的字符串 \(s\) ,它由小写字母组成.求最短字符串 \(k\) 的长度,使得多个(可能 ...
- 深入理解 JavaScript 时间分片:原理、应用与代码示例解析
JavaScript 时间分片(Time Slicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能.本文将详细解释 JavaScript 时间分 ...
- Redux 状态容器、管理
当你越来越有能力时,自然会有人看得起你:改变自己,你才有自信,梦想才会慢慢的实现.喷泉之所以漂亮是因为她有了压力:瀑布之所以壮观是因为她没有了退路:水之所以能穿石是因为永远在坚持. 首先我们要明确一个 ...