cesium+vue3自定义HTML实体弹窗、加高德路网、防实体漂浮、让用户画圆、鹰眼
一、基础使用:Cesium.js基础使用(vue)-CSDN博客
1、基础路径
为 Cesium 库设置一个全局变量 CESIUM_BASE_URL,用于指定 Cesium 的资源文件(如 WebGL shaders、纹理、字体等)的
示例场景:假设你在开发一个基于 Cesium 的 3D 地球应用,但不想将 Cesium 的资源文件打包到项目中,而是希望通过 CDN 加载资源。
window.CESIUM_BASE_URL = 'https://cesium.com/downloads/cesiumjs/releases/1.97/Build/Cesium/';
2、Cesium Ion的默认访问令牌
Cesium.Ion.defaultAccessToken = ''; // 赋值你的访问令牌
二、其他配置
1、HTML自定义实体弹窗

// 以下代码都在onMounted钩子函数里// 函数用于创建一个新的小点实体和对应的HTML弹窗const createPoint = (id, position, info) => {// 创建小点实体var point = viewer.entities.add({position: position, // 位置point: {// 点的样式pixelSize: 10, // 像素大小},show: false, // 默认隐藏实体});// 创建HTML弹窗元素let element = document.createElement('div');element.className = 'locator';element.innerHTML = `<h3>${info.title}</h3><p>名称:${info.name}</p><p>类型:${info.type}</p><p>时间:${info.time}</p>`;// 设置初始可见性element.style.display = state.eventVisible ? 'block' : 'none';// 将HTML弹窗元素添加到Cesium Viewer容器中viewer.container.appendChild(element);//为弹窗添加点击事件element.addEventListener('click', () => {state.eventModalVisible = true;state.eventId = id;});// 将小点实体和HTML弹窗元素存入相应的集合state.points.push(point);state.pointElements[point.id] = element;return point;};//获取事件点数据const getEventPoint = async () => {state.pointsData = [];let res = await getEventTaskList();if (res.code === 200) {res.data.list.forEach(item => {if (item.f_lng !== null && item.f_lat !== null) {state.pointsData.push({id: item.id,position: Cesium.Cartesian3.fromDegrees(parseFloat(item.f_lng), parseFloat(item.f_lat), 0),info: { title: item.f_leve, name: item.f_name, type: item.f_from_type, time: item.f_create_time },});}});state.pointsData.forEach(function (data) {createPoint(data.id, data.position, data.info);});} else {console.log(res.msg);}};getEventPoint();//当鼠标拖动地图或放大缩小地图时,更新所有HTML弹窗的位置function updateAllElementPositions() {var scene = viewer.scene;// 如果场景模式不是MORPHING,则更新所有HTML弹窗的位置if (scene.mode !== Cesium.SceneMode.MORPHING) {// 遍历所有小点实体,更新对应的HTML弹窗的位置state.points.forEach(function (point) {var canvas = scene.canvas;// 获取小点实体的位置var cartesian = Cesium.Property.getValueOrUndefined(point.position, scene.lastRenderTime);// 将笛卡尔坐标转换为屏幕坐标var pixelPosition = scene.cartesianToCanvasCoordinates(cartesian);// 如果屏幕坐标存在,则更新HTML弹窗的位置if (pixelPosition) {// 获取HTML弹窗元素var element = state.pointElements[point.id];// 设置HTML弹窗元素的位置element.style.left = pixelPosition.x + 'px';element.style.top = pixelPosition.y + 'px';// 检查可见性element.style.display = state.eventVisible ? 'flex' : 'none';}});}}// 监听Cesium场景更新事件,以便在每次渲染时更新所有HTML弹窗的位置viewer.scene.postRender.addEventListener(updateAllElementPositions);// 函数用于更新所有弹窗的可见性function updatePopupVisibility() {Object.values(state.pointElements).forEach(element => {element.style.display = state.eventVisible ? 'block' : 'none';});}//更新弹框显隐watch(() => state.eventVisible,newVal => {updatePopupVisibility();},);
onUnmounted(() => {//页面卸载时清除事件监听器window.removeEventListener('unload', function () {viewer.scene.postRender.removeEventListener(updateAllElementPositions);});}
:deep(.locator) {display: flex;flex-direction: column;align-items: center;position: absolute;width: 236px;height: 207px;margin-top: -190px;margin-left: -118px;background: url('/src/assets/images/screen/locator.png') no-repeat center center;padding: 23px 0;cursor: pointer;}
2、让弹框和相关区域同时显隐

//该函数用于输入多边形顶点坐标,能够绘制多边形在视图上,多边形背景颜色为红色,边框为黄色function drawPolygon(points, isShow, entities) {let color;if (entities === state.irrigationEntities) {color = Cesium.Color.BLUE.withAlpha(0.5);};var polygon = viewer.entities.add({polygon: {hierarchy: Cesium.Cartesian3.fromDegreesArray(points),material: color,outline: true,},show: isShow,});//将多边形实体ID存入相应的集合entities.push(polygon.id);}//监听showIrrigation,为true时绘制灌区,否则隐藏watch(() => state.showIrrigation,newVal => {if (newVal) {//移除灌区多边形state.irrigationEntities.forEach(id => {viewer.entities.removeById(id);});state.irrigationEntities = [];state.irrigationAreaData.forEach(area => {drawPolygon(area, true, state.irrigationEntities);});} else {//移除灌区多边形state.irrigationEntities.forEach(id => {viewer.entities.removeById(id);});state.irrigationEntities = [];}},);
3、设置地形关闭,防止漂浮
- 启用地形:适用于需要展示真实地形的应用场景(如山脉、峡谷等)。
- 关闭地形:适用于需要简化渲染、提升性能或避免地形干扰的场景。
// 设置地形,关闭
viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider();
注:不关闭地形的话,鼠标拖拽地图移动时,实体会出现类似漂浮的效果(鼠标拖拽一下,实体移动出去更远)

4、鹰眼

// 创建鹰眼地图的Viewerconst overviewViewer = new Cesium.Viewer(overviewContainer.value, {animation: false, // 禁用动画控件geocoder: false, // 开启地理编码控件homeButton: false, // 禁用主视图控件sceneModePicker: false, // 禁用场景模式切换控件// baseLayerPicker: false, // 禁用底图切换控件navigationHelpButton: false, // 禁用导航帮助按钮timeline: false, // 禁用时间轴控件});// 隐藏底部版权信息overviewViewer._cesiumWidget._creditContainer.style.display = 'none';// 添加高德地图路网overviewViewer.imageryLayers.addImageryProvider(gaodeLayer);// 同步两个地图的视角function syncView(longitude, latitude, height) {// 确保参数是数值类型longitude = parseFloat(longitude);latitude = parseFloat(latitude);height = parseFloat(height);overviewViewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),orientation: {heading: Cesium.Math.toRadians(0), // 方向角度,单位为弧度pitch: Cesium.Math.toRadians(-90), // 俯仰角度,单位为弧度roll: 0, // 翻滚角度,单位为弧度},duration: 1, // 动画持续时间,单位为秒});}// 设置中心点同样的经纬度syncView(state.longitude, state.latitude, state.height * 5);
5、添加高德地图路网
显示道路和中文的区域名字:

const gaodeLayer = new Cesium.UrlTemplateImageryProvider({url: 'http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',maximumLevel: 18,});
viewer.imageryLayers.addImageryProvider(gaodeLayer);
6、让用户画圆
//开始画圆const startDrawingCircle = () => {//监听鼠标,后一次点击的位置与前一次点击的位置之间的直线为圆的直径。let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);let positions = [];handler.setInputAction(movement => {//获取鼠标点击的位置的笛卡尔坐标let cartesian = viewer.scene.pickPosition(movement.position);//如果cartesian存在且与positions数组中的第一个元素不相等,则将其添加到positions数组中if (cartesian && (!positions.length || !Cesium.Cartesian3.equals(cartesian, positions[0]))) {positions.push(cartesian);if (positions.length === 2) {let center = Cesium.Cartesian3.midpoint(positions[0], positions[1], new Cesium.Cartesian3());let radius = Cesium.Cartesian3.distance(center, positions[0]);var circle = viewer.entities.add({position: center,ellipse: {semiMinorAxis: radius,semiMajorAxis: radius,material: Cesium.Color.RED.withAlpha(0.5),outline: true,outlineColor: Cesium.Color.BLACK,},});positions = [];state.circleEntities.push(circle.id);}}}, Cesium.ScreenSpaceEventType.LEFT_CLICK); //监听state.drawingCircle,当其值为false时,移除handlerwatch(() => state.drawingCircle,value => {if (value) {startDrawingCircle();} else {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);}},);};
7、让用户画多边形
//开始画多边形const startDrawingPolygon = () => {let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);let positions = [];let polygon = null;handler.setInputAction(movement => {let cartesian = viewer.scene.pickPosition(movement.position);if (cartesian) {positions.push(cartesian);if (positions.length === 1) {polygon = viewer.entities.add({polygon: {hierarchy: new Cesium.CallbackProperty(() => {return new Cesium.PolygonHierarchy(positions);}, false),material: Cesium.Color.RED.withAlpha(0.5),outline: true,outlineColor: Cesium.Color.BLACK,},});state.polygonEntities.push(polygon.id);} else {polygon.polygon.hierarchy = new Cesium.CallbackProperty(() => {return new Cesium.PolygonHierarchy(positions);}, false);}}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);watch(() => state.drawingPolygon,value => {if (value) {startDrawingPolygon();} else {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);}},);};
8、隐藏底部版权信息
viewer._cesiumWidget._creditContainer.style.display = 'none';
注:创建Cesium Viewer要在onMounted钩子函数内
9、地图深度检测
确保 3D 场景中物体的遮挡关系正确,避免出现物体穿插或遮挡错误的问题。它是实现真实感渲染的关键技术之一,在地形、建筑、飞行器等场景中尤为重要。
viewer.scene.globe.depthTestAgainstTerrain = true;
10、地图颜色
官方本来提供了多种主题,但是仍然想自定义颜色可如下设置:
viewer.scene.globe.baseColor = Cesium.Color.fromCssColorString('#00115F');
let baseLayer = viewer.imageryLayers.get(0);
baseLayer.show = false;
11、禁用双击事件
双击地图上的某个位置,通常会放大视图并聚焦到该点。
viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
12、添加动画效果,飞向指定位置
// 添加动画效果,飞向指定位置,写成函数,方便调用function flyToLocation(longitude, latitude, height) {viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),orientation: {heading: Cesium.Math.toRadians(0), // 方向角度,单位为弧度pitch: Cesium.Math.toRadians(-90), // 俯仰角度,单位为弧度roll: 0, // 翻滚角度,单位为弧度},duration: 1, // 动画持续时间,单位为秒});}flyToLocation(104.69, 30.2183873102, 5000);
三、学习资料参考(感谢大佬分享):
1、cesium中文网
Animation - Cesium Documentation
2、cesium编程入门 | cesium中文网
3、3.Cesium中实体Entity创建(超详细)_new cesium.entity-CSDN博客
相关文章:
cesium+vue3自定义HTML实体弹窗、加高德路网、防实体漂浮、让用户画圆、鹰眼
一、基础使用:Cesium.js基础使用(vue)-CSDN博客 1、基础路径 为 Cesium 库设置一个全局变量 CESIUM_BASE_URL,用于指定 Cesium 的资源文件(如 WebGL shaders、纹理、字体等)的 示例场景:假设你…...
Go红队开发—编解码工具
文章目录 开启一个项目编解码工具开发Dongle包Base64编解码摩斯密码URL加解密AES加解密 MD5碰撞工具开发 开启一个项目 这作为补充内容,可忽略直接看下面的编解码: 一开始用就按照下面的步骤即可 1.创建一个文件夹,你自己定义名字(建议只用…...
计算机毕业设计SpringBoot+Vue.js常规应急物资管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
thinkphp5对接阿里云ocr试卷切题
thinkphp5对接阿里云ocr试卷切题 提示:切题使用的是api:RecognizeEduPaperCut 以下是基于 ThinkPHP5.14 框架调用阿里云 RecognizeEduPaperCut 接口的详细实现步骤和代码示例。 文章目录 thinkphp5对接阿里云ocr试卷切题前言1、前置准备2、 配置文件3、控制器直接引…...
AI数据分析:用DeepSeek做数据清洗
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础,其目的是…...
免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全
软件技术 今天要给大家分享一款超实用的 PDF 处理工具,它免费又轻巧,如同随时待命的得力小帮手,功能之强大超乎想象,真的值得大家收藏。 这款工具是绿色版软件,解压后开启,满满的 PDF 处理功能便映入眼帘…...
基于JavaWeb开发的Java+SpringBoot+vue+element实现物流管理系统
基于JavaWeb开发的JavaSpringBootvueelement实现物流管理系统 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定…...
计算机毕业设计SpringBoot+Vue.js华强北商城二手手机管理系统 (源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
实验:k8s+keepalived+nginx+iptables
1、创建两个nginx的pod,app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理,VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…...
DeepSeek入门学习
参考文档:DeepSeek(人工智能企业)_百度百科 DeepSeek-R1 凭借创新的强化学习技术实现重大突破。在极少量标注数据的基础上,通过深度优化的后训练阶段,显著提升了模型的推理能力。在数学运算、代码生成、自然语言推理等…...
几道考研数学题求解
函数性质问题 【题目】 已知函数 f ( x , y ) x 3 y 3 − ( x y ) 2 3 f(x, y) x^3 y^3 - (xy)^2 3 f(x,y)x3y3−(xy)23。设 T T T 为曲面 z f ( x , y ) z f(x, y) zf(x,y) 在点 ( 1 , 1 , 1 ) (1,1,1) (1,1,1) 处的切平面, D D D 为 T T T 与坐标…...
Highcharts 配置语法详解
Highcharts 配置语法详解 引言 Highcharts 是一个功能强大的图表库,广泛应用于数据可视化领域。本文将详细介绍 Highcharts 的配置语法,帮助您快速上手并制作出精美、实用的图表。 高级配置结构 Highcharts 的配置对象通常包含以下几部分:…...
OpenEuler学习笔记(三十五):搭建代码托管服务器
以下是主流的代码托管软件分类及推荐,涵盖自托管和云端方案,您可根据团队规模、功能需求及资源情况选择: 一、自托管代码托管平台(可私有部署) 1. GitLab 简介: 功能全面的 DevOps 平台,支持代码托管、C…...
Python的pdf2image库将PDF文件转换为PNG图片
您可以使用Python的pdf2image库将PDF文件转换为PNG图片。以下是一个完整的示例,包含安装步骤、代码示例和注意事项。 安装依赖库 首先,您需要安装pdf2image库: pip install pdf2imagepdf2image依赖于poppler库来解析PDF文件。 Windows系统…...
算法-二叉树篇26-将有序数组转换为二叉搜索树
将有序数组转换为二叉搜索树 力扣题目链接 题目描述 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 解题思路 很简单的遇到递归题目,对数组取半,然后构建中间节点作为该数组对应的…...
使用Python SciPy库来计算矩阵的RCS特征值并生成极坐标图
在Python中,计算矩阵的RCS(Rayleigh商迭代法)特征值通常涉及使用数值线性代数库,如NumPy或SciPy。RCS(Rayleigh商迭代法)是一种用于计算矩阵特征值和特征向量的迭代方法。 以下是一个简单的示例࿰…...
车载以太网-基于linux的ICMP协议
对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…...
WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示
wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…...
【嵌入式】MCU开发基础知识速通
一、MCU开发常用编程语言及语法要求 MCU(微控制器单元)开发常用的编程语言包括C语言、C、汇编语言和Python,每种语言都有其适用场景和优势。 C语言:C语言因其接近硬件特性和高效执行效率而广泛应用于MCU开发。它具有丰富的内置函…...
Yocto + 树莓派摄像头驱动完整指南
—— 从驱动配置、Yocto 构建,到 OpenCV 实战 在树莓派上运行摄像头,在官方的 Raspberry Pi OS 可能很简单,但在 Yocto 项目中,需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键…...
抑制素A抗体如何提升妊娠中期唐氏综合征筛查的效能?
一、为何抑制素A成为妊娠期的重要生物标志物?抑制素A是一种由α和βA亚基通过二硫键连接形成的异源二聚体糖蛋白。在非妊娠期,它主要由卵巢颗粒细胞分泌,作为反馈调节因子,选择性地抑制垂体前叶分泌卵泡刺激素。进入妊娠状态后&am…...
利用快马平台十分钟快速构建开源项目网站原型:以openclaw101为例
作为一个经常参与开源项目的开发者,我深知快速验证想法的重要性。最近在尝试为开源项目openclaw101搭建网站时,发现InsCode(快马)平台能完美解决从零搭建的繁琐过程。下面分享如何用十分钟完成一个具备完整功能的项目网站原型。 明确需求与功能规划 首先…...
基于S7-200 PLC与组态王技术的温室大棚控制方案:包含梯形图原理图、IO分配及组态画面详解
基于S7-200 PLC和组态王温室大棚控制 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面菜农张叔上周还给我打电话吐槽:“小王啊,上周那场降温加突然转晴,我三点爬起来盖半层棉被…...
Laya3D美术进阶:巧用Shader实现APP级游戏效果还原
1. 为什么选择Laya3D的Shader技术? 很多开发者第一次接触Laya3D时,都会有个疑问:为什么不用Unity直接开发?特别是在微信小游戏这个特定场景下,Laya3D的Shader技术到底能带来什么优势?我做了三年Laya小游戏…...
OpenMP实战避坑:你的C++并行程序为什么跑得比单线程还慢?
OpenMP实战避坑:你的C并行程序为什么跑得比单线程还慢? 第一次在C代码里加上#pragma omp parallel for时,那种期待性能飙升的心情,相信每个开发者都经历过。但现实往往很骨感——程序运行速度不升反降,甚至出现莫名其妙…...
Win10+VS2019环境下vcpkg安装全攻略:从Git克隆到环境变量配置
Win10VS2019环境下vcpkg高效配置指南:从零搭建C开发环境 在Windows平台进行C开发时,第三方库的管理一直是令人头疼的问题。传统的手动下载、配置包含路径和链接库的方式不仅效率低下,还容易引发版本冲突。而vcpkg作为微软推出的跨平台C库管理…...
Ubuntu 22.04上,用Cephadm 17.2.0搭建单节点Ceph集群的保姆级避坑指南
Ubuntu 22.04单节点Ceph集群实战:从零到生产级部署的17个关键细节 当你在Ubuntu 22.04上尝试用Cephadm搭建单节点Ceph集群时,是否遇到过这些场景:bootstrap卡在某个步骤超过半小时、OSD设备明明存在却显示"no available devices"、…...
MSSQL03:SQLServer数据库中的高级语法及其技巧
目录 一、日期相关 1.查询当前日期相关数据 2.查询特定时间区间 3.时间加减法 (1)加法 (2)减法 4.格式化日期 二、数据类型转化 1.Int -> Decimal 2.DateTime->OtherTime 3.DateTime->string 三、条件判断相关…...
如何高效优化Windows系统性能:AtlasOS完整调优指南
如何高效优化Windows系统性能:AtlasOS完整调优指南 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/…...
如何快速搭建QQ机器人:OpenShamrock的终极指南
如何快速搭建QQ机器人:OpenShamrock的终极指南 【免费下载链接】OpenShamrock A Bot Framework based on Xposed with OneBot11 项目地址: https://gitcode.com/gh_mirrors/op/OpenShamrock OpenShamrock是一款基于LSPosed框架实现的QQ机器人开发框架&#x…...
