Cesium点位弹窗

1.弹窗没法向加入点位一样加入到地图内部,entity没法实现

2.使用绝对定位,将地图组件通过定位加入到地图上,注意弹窗层级一定在地图上

3.通过判断点击位置是否是点位来获取entity信息,将信息显示在弹窗

4.将点击处点位的经纬度转为浏览器视图的x,y坐标,设置弹窗位置

5.监听地图的缩放和拖动,实时改变显示的弹窗的位置,使弹窗一直保持在点位上方

效果:

地图组件(.vue)

<template>
	<div id="cesiumContainer" class="e-cesium">
		<PopUp></PopUp>
	</div>
</template>

<script lang="ts" setup>
import { onMounted } from 'vue';
import { mountedEvt } from './hooks';
import PopUp from './components/PopUp/index.vue';
onMounted(() => {
	mountedEvt();
});
</script>
<style lang="scss" scoped>
.e {
	&-cesium {
		height: 100%;
		width: 100%;
		box-sizing: border-box;
	}
}
</style>

 hooks.ts文件

import * as Cesium from 'cesium';
import { popInfo } from './config';
let viewer;
export function mountedEvt() {
	Cesium.Ion.defaultAccessToken =
		'自己的token';
	viewer = new Cesium.Viewer('cesiumContainer', {
		baseLayerPicker: false, // 关闭图层选择
	});
	let data = viewer.dataSources.add(
		Cesium.GeoJsonDataSource.load('/public/testData/pointLitter.json', {}),  // 加载点
	);
	data.then((dataSource) => {
		const entities = dataSource.entities.values;
		for (const item in entities) {
			const entity = entities[item];
			entity.billboard = {
				image: '/public/images/gg.png',  // 点位图片
				color: Cesium.Color.PINK,
				width: 40,
				height: 40,
				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地
			};
			entity.label = {
				text: entity.name,  // 标签
				font: '16px',
				pixelOffset: new Cesium.Cartesian3(0, 30, 0),
			};
		}
	});
	viewer.zoomTo(data);
	addPopEvt();
}
/**
 * @Description 弹窗
 * @Author: wms
 * @Date: 2023-11-17 11:02:33
 */
export const addPopEvt = () => {
	let popBox = new Cesium.InfoBox(document.getElementById('popBox'));
	viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(
		movement,
	) {
		let pickedObject = viewer.scene.pick(movement.position);

		if (
			Cesium.defined(pickedObject) &&
			pickedObject.id instanceof Cesium.Entity
		) {
			var entity = pickedObject.id;
			if (entity.position) {
				// 显示弹窗
				popBox.container.style.visibility = 'visible';
				// 获取位置信息
				let entityPosition = entity.position.getValue(
					viewer.clock.currentTime,
				);
				popInfo.value = entity.properties;
				// 监听 Viewer 的 postRender 事件,在地图移动时更新弹窗位置
				viewer.scene.postRender.addEventListener(function () {
					try {
						if (entityPosition !== null) {
							let screenPosition =
								Cesium.SceneTransforms.wgs84ToWindowCoordinates(
									viewer.scene,
									entityPosition,
								);
							if (screenPosition) {
								let leftOffset =
									screenPosition.x -
									popBox.container.clientWidth / 2;  // 左右位置
								let topOffset =
									screenPosition.y -
									popBox.container.clientHeight -
									18;  // 上下位置
								popBox.container.style.left = leftOffset + 'px';
								popBox.container.style.top = topOffset + 'px';
							}
						}
					} catch (error) {
						console.log(error);
					}
				});
			} else {
				popBox.container.style.visibility = 'hidden';
			}
		} else {
			// 隐藏弹窗
			popBox.container.style.visibility = 'hidden';
		}
	}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};

config.ts文件

import { Ref, ref } from 'vue';

export const popInfo: Ref<any> = ref({});

 弹窗组件(components/PopUp/index.vue)

<template>
	<div id="popBox" class="pop">
		<div class="pop-box">
			<div class="pop-box-title">{{ popInfo.title }}</div>
			<div class="pop-box-line"></div>
			<div class="pop-box-content">
				<div class="pop-box-content-item">
					<div class="pop-box-content-item-label">
						<span class="pop-box-content-item-labelCont">
							颜色:
						</span>
						{{ popInfo.color }}
					</div>
					<div class="pop-box-content-item-label">
						<span class="pop-box-content-item-labelCont">
							描述:
						</span>
						{{ popInfo.symbol }}
					</div>
				</div>
			</div>
		</div>
		<div class="pop-box-triangle"></div>
	</div>
