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

用Cesium做个地图标记功能?手把手教你实现点击获取经纬度的完整流程

用Cesium实现地图标记功能从点击事件到经纬度坐标的完整指南第一次接触Cesium的三维地球开发时最让我兴奋的就是能够像主流地图应用那样通过点击获取任意位置的经纬度信息。这个看似简单的功能背后其实隐藏着屏幕像素、三维空间和地理坐标三个不同维度的坐标系转换。本文将带你用不到100行代码实现一个完整的坐标拾取工具。1. 环境搭建与基础准备在开始编写交互代码前我们需要准备一个基础的Cesium开发环境。这里推荐使用CDN方式快速引入Cesium库避免复杂的构建配置!DOCTYPE html html head meta charsetUTF-8 titleCesium坐标拾取示例/title script srchttps://cesium.com/downloads/cesiumjs/releases/1.95/Build/Cesium/Cesium.js/script link hrefhttps://cesium.com/downloads/cesiumjs/releases/1.95/Build/Cesium/Widgets/widgets.css relstylesheet style html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } /style /head body div idcesiumContainer/div script // 初始化Viewer const viewer new Cesium.Viewer(cesiumContainer, { terrainProvider: Cesium.createWorldTerrain(), timeline: false, animation: false }); /script /body /html提示使用createWorldTerrain()需要Cesium ion账号和token如需离线开发可改用new Cesium.EllipsoidTerrainProvider()基础场景中几个关键对象需要提前了解Viewer整个三维场景的容器和控制器Scene包含所有图形对象的场景树Camera控制观察视角和投影方式Globe代表地球表面的地形和影像层2. 坐标系系统深度解析Cesium开发涉及三种核心坐标系理解它们的区别和转换关系至关重要坐标系类型描述典型用途代表类屏幕坐标二维像素坐标原点在左上角鼠标点击位置Cartesian2世界坐标三维直角坐标系原点在地球中心空间位置计算Cartesian3地理坐标经纬度高程表示的椭球面坐标地理信息存储Cartographic转换流程遵循这样的链条屏幕坐标 → 世界坐标 → 地理坐标这个转换过程需要考虑地球曲率和地形高程。在平坦的地球模型下转换相对简单但真实场景中必须通过Globe.pick()方法考虑地形因素。3. 实现点击拾取功能现在我们来编写核心的点击事件处理代码。完整的实现包含三个关键步骤// 在Viewer初始化后添加以下代码 viewer.screenSpaceEventHandler.setInputAction((click) { // 步骤1获取屏幕坐标 const screenPosition click.position; // 步骤2屏幕坐标转世界坐标 const ray viewer.camera.getPickRay(screenPosition); if (!ray) return; const worldPosition viewer.scene.globe.pick(ray, viewer.scene); if (!worldPosition) return; // 步骤3世界坐标转地理坐标 const cartographic Cesium.Cartographic.fromCartesian(worldPosition); const longitude Cesium.Math.toDegrees(cartographic.longitude); const latitude Cesium.Math.toDegrees(cartographic.latitude); const height cartographic.height; console.log(经度: ${longitude.toFixed(6)}°, 纬度: ${latitude.toFixed(6)}°, 高程: ${height.toFixed(2)}米); // 添加标记点 viewer.entities.add({ position: worldPosition, point: { pixelSize: 10, color: Cesium.Color.RED, outlineColor: Cesium.Color.WHITE, outlineWidth: 2 }, label: { text: ${longitude.toFixed(4)}°, ${latitude.toFixed(4)}°, font: 14px sans-serif, style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2, verticalOrigin: Cesium.VerticalOrigin.TOP, pixelOffset: new Cesium.Cartesian2(0, -15) } }); }, Cesium.ScreenSpaceEventType.LEFT_CLICK);这段代码实现了完整的交互流程通过screenSpaceEventHandler监听左键点击事件将点击位置的屏幕坐标转换为三维射线通过globe.pick()获取射线与地表的交点将世界坐标转换为人类可读的经纬度高程在点击位置添加可视化标记4. 高级功能扩展基础功能实现后我们可以进一步优化用户体验和功能完整性4.1 添加坐标显示面板在HTML中添加一个显示面板div idcoordinatePanel styleposition:absolute; top:10px; left:10px; background:white; padding:10px; border-radius:5px; 点击地图获取坐标 /div更新点击事件处理代码// 替换原来的console.log输出 const coordText 经度: ${longitude.toFixed(6)}°br纬度: ${latitude.toFixed(6)}°br高程: ${height.toFixed(2)}米; document.getElementById(coordinatePanel).innerHTML coordText;4.2 支持多点标记与清除添加控制按钮button idclearPoints styleposition:absolute; top:60px; left:10px;清除所有标记/button对应JavaScript代码document.getElementById(clearPoints).addEventListener(click, () { viewer.entities.removeAll(); document.getElementById(coordinatePanel).innerHTML 点击地图获取坐标; });4.3 地形精确度优化在山区或复杂地形区域可以开启更精确的地形采样viewer.terrainProvider Cesium.createWorldTerrain({ requestWaterMask: true, requestVertexNormals: true }); // 在pick调用时指定详细级别 const worldPosition viewer.scene.globe.pick(ray, viewer.scene, 9); // 9表示最高精度5. 常见问题与调试技巧在实际开发中你可能会遇到以下典型问题问题1点击海洋或空白区域返回null原因射线没有与地表相交解决添加有效性检查if (!worldPosition) { console.warn(未点击到有效地形); return; }问题2坐标精度不足原因默认地形采样率有限解决提高采样级别或使用本地高精度地形数据问题3标记点被地形遮挡解决调整点实体的高度参考模式viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height 2), // 抬高2米 // ...其他属性 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND });调试时可以利用Cesium的内置工具// 开启调试模式 viewer.scene.debugShowFramesPerSecond true; viewer.scene.globe.show true; viewer.scene.globe.showGroundAtmosphere true;6. 性能优化建议当需要处理大量标记点时考虑以下优化策略使用EntityCluster聚合显示密集点viewer.dataSources.add(Cesium.EntityCluster.new());对于静态标记改用Primitive API替代Entity APIviewer.scene.primitives.add(new Cesium.PointPrimitiveCollection({ modelMatrix: Cesium.Matrix4.IDENTITY, debugShowBoundingVolume: false }));按视距分级加载标记viewer.scene.postRender.addEventListener(() { const cameraHeight viewer.camera.positionCartographic.height; // 根据相机高度调整标记显示细节 });在最近的一个气象站项目中我们使用类似的坐标拾取功能让用户可以标记异常天气位置。最初直接使用Entity API导致在移动端出现卡顿后来改用Primitive结合视距检测性能提升了3倍以上。

