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

一、点位上图

①在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.mfbz.cn/a/71964.html

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

相关文章

Python Opencv实践 - 图像缩放

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg_cat cv.imread("../SampleImages/cat.jpg", cv.IMREAD_COLOR) plt.imshow(img_cat[:,:,::-1])#图像绝对尺寸缩放 #cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) #指定Size大…

CANoe自动化工程的搭建

基于XMLCAPL建立自动化工程 1、导入ini文件2、新建 Test Environment3、报告类型4、代码编写 1、导入ini文件 工程的配置的文件&#xff0c;配置DUT相关信息&#xff0c;具体视工程而编写内容。 2、新建 Test Environment 1、新建XML测试用例环境 2、导入XML测试用例文件 …

关于Neo4j的使用及其基本命令

关于Neo4j的使用 文章目录 关于Neo4j的使用1、启动方式2、创建新节点&#xff0c;节点内有属性3、创建关系4、查询节点5、查询关系6、删除两个节点的关系7、删除节点8、删除某个标签的全部关系9、某个节点添加属性10、删除节点某个属性 1、启动方式 进入bin目录&#xff1a; …

Web 服务器 -【Tomcat】的简单学习

Tomcat1 简介1.1 什么是Web服务器 2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署 3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目 4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件 Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是…

Neo4j笔记-数据迁移(导出/导入)

这里先说明以下几点&#xff1a; Neo4j在4.0下版本默认的库名是&#xff1a;graph.db Neo4j在4.0上版本默认的库名是&#xff1a;neo4j.db 不管是Neo4j&#xff0c;还是Neo4j Desktop&#xff0c;都会在bin目录下有neo4j、neo4j-admin软件。在conf目录下&#xff0c;有neo4j.…

unity实现角色体力功能【体力条+体力计算】

导读&#xff1a;实现功能 1、角色体力计算 2、角色疲劳动画 3、体力条制作、跟随 默认做好角色的idle/run/walk动画、切换和玩家输入&#xff0c;我使用的是新输入系统&#xff0c;动画时单变量混合树&#xff0c;参数Sports。 【每一部分功能根据自己需求观看哦】 1、角色体…

科研论文中SCI,SSCI ,CSSCI是什么

目录 1 SCI 2 SSCI 3 CSSCI 什么是SCI&#xff0c;SSCI &#xff0c;CSSCI 目前&#xff0c;在国际科学界&#xff0c;如何正确评价基础科学研究成果已引起越来越广泛的关注。而被SCI、SSCI收录的科技论文的多寡则被看作衡量一个国家的基础科学研究水平、科技实力和科技论文…

HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验

华为开发者大会2023&#xff08;HDC.Together&#xff09;于8月4日至6日在东莞松山湖举行&#xff0c;在HarmonyOS端云开放能力技术分论坛上&#xff0c;华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处&#xff0c;通过将常见的通用能…

市面上最好用的4款免费ETL工具推荐

一、ETL介绍 ETL流程是数据仓库建设的核心环节&#xff0c;它涉及从各种数据源中抽取数据&#xff0c;经过清洗、转换和整合&#xff0c;最终加载到数据仓库中以供分析和决策。在数据仓库国产化的背景下&#xff0c;ETL流程扮演着重要的角色&#xff0c;今天我们就来讲讲ETL流…

MATLAB算法实战应用案例精讲-【图像处理】图像分类模型Swin TrasnformerViT

目录 Swin Trasnformer 1. 模型介绍 2. 模型结构 3. 模型实现 4. 模型特点 5. 模型效果 ViT( Vision Transformer) 模型介绍 模型结构与实现 1. 图像分块嵌入 2. 多头注意力 3. 多层感知机&#xff08;MLP&#xff09; 4. DropPath 5. 基础模块 6. 定义ViT网络 …

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

TCP和UDP

目录 TCP和UDP是什么&#xff1f; TCP和UDP有什么区别? 三次握手和四次挥手 解决大量TIME_WAIT问题的核心方法 TCP维护可靠的通信方式 TCP协议的长连接和短连接 长连接的保活机制 Syn泛洪攻击 拥塞控制 滑动窗口的原理 什么是粘包以及粘包的原因 粘包的处理方式 …

centos7使用yum安装gcc8

1 概述 cenots7自带的gcc版本为4.8.5&#xff0c;不方便编译一些软件&#xff0c;需要将gcc升级。升级gcc可以通过源码编译安装&#xff0c;也可以通过yum等软件管理工具来进行安装&#xff0c;本文介绍通过yum软件来安装gcc。 2 安装过程 2.1 安装scl源 yum install -y c…

IntelliJ IDEA快捷键大全

文章目录 1、构建/编译2、文本编辑3、光标操作4、文本选择5、代码折叠6、辅助编码7、上下文导航8、查找操作9、符号导航10、代码分析11、运行和调试12、代码重构13、全局 CVS 操作14、差异查看器15、工具窗口 本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&…

docker案例复现

$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试&#xff0c;需要我们有一定的环境&#xff0c;也就是需要大家去安装docker 更新系统软件包&#xff1a; sudo yum update 安装 Docker 的依赖软件包&#xff1a; sudo yum …

数据结构-队列(C语言的简单实现)

简介 队列也是一种数据结构&#xff0c;队列也可以用来存放数字每次只能向队列里将入一个数字&#xff0c;每次只能从队列里获得一个数字在队列中&#xff0c;允许插入的一段称为入队口&#xff0c;允许删除的一段称为出队口它的原则是先进先出(FIFO: first in first out)&…

ubuntu磁盘管理

show partition information 挂载设备在这 显示文件系统信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用&#xff1a;将/dev/nvme0n1p4 格式化为 ext4 建立交换分区 mkswap -c -v1 /dev/nvme0n1p4 102400-c&#xff1a;check -v1&#xff1a;新版交换分区 -v0&…

ESP32-连接参数/间隔更新

连接间隔的设置是一个协商的过程&#xff0c;ESP32提供了一些协商的接口&#xff0c;按顺序分析一下。 Step 1&#xff1a;首先是Client连接时对Server要求的连接间隔&#xff08;确定值&#xff09; 在连接的时候&#xff0c;Client会把当前的连接间隔发送给Server。在Serve…

【腾讯云 Cloud studio 实战训练营】云端 IDE 构建移动端H5

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…
最新文章