</template>

<script lang="ts" setup>
import { popInfo } from '../../config';
import './index.scss';
</script>
<style lang="scss" scoped></style>

弹窗样式(components/PopUp/index.scss)

.pop {
	position: absolute;
	display: flex;
	flex-direction: column;
	width: 280px;
	z-index: 99;
	visibility: hidden;
	&-box {
		background-color: rgba(29, 54, 68, 0.8);
		&-title {
			font-size: 18px;
			color: #fff;
			padding: 12px;
			text-align: center;
			color: #fff;
		}
		&-line {
			background-color: #0d1536a9;
			height: 1px;
		}
		&-content {
			color: #fff;
			padding: 12px;
			font-size: 14px;
			&-item {
				&-labelCont {
					color: #fff;
				}
			}
		}
		&-triangle {
			align-self: center;
			width: 0;
			height: 0;
			border-top: 15px solid rgba(29, 54, 68, 0.8);
			border-right: 12px solid transparent;
			border-left: 12px solid transparent;
		}
	}
}

 geojson数据(测试数据  pointLitter.json)

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    114,
                    30
                ]
            },
            "properties": {
                "title": "99",
                "color": "#B9EB14",
                "symbol":"风格独特"
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    114.001,
                    30
                ]
            },
            "properties": {
                "title": "0",
                "symbol": "海角天涯",
                "color": "#D13C3C"
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    114.002,
                    30
                ]
            },
            "properties": {
                "title": "8",
                "symbol": "特别的晚风",
                "marker-size":12,
                "color": "#C49D22"
                
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    114.003,
                    30
                ]
            },
            "properties": {
                "title": "2",
                "symbol": "那年仲夏你背上行囊离开家古道旁我欲语泪先下庙里求签我哭诉青梅等竹马",
                "color": "#8EE3A6"
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    114.004,
                    30
                ]
            },
            "properties": {
                "title": "3",
                "symbol": "似水中月情迷着镜中花竹篱笆木琵琶拱桥月下谁在弹唱思念远方牵挂",
                "color": "#34BE96"
            }
        }
        
    ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/167920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS脚手架:快捷实现ArkTs中json转对象

前言 在上篇《HarmonyOS开发&#xff1a;UI开展前的阶段总结》中提到了未来的规划&#xff0c;既能让大家学会鸿蒙开发&#xff0c;也能让大家在以后的开发中如虎添翼&#xff0c;最终决定&#xff0c;便以脚手架为产出物&#xff0c;结合实际的业务需求&#xff0c;进行相关技…

JS进阶——高阶技巧

1、深浅拷贝 浅拷贝和深拷贝只针对引用类型 1.1 浅拷贝 浅拷贝&#xff1a;拷贝的是地址 如果是简单数据类型拷贝值&#xff0c;应用数据类型拷贝的是地址&#xff08;简单理解&#xff1a;如果是单层对象&#xff0c;没问题&#xff0c;如果有多层就有问题&#xff09; 常…

查询数据库DQL

DQL 查询基本语法 -- DQL :基本语法; -- 1查询指定的字段 name entrydate 并返回select name , entrydate from tb_emp;-- 2 查询 所有字段 并返回select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;-- 2 查询…

15.ORACLE11g的归档方式和日志文件的相关操作

ORACLE11g的归档方式和日志文件的相关操作 一、什么是日志文件1、在线日志文件2、归档日志文件 二、Oracle 11g 归档方式&#xff1a;1、归档方式状态2、归档日志方式下数据库的工作原理3、配置归档日志方式3.1 开启归档模式3.2 日志文件相关操作&#xff1a; 4、oracle11g联机…

#gStore-weekly | gBuilder功能详解之结构化数据抽取

上一个weekly中已经详细讲解了schema的设计&#xff0c;在schema设计好了之后&#xff0c;gBuilder支持将结构化和非结构化数据转化为RDF图数据。其中结构化数据支持数据的无损转化。 1. 技术介绍 gBuilder的结构化数据抽取采用D2RQ技术实现。 DR2Q是一个能够将关系数据库中…