相关文章:

用Cesium做个地图标记功能?手把手教你实现点击获取经纬度的完整流程

用Cesium实现地图标记功能:从点击事件到经纬度坐标的完整指南 第一次接触Cesium的三维地球开发时,最让我兴奋的就是能够像主流地图应用那样,通过点击获取任意位置的经纬度信息。这个看似简单的功能背后,其实隐藏着屏幕像素、三维空…...

如何免费解锁iOS激活锁:AppleRa1n离线绕过工具完整指南

如何免费解锁iOS激活锁:AppleRa1n离线绕过工具完整指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾经因为忘记Apple ID密码而无法使用自己的iPhone?或者购买的二手…...

绕过官方限制:在WD MyCloud Gen2上安装第三方App的完整避坑指南(含SSH开启)

WD MyCloud Gen2进阶玩法:解锁第三方应用生态全攻略 对于追求个性化定制的技术爱好者来说,WD MyCloud Gen2这款NAS设备就像一块未经雕琢的璞玉。虽然官方系统提供了基础的存储功能,但其封闭的应用生态却限制了更多可能性。本文将带你深入探索…...

KMS智能激活脚本终极指南:3分钟免费激活Windows和Office全版本

KMS智能激活脚本终极指南:3分钟免费激活Windows和Office全版本 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?面对复杂的激活流程和高昂的…...

Sketchfab平替?实测5个国内免费3D模型库(含新增资源站),哪个更适合你?

国内3D模型资源站深度测评:从毕设到外包项目的实战选型指南 当Sketchfab因网络限制或付费门槛成为设计路上的绊脚石时,国内是否藏着不输国际水准的3D模型库?作为经历过上百次模型下载踩坑的设计老鸟,我耗时两周对五家主流国内资源…...

从Arduino Nano到ATmega328P-PU:独立芯片烧录Arduino Uno引导程序的完整指南

1. 为什么需要独立烧录ATmega328P-PU芯片 很多刚开始玩Arduino的朋友都会有这样的困惑:明明用现成的Arduino开发板(比如Nano或者Uno)已经很方便了,为什么还要费劲去折腾单独的ATmega328P-PU芯片?这个问题我也思考了很久…...

