当前位置: 首页 > news >正文

【mars3d】 graphic.bindPopup(inthtml).openPopup()无需单击小车,即可在地图上自动激活弹窗的效果。

实现效果:new mars3d.graphic.FixedRoute({无需单击小车,即可在地图上实现默认打开弹窗的激活效果。↓↓↓↓↓↓↓↓

相关链接说明:

1.popup的示例完全开源,可参考:功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技

2.绑定的矢量数据上的弹框通过代码默认激活打开参考:功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技

3.实现逻辑:在该矢量数据上bindPopup(),bindPopup之后再该小车数据上openPopup()

4.api说明:

BaseGraphic - V3.7.0 - Mars3D API文档

BaseGraphic - V3.7.0 - Mars3D API文档

相关演示代码:

import * as mars3d from "mars3d"

export let map // mars3d.Map三维地图对象

export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中

let graphicLayer

// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)

export const mapOptions = {

  scene: {

    center: { lat: 30.836861, lng: 116.044673, alt: 1395, heading: 14, pitch: -42 }

  },

  control: {

    clockAnimate: true, // 时钟动画控制(左下角)

    timeline: true, // 是否显示时间线控件

    compass: { top: "10px", left: "5px" }

  }

}

/**

 * 初始化地图业务,生命周期钩子函数(必须)

 * 框架在地图初始化完成后自动调用该函数

 * @param {mars3d.Map} mapInstance 地图对象

 * @returns {void} 无

 */

export function onMounted(mapInstance) {

  map = mapInstance // 记录map

  map.toolbar.style.bottom = "55px" // 修改toolbar控件的样式

  // 创建矢量数据图层

  graphicLayer = new mars3d.layer.GraphicLayer()

  map.addLayer(graphicLayer)

  // 加载完成在加载小车,否则地形未加载完成,小车会处于地下

  map.on(mars3d.EventType.load, function (event) {

    addGraphicLayer()

  })

}

/**

 * 释放当前地图业务的生命周期函数

 * @returns {void} 无

 */

export function onUnmounted() {

  map = null

}

function addGraphicLayer() {

  const fixedRoute = new mars3d.graphic.FixedRoute({

    name: "贴地表表面漫游",

    speed: 160,

    positions: [

      [116.043233, 30.845286, 392.48],

      [116.046833, 30.846863, 411.33],

      [116.052137, 30.848801, 439.45],

      [116.060838, 30.850918, 442.91],

      [116.069013, 30.852035, 435.14],

      [116.18739, 30.854441, 244.53],

      [116.205214, 30.859332, 300.96]

    ],

    clockLoop: false, // 是否循环播放

    camera: {

      type: "gs",

      pitch: -30,

      radius: 500

    },

    // model: {

    //   show: true,

    //   url: '//data.mars3d.cn/gltf/mars/qiche.gltf',

    //   scale: 0.2,

    //   minimumPixelSize: 50,

    // },

    model: {

      url: "//data.mars3d.cn/gltf/mars/jingche/jingche.gltf",

      heading: 90,

      mergeOrientation: true, // 用于设置模型不是标准的方向时的纠偏处理,在orientation基础的方式值上加上设置是heading值

      minimumPixelSize: 50

    },

    polyline: {

      color: "#ffff00",

      width: 3

    }

  })

  graphicLayer.addGraphic(fixedRoute)

  // 绑定popup

  bindPopup(fixedRoute)

  fixedRoute.on(mars3d.EventType.start, function (event) {

    console.log("漫游开始start")

  })

  fixedRoute.on(mars3d.EventType.end, function (event) {

    console.log("漫游结束end")

  })

  // ui面板信息展示

  fixedRoute.on(mars3d.EventType.change, (event) => {

    // const popup = event.graphic.getPopup()

    // const container = popup?.container // popup对应的DOM

    // console.log("漫游change", event)

    throttled(eventTarget.fire("roamLineChange", event), 500)

  })

  map.on(mars3d.EventType.keydown, function (event) {

    // 空格 切换暂停/继续

    if (event.keyCode === 32) {

      if (fixedRoute.isPause) {

        fixedRoute.proceed()

      } else {

        fixedRoute.pause()

      }

    }

  })

  // 不贴地时,直接开始

  // startFly(fixedRoute)

  // 需要计算贴地点时,异步计算完成贴地后再启动

  showLoading()

  fixedRoute.autoSurfaceHeight().then(function (e) {

    hideLoading()

    startFly(fixedRoute)

  })

}

function startFly(fixedRoute) {

  fixedRoute.start()

  fixedRoute.openPopup() // 显示popup

  addParticleSystem(fixedRoute.property)

}

function bindPopup(fixedRoute) {

  fixedRoute.bindPopup(

    `<div style="width: 200px">

      <div>总 距 离:<span id="lblAllLen"> </span></div>

      <div>总 时 间:<span id="lblAllTime"> </span></div>

      <div>开始时间:<span id="lblStartTime"> </span></div>

      <div>剩余时间:<span id="lblRemainTime"> </span></div>

      <div>剩余距离:<span id="lblRemainLen"> </span></div>

    </div>`,

    { closeOnClick: false }

  )

  // 刷新局部DOM,不影响popup面板的其他控件操作

  fixedRoute.on(mars3d.EventType.postRender, function (event) {

    const container = event.container // popup对应的DOM

    const params = fixedRoute?.info

    if (!params) {

      return

    }

    const lblAllLen = container.querySelector("#lblAllLen")

    if (lblAllLen) {

      lblAllLen.innerHTML = mars3d.MeasureUtil.formatDistance(params.distance_all)

    }

    const lblAllTime = container.querySelector("#lblAllTime")

    if (lblAllTime) {

      lblAllTime.innerHTML = mars3d.Util.formatTime(params.second_all / map.clock.multiplier)

    }

    const lblStartTime = container.querySelector("#lblStartTime")

    if (lblStartTime) {

      lblStartTime.innerHTML = mars3d.Util.formatDate(Cesium.JulianDate.toDate(fixedRoute.startTime), "yyyy-M-d HH:mm:ss")

    }

    const lblRemainTime = container.querySelector("#lblRemainTime")

    if (lblRemainTime) {

      lblRemainTime.innerHTML = mars3d.Util.formatTime((params.second_all - params.second) / map.clock.multiplier)

    }

    const lblRemainLen = container.querySelector("#lblRemainLen")

    if (lblRemainLen) {

      lblRemainLen.innerHTML = mars3d.MeasureUtil.formatDistance(params.distance_all - params.distance) || "完成"

    }

  })

}

//  添加尾气粒子效果

function addParticleSystem(property) {

  const particleSystem = new mars3d.graphic.ParticleSystem({

    position: property,

    style: {

      image: "./img/particle/smoke.png",

      particleSize: 12, // 粒子大小(单位:像素)

      emissionRate: 20.0, // 发射速率 (单位:次/秒)

      pitch: 40, // 俯仰角

      maxHeight: 1000, // 超出该高度后不显示粒子效果

      startColor: Cesium.Color.GREY.withAlpha(0.7), // 开始颜色

      endColor: Cesium.Color.WHITE.withAlpha(0.0), // 结束颜色

      startScale: 1.0, //  开始比例(单位:相对于imageSize大小的倍数)

      endScale: 5.0, // 结束比例(单位:相对于imageSize大小的倍数)

      minimumSpeed: 1.0, // 最小速度(米/秒)

      maximumSpeed: 4.0 // 最大速度(米/秒)

    },

    attr: { remark: "车辆尾气" }

  })

  graphicLayer.addGraphic(particleSystem)

}

// ui层使用

export const formatDistance = mars3d.MeasureUtil.formatDistance

export const formatTime = mars3d.Util.formatTime

// 节流

function throttled(fn, delay) {

  let timer = null

  let starttime = Date.now()

  return function () {

    const curTime = Date.now() // 当前时间

    const remaining = delay - (curTime - starttime)

    // eslint-disable-next-line @typescript-eslint/no-this-alias

    const context = this

    // eslint-disable-next-line prefer-rest-params

    const args = arguments

    clearTimeout(timer)

    if (remaining <= 0) {

      fn.apply(context, args)

      starttime = Date.now()

    } else {

      timer = setTimeout(fn, remaining)

    }

  }

}

备注说明:

1.直接通过new mars3d.graphic.ModelEntity({相关矢量上绑定再激活也可以,关键代码:

  graphic.bindPopup(inthtml).openPopup()

实现链接:

功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技

实现代码参考:

function addDemoGraphic1(graphicLayer) {

  const graphic = new mars3d.graphic.ModelEntity({

    name: "警车",

    position: [116.346929, 30.861947, 401.34],

    style: {

      url: "//data.mars3d.cn/gltf/mars/jingche/jingche.gltf",

      scale: 20,

      minimumPixelSize: 50,

      heading: 90,

      distanceDisplayCondition: true,

      distanceDisplayCondition_near: 0,

      distanceDisplayCondition_far: 10000,

      distanceDisplayPoint: {

        // 当视角距离超过一定距离(distanceDisplayCondition_far定义的) 后显示为点对象的样式

        color: "#00ff00",

        pixelSize: 8

      },

      label: {

        text: "我是原始的",

        font_size: 18,

        color: "#ffffff",

        pixelOffsetY: -50,

        distanceDisplayCondition: true,

        distanceDisplayCondition_far: 10000,

        distanceDisplayCondition_near: 0

      }

    },

    attr: { remark: "示例1" }

  })

  graphicLayer.addGraphic(graphic)

  // 演示个性化处理graphic

  initGraphicManager(graphic)

}

// 也可以在单个Graphic上做个性化管理及绑定操作

function initGraphicManager(graphic) {

  const inthtml = `<table style="width: auto;">

            <tr>

              <th scope="col" colspan="2" style="text-align:center;font-size:15px;">我是graphic上绑定的Popup </th>

            </tr>

            <tr>

              <td>提示:</td>

              <td>这只是测试信息,可以任意html</td>

            </tr>

          </table>`

  graphic.bindPopup(inthtml).openPopup()


 

}

相关文章:

【mars3d】 graphic.bindPopup(inthtml).openPopup()无需单击小车,即可在地图上自动激活弹窗的效果。

实现效果&#xff1a;new mars3d.graphic.FixedRoute({无需单击小车&#xff0c;即可在地图上实现默认打开弹窗的激活效果。↓↓↓↓↓↓↓↓ 相关链接说明&#xff1a; 1.popup的示例完全开源&#xff0c;可参考&#xff1a;功能示例(Vue版) | Mars3D三维可视化平台 | 火星科…...

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许&#xff0c;位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾&#xff0c;共造成7人死亡。这次火灾提醒我们工业安全至关重要&#xff0c;企业都应该时刻保持警惕&#xff0c;加强安全意识和培训&#xff0c;提高应对突发事件的…...

【并发编程】synchornized原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下&#xff1a; 注意&#xff1a; 原理之synchornized 轻量…...

计算机网络-ACL访问控制列表

上一篇介绍NAT时候就看到了ACL这个东西了&#xff0c;这个是什么意思&#xff1f;有什么作用呢&#xff1f; 一、ACL访问控制列表 访问控制列表 (ACL, Access Control List)是由一系列permit或deny语句组成的、有序规则的列表。ACL是一个匹配工具&#xff0c;能够对报文进行匹配…...

论文学习记录之SeisInvNet(Deep-Learning Inversion of Seismic Data)

目录 1 INTRODUCTION—介绍 2 RELATED WORKS—相关作品 3 METHODOLOGY AND IMPLEMENTATION—方法和执行 3.1 方法 3.2 执行 4 EXPERIMENTS—实验 4.1 数据集准备 4.2 实验设置 4.3 基线模型 4.4 定向比较 4.5 定量比较 4.6 机理研究 5 CONCLUSION—结论 1 INTRODU…...

深度学习中的优化方法

深度学习中的优化问题通常指的是:寻找神经网络上的一组参数 θ \theta θ,它能显著地降低代价函数 J ( θ ) J(\theta) J(θ...

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”&#xff1f;1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用&#xff0c;能够让开发和重构同步进行&#xff0c;不互相干扰。 3. 模块化4. 其他设计思想和原则4.…...

Spring MVC学习之——Controller类中方法的返回值

Controller类中方法的返回值 1.返回ModelAndView RequestMapping("/hello")public ModelAndView hello(){//封装了页面和数据ModelAndView view new ModelAndView();//对这个请求的页面添加属性&#xff08;数据&#xff09;view.addObject("hello",&quo…...

IDEA中启动项目报堆内存溢出或者没有足够内存的错误

1.报错现象 java.lang.OutOfMemoryError: Java heap space 或者 Could not reserve enough space for object heap 2.解决办法 在运行配置中VM选项后加下面的配置&#xff1a; -server -XX:MaxHeapSize256m -Xms512m -Xmx512m -XX:PermSize128M -XX:MaxPermSize256m 3.JVM虚…...

Angular: DOCUMENT

不用原生的 document&#xff0c;是因为不利于后端渲染&#xff0c;所以避免使用原生浏览器的对象 import { DOCUMENT } from angular/common; import { Directive, Inject, Input, OnChanges, Output, Renderer2, SimpleChanges } from angular/core;Directive({selector: [a…...

mybatis-plus批量保存异常及效率优化

最近基于自己公司内部服务维护&#xff0c;发现其中调度中心近期出现不少错误日志&#xff0c;但是该任务却是正常执行&#xff0c;生成的报表数据也是正常的&#xff0c;所以很多天没有发现问题 这就匪夷所思了&#xff0c; 经仔细排查发现&#xff0c;是触发了feign超时hyst…...

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…...

乐观锁与悲观锁:高并发场景下的选择

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

vue2 省市区联动组件封装

在element ui中有级联选择器el-cascader,其实已经够用了,但是在实际需求中,发现el-cascader如果有三级,数据数组必须得三个才能完全展示,所以不符合实际需求,还是自定义封装吧 需求:省市区联动数组,有多少个显示多少个 这里使用element ui得el-select组件,思路是使用…...

VScode远程开发

VScode远程开发 在SSH远程连接一文中&#xff0c;我么介绍了如何使用ssh远程连接Jetson nano端&#xff0c;但是也存在诸多不便&#xff0c;比如:编辑文件内容时&#xff0c;需要使用vi编辑器&#xff0c;且在一个终端内&#xff0c;无法同时编辑多个文件。本节将介绍一较为实用…...

芯片设计重要工具—— IBM LSF 分布式高性能计算调度平台

IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM Spectrum LSF 的集群供应和配置资源。 借助我们针对任务关键型 HPC 环境的集成解决方案&#xff0…...

RDMA Scatter Gather List详解

1. 前言 在使用RDMA操作之前&#xff0c;我们需要了解一些RDMA API中的一些需要的值。其中在ibv_send_wr我们需要一个sg_list的数组&#xff0c;sg_list是用来存放ibv_sge元素&#xff0c;那么什么是SGL以及什么是sge呢&#xff1f;对于一个使用RDMA进行开发的程序员来说&#…...

【动态规划】24子数组系列_最长湍流子数组_C++

题目链接&#xff1a;最长湍流子数组 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求返回 arr 的 最大湍流子数组的长度 由题可得&#xff1a; 如果比较符号在子数组中的…...

fastJson和jackson的日期数据处理

目录 1.jackson 2.fastjson 3.总结 1.jackson jackson是spring mvc默认的JSON解析方法&#xff0c;前端的数据序列化处理之后&#xff0c;后端经过反序列化处理可以直接使用实体对象进行接收。后端接口返回实体对象&#xff0c;经过序列化处理后前端可以接收并进行处理。 …...

书生·浦语大模型实战营第五节课笔记及作业

LMDeploy 大模型量化部署实践 1 大模型部署背景 1.1 模型部署及大模型特点 1.2 大模型部署挑战及方案 2 LMDeploy简介 2.1 核心功能-量化 2.2 核心功能-推理引擎TurboMind 2.1 核心功能-推理服务api server 3 动手实践及作业 按照文档LMDeploy 的量化和部署中的步骤在Intern…...

编译期AI推理成为可能?C++27 constexpr增强深度解析,含Clang 19/MSVC 17.10实测基准数据,立即升级避坑指南

第一章&#xff1a;C27 constexpr函数增强的演进脉络与核心动机C27 对 constexpr 函数的扩展并非孤立演进&#xff0c;而是对自 C11 引入 constexpr、经 C14 放宽语义、C17 支持 if/switch 和局部变量、C20 引入 constexpr new/allocator 与虚拟函数等关键里程碑的系统性收敛与…...

Nanbeige像素冒险聊天终端:从start.sh到supervisorctl的完整使用流程

Nanbeige像素冒险聊天终端&#xff1a;从start.sh到supervisorctl的完整使用流程 1. 项目概览与环境准备 Nanbeige 4.1-3B像素冒险聊天终端是一款融合复古游戏美学与AI对话功能的创新工具。这套系统采用Streamlit框架构建&#xff0c;通过精心设计的像素风格界面&#xff0c;…...

OpenClaw版本升级:Qwen3-4B模型与新框架特性的兼容性

OpenClaw版本升级&#xff1a;Qwen3-4B模型与新框架特性的兼容性 1. 为什么需要关注版本升级 上周五晚上11点&#xff0c;我的OpenClaw突然弹出一条警告&#xff1a;"当前版本(v0.8.3)将在48小时后停止维护"。这个深夜警报让我意识到&#xff0c;是时候处理这个技术…...

Qwen2.5深度微调成果展示|像素剧本圣殿在武侠/赛博朋克题材表现

Qwen2.5深度微调成果展示&#xff5c;像素剧本圣殿在武侠/赛博朋克题材表现 1. 项目概览 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作环境将先进的大语言模型能力与8-Bit复古美学完美融合…...

OpenClaw故障排查大全:千问3.5-27B接口调用常见错误解决

OpenClaw故障排查大全&#xff1a;千问3.5-27B接口调用常见错误解决 1. 开篇&#xff1a;当OpenClaw遇上千问3.5-27B 上周深夜&#xff0c;我的OpenClaw突然罢工了——一个原本运行良好的自动化脚本在调用千问3.5-27B模型时频繁报错。作为个人效率工具的重度用户&#xff0c;…...

Android混淆配置终极指南:基于Awesome Android库的完整ProGuard规则

Android混淆配置终极指南&#xff1a;基于Awesome Android库的完整ProGuard规则 【免费下载链接】awesome-android A curated list of awesome Android packages and resources. 项目地址: https://gitcode.com/gh_mirrors/awe/awesome-android 在Android应用开发中&…...

Grove-I2C颜色传感器驱动开发与RGB色彩识别实践

1. Grove-I2C颜色传感器技术解析与嵌入式驱动开发实践 1.1 模块硬件架构与传感原理 Grove-I2C颜色传感器模块基于TAOS&#xff08;现为ams OSRAM&#xff09;TCS3414CS高精度数字颜色传感器芯片设计&#xff0c;其核心传感单元由16个微型光电二极管阵列构成&#xff0c;呈82物…...

《QGIS快速入门与应用基础》256:SVG格式:适合矢量图二次编辑

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

Winbond W25N/W25M系列SPI NAND Flash驱动开发指南

1. Winbond W25N系列SPI NAND Flash驱动库技术解析Winbond W25N系列&#xff08;含W25N01GV、W25N02GV等&#xff09;与W25M系列&#xff08;如W25M02GW双芯片封装&#xff09;是工业级高可靠性SPI NAND Flash存储器&#xff0c;广泛应用于嵌入式系统中替代传统并行NAND或eMMC方…...

OpenClaw飞书机器人配置指南:Qwen3-14b_int4_awq实现对话触发任务

OpenClaw飞书机器人配置指南&#xff1a;Qwen3-14b_int4_awq实现对话触发任务 1. 为什么选择OpenClaw飞书机器人组合&#xff1f; 去年我接手了一个小团队的内部工具优化项目&#xff0c;需要解决两个核心痛点&#xff1a;一是团队成员频繁在飞书群内重复询问相同问题&#x…...