【23真题】很少见!第6题有点新颖!

今天分享的是23年太原理工大学801的信号与系统试题及解析。 本套试卷难度分析&#xff1a;该学校考察数字电路和信号与系统两部分&#xff0c;数字电路我没有知道&#xff0c;所以不知道难度。但是从信号部分来看&#xff0c;考察的知识点非常常见&#xff0c;对信号时域和频域…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

11.16~11.19绘制图表,导入EXCEL中数据,进行拟合

这个错误通常是由于传递给curve_fit函数的数据类型不正确引起的。根据你提供的代码和错误信息&#xff0c;有几个可能的原因&#xff1a; 数据类型错误&#xff1a;请确保ce_data、lg_data和product_data是NumPy数组或类似的可迭代对象&#xff0c;且其元素的数据类型为浮点数。…

Altium Designer 相同模块的布局布线复用-AD

1、利用交互式布线&#xff0c;将两个相同模块的元器件在PCB上分块显示。 在原理图中&#xff0c;框选某一模块电路、按快捷键 TS 切换到PCB编辑界面、工具>器件摆放>在矩形区域内排列&#xff08;可将模块中的器件都集中放置到矩形框内&#xff09;。2、为模块电路添加 …

spring-boot-maven-plugin插件 —— 重新打包命名

如果需要重新打包的 jar 具有与项目的 artifactId 属性定义的本地名称不同的名称&#xff0c;只需使用标准 finalName&#xff0c;如下例所示&#xff1a; <build><!-- 打包重命名&#xff0c;打包后文件名称&#xff1a;项目名 --><finalName>${project.ar…

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具&#xff0c;只要有足够的时间和练习&#xff0c;你就可以创建任何东西。然而&#xff0c;总有改进的余地。许多第三方开发人员已经发布了自己的扩展&#xff0c;也…

课程设计:C++实现哈夫曼编码

功能实现&#xff1a; //1:先计算每个字符的权重//2&#xff1a;构建哈夫曼树//3&#xff1a;得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符 代码实现&#xff1a; // 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //1:先计…

[ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

用css实现原生form中radio单选框和input的hover已经focus的样式

一.问题描述&#xff1a;用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中&#xff0c;一般公司ui都会给效果图&#xff0c;比如单选按钮radio样式&#xff0c;input输入框hover的时候样式&#xff0c;以及focus的时候样式&#xff0c;等等&#…

C++学习笔记——C++ deque和vector的区别

C中的std::deque&#xff08;双端队列&#xff09;和std::vector&#xff08;向量&#xff09;是两种不同的容器类型&#xff0c;它们有以下区别&#xff1a; 内部实现方式不同&#xff1a;std::deque使用了一种双端队列的数据结构&#xff0c;它由多个块&#xff08;chunks&am…

软件外包开发需要注意的问题

软件外包开发是一种常见的业务模式&#xff0c;但在选择和合作外包团队时需要注意一些关键问题&#xff0c;以确保项目的成功和顺利进行。以下是一些在软件外包开发过程中需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 &#x1f94a; Python 什么是 Python&#xff1f; Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

C++ DAY03 类与对象

概述 对象&#xff1a;真实存在的事物 类&#xff1a; 多个对象抽取其共同点形成的概念 静态特征提取出的概念称为成员变量, 又名属性 动态特征提取出的概念称为成员函数, 又名方法 类与对象的关系 在代码中先有类后有对象 一个类可以有多个对象 多个对象可以属于同一个…

HashMap会用就行了?一文解决HashMap的底层问题

前言 我们的手机通讯录之所以能快速定位到特定联系人&#xff0c;就是因为它运用了HashMap底层的原理。手机通讯录将每个联系人的姓名作为键&#xff0c;电话号码作为对应的值&#xff0c;通过这个键值对的方式实现了快速的数据定位和获取。就像你通过关键字快速找到对应的联系…

vue动态配置路由

文章目录 前言定义项目页面格式一、vite 配置动态路由新建 /router/utils.ts引入 /router/utils.ts 二、webpack 配置动态路由总结如有启发&#xff0c;可点赞收藏哟~ 前言 项目中动态配置路由可以减少路由配置时间&#xff0c;并可减少配置路由出现的一些奇奇怪怪的问题 路由…