关于Cesium的常见需求整理之点位和弹窗(点位弹窗)

news2024/11/26 14:46:24

一、点位上图

①在Cesium中,每个自定义的地图元素被视为一个entity对象,如果我们要添加点位到地图上,那就必须先创建一个entity对象。

var entity = new Cesium.Entity({
  position: position,
});

以上代码我们创建了一个entity对象,只需要给予一个坐标参数就可以创建成功。

②但是,仅仅只是一个坐标点在一般情况下是没办法满足我们的需求的,大多数时候我们都需要为我们的点位添加一个icon图标或者点位作为指示。这里就需要用到它另外一个参数,billboard。

// 若是没有配置billboard并且不把这个参数设置为undefined,则可能会显示系统自带的billboard。
var billboard = new Cesium.BillboardGraphics({
  image: 'path/to/image.png',
  scale: 1.0,
  width: 30, // 图标的宽度
  height: 30, // 图标的高度
  depthTest: false, // 禁用深度测试
  disableDepthTestDistance: Number.POSITIVE_INFINITY, // 禁用深度测试
  // 调整图标的位置
  pixelOffset: {
       x: 0,
        y: -12
  }
});
entity.billboard = billboard 

③有时候我们还想在点位图标下方添加简短的文本名称,这个时候可以使用label这个参数

var label = new Cesium.LabelGraphics({
    text: entity.name,
    scale: 0.5,
    pixelOffset: new Cesium.Cartesian2(0, 15), // 调整文本位置偏移
    horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
    fillColor: Cesium.Color.WHITE,
    outlineColor: Cesium.Color.BLACK,
    outlineWidth: 1.0,
    style: Cesium.LabelStyle.FILL_AND_OUTLINE
});
entity.label = label

④至此,常用的点位设置已经完成,最后把点位加到地图中,大功告成。

viewer.entitys.add(entity)

在这里插入图片描述

二、点击弹窗

地图上加了点位之后,虽然显得没那么单调了,但是如果我们跟地图的互动仅仅只有拖动缩放,那可能也是相对死板无趣的,这个时候就可以考虑多添加一些交互事件,譬如点击图标的时候出现弹窗。

这里稍微讲一下加入弹窗的方法和原理。

我们没办法像插入点位那样,把我们的弹窗写成entity直接插入到地图内部,因为entity说到底也是有一定限制的,它大概率不能符合我们插入弹窗的需求。

那既然没办法从内部攻破,我们就在外部进行操作,让弹窗看起来好像就是在地图内部中。

总结起来就是:

1、在浏览器的视图中用绝对定位加入我们的弹窗html元素
2、定义每次点击地图触发的事件,获取到相关经纬度数据,并且判断是否点击到了点位。
3、若是判断是点击到了点位,那么我们就可以获取到点击到的entity的信息。拿到这个信息就可以把对应信息显示在弹窗上。
4、拿到entity的信息里面有经纬度的信息,我们需要把经纬度信息转化成浏览器视图中x,y坐标,这样就可以根据这个坐标来定位我们的弹窗,让弹窗显示在对面点位上方。
5、监听地图的缩放和拖动事件,时刻去改变已显示弹窗的位置,达到视角如何变化,弹窗依旧处于点位上方的效果。

①首先要明白,cesium没有让你把弹窗插到它组件内的渠道,所以我们需要在html代码中添加我们自己的弹窗,还可以自定义样式。

<div class="info_box" ref="infoBox" id="infobox">
      <div class="info_title">
        <img src="../../assets/images/map/u93.svg" alt="" />
        <p>{{ modalData.name }}</p>
        <i class="el-icon-close" @click="closeInfoBox"></i>
      </div>
      <div class="info_body">
        <img src="../../assets/images/map/u94.svg" alt="" />
        <div class="info_content">
          <div
            class="content_line"
            v-for="(val, key, i) in modalData"
            :key="i"
            v-if="key != 'name'"
          >
            <p class="text">{{ key }}</p>
            <p class="val">{{ val }}</p>
          </div>
        </div>
      </div>
    </div>

②上面的代码看看就行了,是我个人的弹窗代码,各位可以根据自己的需求写一个弹窗和弹窗样式。接下来我们可以创建一个infobox对象,这个是cesium自带的对象,可以让我们控制html页面元素的属性。

this.infoBox = new Cesium.InfoBox(document.getElementById("infobox"));

③监听地图点击事件,判断是否点击到了点位。