Step3-VL-10B在内容审核中的应用:敏感图文识别+文字语义一致性校验实战

Step3-VL-10B在内容审核中的应用:敏感图文识别文字语义一致性校验实战 1. 引言:当内容审核遇上多模态AI 想象一下,你是一家社交平台的内容审核负责人。每天,海量的图片和文字内容像潮水一样涌来。一张看似普通的风景照&#xff…...

AXI协议深度解析:非对齐传输的实现与优化策略

1. 非对齐传输的本质与挑战 第一次接触AXI协议的非对齐传输时,我盯着波形图看了整整三天才恍然大悟。所谓非对齐传输,就像搬家时遇到家具尺寸和房门宽度不匹配的情况——你的32位数据包想从0x1002这个"门框"挤进去,但标准对齐地址…...

规避GCJ02偏移的坐标统一方案

在开发基于腾讯地图的 AI 原生应用(如智能出行规划助手)时,坐标系转换是一个极易导致定位偏移的“隐形杀手”。如果前端展示(JSAPI GL)与后端计算(WebService)使用的坐标系不一致,会…...

如何让经典《植物大战僵尸》完美适配现代宽屏显示器?PvZWidescreen模组深度解析

如何让经典《植物大战僵尸》完美适配现代宽屏显示器?PvZWidescreen模组深度解析 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 厌倦了在宽屏显示器上玩《植物大战僵尸》…...

超越K因子:基于奈奎斯特判据的ADS射频稳定性深度解析

1. K稳定性因子的局限性:为什么我们需要奈奎斯特判据? 作为一名射频工程师,我在设计MMIC功放时经常遇到一个令人头疼的问题:明明晶体管栅长已经很小了,加上稳定电路后增益却从15dB骤降到不足10dB。这种"高增益与稳…...

Kubernetes核心组件图解:用生活中的例子理解Pod、Deployment和Service

