实现 Entity实例生命周期和vue组件生命周期融合

news2024/12/23 0:33:33

  • 场景
  • 解决方案
  • 实现方案
  • index.vue
  • 方案解决效果

场景

ceisum中Entity实例的生成和销毁,大部分逻辑和vue代码分离,导致不好阅读和维护

解决方案

ceisum 中实例 Entity 的生命周期,和vue的生命周期’相似’,把两个生命周期结合(把entity封装为vue组件)

实现方案

  1. vue中 template 中内容可以放置 弹框的内容,通过ceisum 获取屏幕坐标,进行渲染
  2. 通过代码逻辑使 vue组件的 mountedbeforeDestroy 来和 entity 实例的生成 add,和销毁destroy 相关联
  3. 通过 Cesium.ScreenSpaceEventHandler 关联vue组件的方法实现交互

index.vue

采用原生cesium 实现entity的弹窗,并封装为vue组件

<!--/**
 * @author: liuk
 * @date: 2023/8/10
 * @describe: 小区视角
 * @email:1229223630@qq.com
*/-->
<template>
  <div>
    <div class="heat-info" v-if="showPopup" :style="{top:popupPos.top,left:popupPos.left}">
      <div class="name">小区</div>
      {{showPopup}}
      <div class="bottom_div">
        <div>
          <div class="num">20.3&nbsp;<span></span></div>
          <div style="margin-top: 6px;">均温</div>
        </div>
        <div>
          <div class="num">92.9&nbsp;<span>%</span></div>
          <div style="margin-top: 6px;">室温</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import communityList from "../data/community.json"