// 监听 Viewer 的 pick 事件
    this.viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
      // 获取点击的位置
      var pickedObject = that.viewer.scene.pick(movement.position);
      // 判断是否选中了一个实体
      if (Cesium.defined(pickedObject) && pickedObject.id instanceof Cesium.Entity) {
        var entity = pickedObject.id;
        if (entity.position) {
          // 显示弹窗
          that.infoBox.container.style.visibility = 'visible';
          // 获取位置信息
          that.entityPosition = entity.position.getValue(that.viewer.clock.currentTime);
          // 传递数据,由于我定义了一个map.js文件,所以没办法把点位数据直接传递给页面,只能用eventBus传递两个文件的数据
          eventBus.$emit('data-changed', entity.properties)
        } else {
          that.infoBox.container.style.visibility = 'hidden';
        }
      } else {
        // 隐藏弹窗
        that.infoBox.container.style.visibility = 'hidden';
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

④监听拖动和缩放事件,并且时时改变弹窗位置,让弹窗不管如何都一直在点位上方。(这里要注意弹窗元素的层级问题,z-index)

// 监听 Viewer 的 postRender 事件,在地图移动时更新弹窗位置
    this.viewer.scene.postRender.addEventListener(function () {
      try {
        if (that.entityPosition !== null) {
          that.modalSetting()
        }
      } catch (error) {
        console.log(error)
      }
    });

// 弹窗位置设置事件
  modalSetting() {
    let screenPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(this.viewer.scene, this.entityPosition);
    if (screenPosition) {
      let leftOffset = screenPosition.x - this.infoBox.container.clientWidth / 2 + 225;
      let topOffset = screenPosition.y - this.infoBox.container.clientHeight - 20;
      this.infoBox.container.style.left = leftOffset + 'px';
      this.infoBox.container.style.top = topOffset + 'px';
    }
  }

在这里插入图片描述

三、为什么我的点位图标那么模糊?

这是因为cesium像素的设置问题,这里只需要几行代码设置便可以切换到高清画质。

this.viewer.scene.fxaa = false
this.viewer.scene.postProcessStages.fxaa.enabled = false
if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) { //判断是否支持图像渲染像素化处理
  this.viewer.resolutionScale = window.devicePixelRatio;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autosar通信入门系列06-聊聊CAN通信的线与机制与ACK应答

本文框架 1. 概述2. CAN通信的线与机制3. ACK应答机制理解 1. 概述 本文为Autosar通信入门系列介绍&#xff0c;如您对AutosarMCAL配置&#xff0c;通信&#xff0c;诊断等实战有更高需求&#xff0c;可以参见AutoSar 实战进阶系列专栏&#xff0c;快速链接&#xff1a;AutoSa…

数据库基础(增删改查)

目录 MySQL 背景知识 数据库基础操作 1.创建数据库 2.查看所有数据库 3.选中指定的数据库 4.删除数据库 数据库表操作 MySQL的数据类型 1.创建表 3.查看指定表的结构 4.删除表 增删改 新增操作 修改(Updata) 删除语句 面试题 查询操作 指定列查询 查询的列为表达式…

系统设计:通用思路之4S分析法

1.系统设计 系统设计是一个定义系统架构、功能模块、服务及接口和数据存储等满足特定需求的过程。 与面向对象设计不同的是&#xff0c;面向对象设计通常是对于某个特定功能模块的设计&#xff0c;通常要求设计类图关系、接口关系、实现关系等涉及具体代码层面的设计&#xff…

C语言库函数之 qsort 讲解、使用及模拟实现

引入 我们在学习排序的时候&#xff0c;第一个接触到的应该都是冒泡排序&#xff0c;我们先来复习一下冒泡排序的代码&#xff0c;来作为一个铺垫和引入。 代码如下&#xff1a; #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…

基于chatgpt动手实现一个ai_translator

动手实现一个ai翻译 前言 最近在极客时间学习《AI 大模型应用开发实战营》&#xff0c;自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator&#xff0c;在这里简单记录下开发过程和心得体会&#xff0c;供有兴趣的同学参考&#xff1b; ai翻译程序 版本迭代 在学习…

C语言必会题目(2)

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 今天继续分享C语言必会的题目&#xff0c;上一篇文章主要是一些选择题&#xff0c;而今天我们主要内容为编程题的推荐与讲解 准备好迎接下面的题了吗&#xff1f;开始发车了&#xff01;&#xff01;&#xff01; 输入…

pytest运行时参数说明,pytest详解,pytest.ini详解

一、Pytest简介 1.pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有一下几个特点&#xff1a; 简单灵活&#xff0c;容易上手&#xff0c;支持参数化 2.能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium、appium等自动化测试&#xf…

zookeeper案例

目录 案例一&#xff1a;服务器动态上下线 服务端&#xff1a; &#xff08;1&#xff09;先获取zookeeper连接 &#xff08;2&#xff09;注册服务器到zookeeper集群&#xff1a; &#xff08;3&#xff09;业务逻辑&#xff08;睡眠&#xff09;&#xff1a; 服务端代码…

提高生产力 | Apifox 数据结构验证最佳实践

目录 实践场景 定义返回响应 场景数据准备 校验响应数据 总结 在设计接口的过程中&#xff0c;响应数据需要和返回响应规范一一对应。这样能够确保接口的一致性和可靠性&#xff0c;并且方便接口的使用和维护&#xff0c;即使在后续迭代过程中出现问题&#xff0c;开发人员…

zabbix监控安装部署

目录 一、环境 二、配置 1.配置yum源&#xff0c;这里用的清华的 2.过滤一下安装包&#xff0c;查看依赖包 安装依赖包 3.配置数据库 开机自启 创建数据库 创建用户 授权 导入数据到数据库 查看zabbix数据库有没有表和数据 4.修改zabbix配置文件 1.修改zabbix配置…

【Java】常见面试题:多线程

文章目录 1. 谈谈进程和线程之间的区别【高频】2. java中有哪些方式来创建线程&#xff1f;3. run和start的区别【经典面试题】4. Java线程的状态5. 【线程不安全的原因】6. 就以count为例&#xff1a;一个线程加锁、一个线程不加锁&#xff0c;此时能否保证线程的安全呢&#…

client-go实战之十二:选主(leader-election)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go实战》系列的第十二篇&#xff0c;又有一个精彩的知识点在本章呈现&#xff1a;选主(leader-election)在解释什么是选主之前&…

Keepalived源码安装

文章目录 Keepalived源码安装安装准备缺少OpenSSL解决方法 Keepalived 源码安装 安装准备 tar zxf keepalived-2.2.8.tar.gz /root/ ll drwxrwxr-x. 10 1000 1000 4096 Aug 9 18:29 keepalived-2.2.8 #进入目录执行以下命令查看帮助 ./configure --help #重要编译参数 -…

QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板

QT学习笔记-oracle oci数据库驱动交叉编译并移植到RK3568ARM开发板 0、背景1、搭建交叉编译环境2、交叉编译过程3、把数据库驱动部署到目标系统中 0、背景 在上一文《QT学习笔记-QT安装oracle oci驱动》中介绍了在Windows环境下使用QT访问oracle数据库时遇到驱动无法加载问题的…

kingbase:数据库启动状态

1 启停KingbaseES数据库 Linux下通过系统服务&#xff1a; root用户执行&#xff1a; service kingbase8d stop/start/restart ——注册服务的情况下 Linux下通过安装用户&#xff1a; 安装用户执行&#xff1a; sys_ctl stop/start/restart -D data路径 2 查看数据库当…

UI自动化环境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自动化的项目&#xff0c;为此从环境搭建来从0到1&#xff0c;希望能够帮助到你&#xff0c;同时也是自我的梳理。将按照如下进行开展&#xff1a; 1、python的下载、安装&#xff0c;python环境变量的配置。 2、pycharm开发工具的下载安装。 3、selenium的安装。…

【Java】一只小菜坤的编程题之旅【3】

文章目录 1丶判定是否互为字符重排2、杨辉三角3丶某公司的1个面试题&#xff08;字符串包含问题&#xff09; 1丶判定是否互为字符重排 这个题我们用一个非常简单的思想就能实现&#xff0c;我们先将字符串转换为字符数组&#xff0c;然后对字符数组进行排序&#xff0c;然后再…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 892 (Div. 2) 目录 A. United We Stand题目大意思路代码 B. Olya and Game with Arrays题目大意思路代码 C. Another Permutation Problem题目大意思路代码 A. United We Stand 题目大意 给你一个数组&#xff0c;把这个数组分成两个数组a和b&#xff0c;使…

03_013内存分配api以及页表详解

前言 之前文章中物理ram中的最小单位一直用页来表示 这次又描述的详细了点 物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分 不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行 内存分…

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node&#xff08;节点&#xff09;&#xff0c;本文梳理了 Shader Graph 中大部分 Node 的释义&#xff0c;官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程&#xff0c;其背后都是一些列的数学…