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

news2025/2/22 4:14:49

实现效果: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()


 

}

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

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

相关文章

QT 原生布局和QML的区别

一、QML 与 Qt Quick的区别 1.1 从概念上区分 为了更精确地对两者进行说明&#xff0c;先看助手对 QML 的描述&#xff1a; QML is a user interface specification and programming language. QML 是一种用户界面规范和标记语言&#xff0c;允许开发人员和设计师创建高性能、流…

央视推荐的护眼灯是哪款?教育部认可护眼灯品牌

许多家长一般都会给孩子买上许多学习用品&#xff0c;比如现在一些学习桌椅、读写笔灯等等&#xff0c;配有蛮多的学习用具&#xff0c;但对孩子学习时用的护眼台灯很忽略&#xff0c;没有给孩子选好真正合格好用的护眼台灯&#xff0c;就容易让孩子的视觉形成偏差&#xff0c;…

外汇天眼:分析K线背后的力量,别让自己只停留在画线的阶段!

不确定性是市场的本质&#xff0c;也是它魅力所在。 大部分学习技术分析的新手以及亏货老手所能理解的技术分析就是在已经走完的图表上画线&#xff0c;或者研究K线形态&#xff0c;组合形态&#xff0c;等等...... 然后根据画的线和形态来预测未来走势&#xff0c;并依据这个…

深入理解 go RWMutex

在上一篇文章《深入理解 go Mutex》中&#xff0c; 我们已经对 go Mutex 的实现原理有了一个大致的了解&#xff0c;也知道了 Mutex 可以实现并发读写的安全。 今天&#xff0c;我们再来看看另外一种锁&#xff0c;RWMutex&#xff0c;有时候&#xff0c;其实我们读数据的频率要…

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在 Golang 领域&#xff0c;并发发送 HTTP 请求…

浊度水质分析仪的功能特性,及其在环境监测中的重要作用

在环境保护和水资源管理领域&#xff0c;对水质的精准监测是确保水体健康、保障公众用水安全的重要环节。其中&#xff0c;浊度作为衡量水体中悬浮物含量的关键参数&#xff0c;其精确测量对于环境评价和治理至关重要。浊度水质分析仪正是这样一款专门针对浊度进行实时在线监测…

【计算机组成-算术逻辑单元】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 算术运算和逻辑运算 算数运算 逻辑运算 算数逻辑运算的需求 算数运算&#xff1a;两个32-bit数的加减法&#xff0c;结果为一个32-bit数&#xff1b;检查加减法的结果是否溢出逻辑运算&#xff1a;两个32-bit数…

2024谷歌SEO自学基础入门

2024年可能会迎来大航海时代&#xff0c;国内各企业也加速了出海的步伐&#xff01;&#xff01; &#xff08;看总额&#xff0c;今年中国跨境电商&#xff0c;前三季度进出口1.7万亿元人民币&#xff0c;创造了14.4%的增长。 看体量&#xff0c;过去五年&#xff0c;中国跨…

【ESP32最全学习笔记(基础篇)——1.ESP32简介】

ESP32 新手&#xff1f;从这里开始&#xff01; 关于本教程&#xff1a; ESP32 基础篇 1.ESP32简介 ☑ 2.ESP32 Arduino 集成开发环境 3.ESP32 Arduino IDE 2.0 4.VS 代码…

Arduino快速上手esp8266方案开发

认识ESP8266 ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目&#xff0c;目前有非常高的市场普及率&#xff0c;还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32&#xff0c;可以在乐鑫官网查看完整的芯片列表。 ESP8266芯…

Microsoft Remote Desktop for Mac 中文正式版下载 微软远程连接软件

Microsoft Remote Desktop 是一款专为 Mac 用户设计的远程桌面工具&#xff0c;它可以帮助用户通过网络连接到其他计算机&#xff0c;实现远程控制和操作。 软件下载&#xff1a;Microsoft Remote Desktop for Mac 中文正式版下载 该工具支持多种远程连接协议&#xff0c;包括 …

imgaug库指南(23):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

DMVAE复现

复现结果–M->S&#xff1a;88.11&#xff0c;S->M&#xff1a;83.75&#xff0c;Joint&#xff1a;44.63&#xff0c;与原文差距在0.5个点内&#xff0c;可以接受 额外信息 第三篇完全复现的论文

Python实现递归最小二乘法回归模型(RecursiveLS算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 RLS主要是在误差平方和最小的原则基础上, 提出一种解析的拟合模型参数的迭代递推公式;可以实现在新的样…

案例126:基于微信小程序的民大食堂用餐综合服务平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

warning: GDB: Failed to set controlling terminal: Operation not permitted

运行环境 windows 10 wsl 1 ubuntu 20.04子系统 出现这个问题是因为运行在wsl1上&#xff0c;把系统运行到wsl2就行了。 解决办法 运行到wsl2 https://zhuanlan.zhihu.com/p/337104547 wsl2安装办法 关于编译个一个小问题&#xff0c;在vscode编译的一定要选对编译器&#…

开关电源如何覆铜

开关电源如何覆铜 开关电源覆铜是一个很重要的技术方法&#xff0c;如果没有很好的覆铜&#xff0c;就有可能会造成开关电源芯片的损坏。先介绍常见的开关电源电路&#xff1a; 图 1开关电源电路 从左到右分别是非同步整流Buck电路和同步整流Buck电路&#xff0c;第二排从左到…

Openharmony入门教程 相册问题修复

问题视频&#xff1a; 第五章-保存应用数据 _调用系统相册添加图片_哔哩哔哩_bilibili 跟着视频学习了Openharmony的入门&#xff0c;好不容易到了最后一个章节了&#xff0c;结果遇到了功能无法使用&#xff0c;还是得想办法 问题描述&#xff1a; 按照视频上的代码&#xf…

opencv-py-基础操作

文章目录 阈值分割灰度图效果 二值化效果 二值化取反效果 截取效果 TOZERO效果 TOZERO取反效果 滤波均值滤波高斯滤波中值滤波 图像拼接简单的横向和纵向拼接效果&#xff08;三幅图片分别是均值滤波&#xff0c;高斯滤波&#xff0c;中值滤波&#xff09; 腐蚀与膨胀 阈值分割…