Kubernetes核心组件图解:用生活中的例子理解Pod、Deployment和Service 想象你走进一家五星级酒店,门童微笑着为你拉开大门——这就像Kubernetes集群的入口。大堂经理(API Server)核对你的预订信息(YAML配置&#xff0…...

深度学习驱动的图像超分辨率实战:从理论到代码的完整指南

1. 图像超分辨率:让模糊照片重获新生的魔法 你有没有遇到过这样的情况?手机里珍藏的老照片因为年代久远变得模糊不清,或者从网上下载的图片放大后全是马赛克。这时候,图像超分辨率技术就像是一个神奇的"修图师"&#xf…...

打造智能广告投放引擎:架构设计与性能优化实战

1. 智能广告投放引擎的核心挑战 每天有数十亿次广告请求在互联网上发生,但真正能触达目标用户的可能不到十分之一。我在参与某电商平台广告系统重构时,亲眼见证了一个糟糕的投放引擎如何烧掉广告主的预算——某次促销活动中,因为用户画像匹配…...

PASCAL VOC2012数据集实战指南:从下载到目标检测应用

1. PASCAL VOC2012数据集简介 PASCAL VOC2012是计算机视觉领域最经典的基准数据集之一,最初用于PASCAL VOC挑战赛。这个数据集包含了20个常见物体类别,涵盖人、动物、交通工具和室内物品四大类。每张图片都经过精细标注,包含物体边界框、类别…...

别再裸奔了!手把手教你给Prometheus监控面板加上账号密码(基于bcrypt加密)

从零构建企业级Prometheus监控安全体系:Basic Auth实战与深度防御 监控系统作为企业IT基础设施的"眼睛",其安全性往往被严重低估。我曾亲历某金融客户因未加密的Prometheus接口导致交易量指标泄露,最终引发商业纠纷的案例——攻击者…...

手动离线部署Ollama:绕过网络限制的完整指南

1. 为什么需要手动离线部署Ollama 最近在帮团队搭建本地AI开发环境时,遇到了一个典型问题:官方提供的Ollama安装脚本执行起来像蜗牛爬行,经常卡在下载环节。这种情况在国内开发者中相当普遍,主要原因包括网络延迟、下载速度限制等…...

从Android到Linux Phone:一加6T刷postmarketOS后,我遇到的5个“坑”及解决办法

一加6T刷postmarketOS实战:5个典型问题与深度解决方案 当Android系统无法满足技术探索的渴望时,许多极客将目光投向了手机上的Linux发行版。作为一款曾经的热门旗舰,一加6T凭借骁龙845芯片和开放的Bootloader,成为刷入postmarket…...

实测对比:EfficientNet-lite4在树莓派4B与Jetson Nano上的推理性能到底差多少?

EfficientNet-lite4边缘计算实战:树莓派4B与Jetson Nano推理性能深度对比 当你在树莓派上跑通第一个图像分类模型时,那种成就感就像在乐高积木上搭建出微型超级计算机。但当你发现实际部署需要兼顾速度、精度和功耗时,问题就变得复杂起来——…...

脑电分析实战手册:从信号降噪到智能分类的全流程解析

1. 脑电分析的核心价值与应用场景 脑电信号就像大脑发出的摩尔斯电码,记录着人类思维活动的每一个细微变化。想象一下,如果我们能破译这些电信号,就能读懂人的情绪状态、判断注意力集中程度,甚至预测某些神经系统疾病的前兆。这就…...

STM32H750内存不够用?巧用DCMI CROP功能,分块传输OV5640的640x480图像到上位机

STM32H750内存优化实战:DCMI CROP分块传输OV5640图像到上位机 在嵌入式视觉项目中,STM32H750与OV5640摄像头的组合常面临内存瓶颈问题。本文将深入探讨如何利用DCMI的CROP功能实现图像分块捕获与传输,解决内部SRAM不足的难题。 1. 问题背景与…...

终极DLSS文件管理方案:DLSS Swapper让NVIDIA显卡性能释放更简单

终极DLSS文件管理方案:DLSS Swapper让NVIDIA显卡性能释放更简单 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因DLSS版本不匹配导致游戏频繁崩溃?是否在多个游戏平台间手动管理DLSS文…...

告别随机端口!手把手教你为iPad远程SSH配置cpolar固定TCP地址(避坑指南)

告别随机端口!iPad远程SSH固定TCP地址配置全攻略 每次用iPad远程连接服务器编程,最头疼的就是临时地址隔三差五变化,刚调试到一半的连接突然中断,工作进度全被打乱。这种体验就像在沙滩上建城堡,潮水一来全没了。今天…...

GTE-Chinese-Large效果惊艳:专利摘要语义去重准确率达98.7%实测案例

GTE-Chinese-Large效果惊艳:专利摘要语义去重准确率达98.7%实测案例 1. 模型介绍:专为中文优化的文本向量化利器 GTE-Chinese-Large是阿里达摩院推出的通用文本向量模型,专门针对中文语义理解进行了深度优化。这个模型能够将任意长度的中文…...

鸣潮自动化助手终极指南:从零开始构建你的游戏智能管家

鸣潮自动化助手终极指南:从零开始构建你的游戏智能管家 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦了在…...

别再只用JWT了!用Spring Boot + RSA + AES 实现一套更安全的API接口加密方案(附完整代码)

Spring Boot实战:构建企业级RSAAES混合加密API网关 在移动互联网和分布式系统成为主流的今天,API接口安全已经从"可有可无"变成了"生死攸关"。去年某知名社交平台因接口被破解导致千万用户数据泄露的事件还历历在目,而今…...

终极指南:如何用PHP快速实现HTML转PDF的完整教程

终极指南:如何用PHP快速实现HTML转PDF的完整教程 【免费下载链接】html2pdf OFFICIAL PROJECT | HTML to PDF converter written in PHP 项目地址: https://gitcode.com/gh_mirrors/ht/html2pdf html2pdf是一个强大的PHP HTML转PDF库,能够帮助开发…...

ECO Lab模块深度解析:如何用MIKE 3自定义水质模型应对复杂污染场景

ECO Lab模块高阶实战:重金属与藻华场景下的MIKE 3水质模型定制化开发 当三维水动力模型遇上复杂污染物迁移转化问题时,标准模板往往捉襟见肘。去年在珠江口某重金属污染事故模拟中,我们团队发现传统降解公式完全无法解释镉离子与悬浮物的非线…...

UDS BootLoader实战:从安全访问到完整性校验的架构精解

1. UDS BootLoader的核心价值与挑战 第一次接触车载ECU刷写时,我被4S店技师拿着诊断仪"滴"一声就完成软件升级的场景震撼了。这背后正是UDS BootLoader在发挥作用——它就像汽车电子系统的"心脏起搏器",既要确保系统在任何异常状态下…...

Navicat Premium重置实战指南:3种高效方案深度解析

Navicat Premium重置实战指南:3种高效方案深度解析 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac Navicat Premi…...