let heatDatasource, preSelEntity,handler
export default {
  data(){
    return {
      showPopup: false,
      popupPos: {
        left: 0,
        top: 0
      },
    }
  },
  methods:{
    addEntity() {
      let features = communityList.features || [];
      features.forEach(el => {
        let pos = Cesium.Cartesian3.fromDegreesArray(el.geometry.coordinates[0].map(el1 => {
          return el1.join(',')
        }).join(',').split(',').map(Number));
        let boundingSphere = new Cesium.BoundingSphere.fromPoints(pos);
        let center = boundingSphere.center;
        heatDatasource.entities.add({
          position: center,
          customType: "communityEntity",
          label: {
            text: el.properties.name,
            disableDepthTestDistance: Number.POSITIVE_INFINITY,
            horizontalOrigin: Cesium.HorizontalOrigin.Top,
            scaleByDistance: new Cesium.NearFarScalar(2000, 1, 500000, 0.1)
          },
          show: true,
          polygon: {
            hierarchy: new Cesium.PolygonHierarchy(pos),
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            material: Cesium.Color.fromCssColorString("white").withAlpha(0),
          },
          polyline: {
            show: true,
            positions: pos,
            width:1.5,
            material: Cesium.Color.fromCssColorString("#C0C0C0").withAlpha(0.5),
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
          }
        });
      })
    },
    onMouseClick(movement){
      var preSelEntity = window.dasViewer.scene.pick(movement.position);
      if (!Cesium.defined(preSelEntity) || !Cesium.defined(preSelEntity.id)) return;
      var entity = preSelEntity.id;
      if (!(entity instanceof Cesium.Entity) || entity.customType !== "communityEntity") return;
      window.dasViewer.camera.flyTo({
        destination: Cesium.Rectangle.fromCartesianArray(entity.polygon.hierarchy.getValue().positions),
        complete: () => {
          this.$emit('hideCommunityEntity')
        }
      });
    },
    onMouseMove(movement){
      var pickedObject = window.dasViewer.scene.pick(movement.endPosition);
      if (!Cesium.defined(pickedObject) || !Cesium.defined(pickedObject.id)) {
        this.resetSelectedEntity();
        return;
      }
      var entity = pickedObject.id;
      if (!(entity instanceof Cesium.Entity) || entity.customType !== "communityEntity") {
        this.resetSelectedEntity();
        return;
      }
      if (entity !== preSelEntity) {
        this.resetSelectedEntity();
        entity.polygon.material = Cesium.Color.fromCssColorString("white").withAlpha(0.1);
        entity.polyline.material = Cesium.Color.fromCssColorString("white").withAlpha(1);
      }
      preSelEntity = entity;
      this.showPopupBox(movement.endPosition);
    },
    onMouseLeave(){
      this.showPopup = false
    },
    resetSelectedEntity(){
      if (preSelEntity) {
        this.showPopup = false
        preSelEntity.polygon.material = Cesium.Color.fromCssColorString("white").withAlpha(0);
        preSelEntity.polyline.material = Cesium.Color.fromCssColorString("#C0C0C0").withAlpha(0.5);
        preSelEntity = null;
      }
    },
    showPopupBox(movement){
      this.showPopup = true
      this.popupPos.left = `${movement.x + 10}px`;
      this.popupPos.top = `${movement.y + 10}px`;
    }
  },
  mounted(){
    const self = this
    heatDatasource = new Cesium.CustomDataSource("community");
    window.dasViewer.dataSources.add(heatDatasource);
    this.addEntity()
    handler = new Cesium.ScreenSpaceEventHandler(window.dasViewer.scene.canvas);
    handler.setInputAction(self.onMouseClick, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    handler.setInputAction(self.onMouseMove, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    handler.setInputAction(self.onMouseLeave, Cesium.ScreenSpaceEventType.MOUSE_LEAVE);
  },
  beforeDestroy() {
    handler.destroy()
    window.dasViewer.dataSources.remove(heatDatasource);
  }
}
</script>


<style lang="less" scoped>
.heat-info {
  position: absolute;
  width: 196px;
  min-height: 124px;
  padding: 12px;
  border: 1px solid rgba(85, 85, 85, 1);
  box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5);
  border-radius: 4px;
  background-color: rgba(0, 0, 0, 0.8);
  color: #fff;
  z-index: 9999;
  pointer-events: none;

  .name {
    font-family: PingFangSC-Medium;
    font-size: 16px;
    color: #FFFFFF;
    letter-spacing: 0;
    font-weight: 500;
    margin-top: 5px;
  }

  .bottom_div {
    display: flex;
    position: relative;
    justify-content: space-between;
    font-size: 12px;
    color: #A2A3A3;
    letter-spacing: 0;
    font-weight: 400;
    font-family: PingFangSC-Regular;
    margin-top: 21px;

    .num {
      font-size: 20px;
      color: #FFFFFF;
      letter-spacing: 0;
      line-height: 16px;
      font-weight: 400;

      span {
        font-size: 12px;
        color: #FFFFFF;
        letter-spacing: 0;
        font-weight: 200;
        color: #A2A3A3;
      }
    }

  }
}
</style>

方案解决效果

在这里插入图片描述

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

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

相关文章

软件设计师学习笔记8-操作系统+进程

目录 1.操作系统 1.1操作系统层次图 1.2操作系统的作用 1.3操作系统的任务 2.特殊的操作系统 3.进程 3.1进程的概念 3.2进程与程序 3.3进程与线程 3.4进程的状态 3.4.1三态模型 3.4.2基于三态模型的五态模型 1.操作系统 1.1操作系统层次图 该图片来自希赛软考 1.…

港陆证券:9月券商金股名单大曝光,“宁王”霸气回归居榜首!

9月金股来袭&#xff0c;37家券商算计引荐273股&#xff0c;其中60股获2家及以上组织引荐。 9月主线行情怎么看 梳理券商9月“金股”策略发现&#xff0c;组织普遍以为当前商场处于底部区域&#xff0c;装备方向上&#xff0c;大都券商主张重视新能源、科技板块&#xff0c;还…

敦煌网、Jumia等跨境电商平台怎么测评(补单)留评?

评论的重要性是众所周知的&#xff0c;对于想要做卖家运营的人来说&#xff0c;它直接影响着产品的销量和排名 那么如何通过自养号测评来提升销量和排名呢&#xff1f; 我相信大家对这个问题已经有了一定的了解&#xff0c;拥有大量自养号可以通过这些号来通过关键词搜索、浏…

【广州华锐互动】智能变电站AR仿真实训系统大大提高培训的效率和质量

随着电力行业的不断发展&#xff0c;变电站的建设和运维变得越来越重要。传统的变电站运维培训方式存在着诸多问题&#xff0c;如难以真实模拟变电站运行环境、信息传递不及时、难以掌握实际操作技能等问题。而智能变电站AR仿真实训系统可以为变电站运维人员带来全新的培训方式…

git:一些撤销操作

参考自 如何撤销 Git 操作&#xff1f;[1] 一、撤销提交 git revert HEAD 撤销上次提交. (会在当前提交后面&#xff0c;新增一次提交&#xff0c;抵消掉上一次提交导致的所有变化,所有记录都会保留) 二、撤销某次merge git merge --abort 三、替换上一次提交 git commit --ame…

微信小程序 通过响应式数据控制元素class属性

我想大家照这个和我最初的目的一样 希望有和vue中v-bind:class一样方便的指令 但答案不太尽人意 这里 我们只能采用 三元运算符的形式 参考代码如下 <view class"item {{ userId item.userId ? isThisUser : }}"> </view>这里 我们判断 如果当前ite…

知识储备--基础算法篇-矩阵

2.矩阵 2.1第54题螺旋矩阵 第一题上来就跪了&#xff0c;看了官方答案感觉不是很好理解&#xff0c;找了一个比较容易理解的。 class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""…

采购人员的电子元器件市场洞察力

采购人员在电子元器件市场中需要具备一定的洞察力&#xff0c;以帮助他们做出明智的决策、管理供应链和确保采购的元器件符合要求。以下是一些关于采购人员在电子元器件市场中应具备的洞察力方面的重要考虑因素&#xff1a; 市场趋势分析&#xff1a; 采购人员需要密切关注电子…

FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因

分析&#xff1a;Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示&#xff0c;你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围&#xff0c;一旦你这个中断触发&#xff0c;断言的信息即你串口就会输出这个条语句&#xff08;前提你串口…

Linux CentOS7 awk的反转功能

处理文本文件&#xff0c;经常会遇到反向输出的要求。 可用命令rev对待处理的文件或标准输入快速完成。 可用命令tac对文件快速完成反向查看。 而对行中字符串(单词)可借助其他命令达到反向输出的目标。 我们在文章《Linux CentOS7sed的替换及逆转功能》讨论了sed流编辑器对…

手写Mybatis:第13章-通过注解配置执行SQL语句

文章目录 一、目标&#xff1a;注解配置执行SQL二、设计&#xff1a;注解配置执行SQL三、实现&#xff1a;注解配置执行SQL3.1 工程结构3.2 注解配置执行SQL类图3.3 脚本语言驱动器3.3.1 脚本语言驱动器接口3.3.2 XML语言驱动器 3.4 注解配置构建器3.4.1 定义增删改查注解3.4.2…

Apple Watch 9或使用粘结剂喷射金属3D打印生产表壳

包括路透社在内的众多报道表明&#xff0c;苹果公司目前正在测试用于批量生产Apple Watch Series 9表壳的粘结剂喷射金属3D打印技术&#xff0c;该产品将于9月12日发布。报告称&#xff0c;该生产技术将不再需要将金属部件切割成产品形状&#xff0c;从而减少了产品制造所需的时…

股票交易与先胜而后战

胜在敌败在己&#xff0c;出自《孙子兵法》形篇。 孙子曰&#xff1a;昔之善战者&#xff0c;先为不可胜&#xff0c;以待敌之可胜。不可胜在己&#xff0c;可胜在敌。故善战者&#xff0c;能为不可胜&#xff0c;不能使敌之可胜。故曰&#xff1a;胜可知而不可为。 以前的文章…

接口自动化测试系列-登陆态问题方案

cookie实例 session requests.session()#验证码&#xff0c;我们测试环境用的万能验证码validate_code 1234# 获取登录认证SID#url地址url_login f"http://ops-web-{env}/login.jsp"#获取cookie,并转换成json格式sid requests.get(urlurl_login).cookies.get_dic…

【MySQL】6、MySQL主从复制与读写分离

6.NULL值 select length(null),length(),length(123);null 为空值&#xff0c;但也会占用空间&#xff1b;NULL不会被统计记录不占用空间&#xff0c;但会被统计记录什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT…

贷款公司如何精准获客,大数据获客

近年来&#xff0c;贷款中介机构在金融服务领域发挥着越来越重要的作用。随着时代的发展&#xff0c;贷款中介机构不仅是贷款服务的提供者&#xff0c;也是能够帮助客户更准确获取客户的服务提供者。 为此&#xff0c;贷款中介机构应把握以下几个方面。 首先&#xff0c;贷款…

自动化与人工智能:‘爱校对’在政府网站巡检中的应用与局限性

在当今数字化时代&#xff0c;自动化和人工智能技术正逐渐渗透到各个领域&#xff0c;政府网站巡检也不例外。"爱校对"等自动化文本校对工具在政府网站巡检中具有许多应用&#xff0c;但同时也存在一些局限性。 应用方面&#xff1a;提高效率&#xff1a; 自动化文本…

Proxifier配置两次代理

proxifier配置两次代理。以前只会配置一次代理&#xff0c;然后在某个环境中&#xff0c;需要进行多级跳转&#xff0c;先登录跳板机A机器&#xff0c;然后从A机器跳转到B机器&#xff0c;网址ip1需要通过机器B的代理访问。 代理方式&#xff1a;配置两下就行了&#xff0c;如…

LeetCode 2511 最多可以摧毁的敌人城堡数目

LeetCode 2511 最多可以摧毁的敌人城堡数目 力扣题目链接&#xff1a;力扣题目链接 给你一个长度为 n &#xff0c;下标从 0 开始的整数数组 forts &#xff0c;表示一些城堡。forts[i] 可以是 -1 &#xff0c;0 或者 1 &#xff0c;其中&#xff1a; -1 表示第 i 个位置 没…

“一个都不能死”在线小游戏源代码

这款名为”一个都不能死”的网页在线小游戏是一款自适应PC和手机的网页游戏。你只需要准备一台服务器或主机&#xff0c;将游戏文件解压并上传到服务器上&#xff0c;就可以开始游戏了。 如果需要进行一些文字内容的修改&#xff0c;你可以在js/main.js文件中进行相应的修改。…