Mars3d的BusineDataLayer应该传data格式实现聚合效果

news2024/10/7 18:32:02

问题:

1.通过【Mars3d】加载new mars3d.layer.BusineDataLayer(的如果不用url使用data的话,格式应该是什么样子的呢?

相关说明:实质就是就是GraphicLayer,自己加graphic进去。

使用data的话要否需要用onCreateGraphic代替symbol吗实现添加矢量的效果?

回复:

相关data的格式使用.相关代码:

import * as mars3d from "mars3d"

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

export let graphicLayer // 矢量图层对象

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

export const mapOptions = {

  scene: {

    center: {"lat":32.632367,"lng":118.899899,"alt":4713595.4,"heading":348,"pitch":-69}

  }

}

/**

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

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

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

 * @returns {void} 无

 */

export function onMounted(mapInstance) {

  map = mapInstance // 记录map


 

  addBusinessLayer()

}



 

let historyFiresRes = {

  "msg": "success",

  "code": 0,

  "data": [

    {

      "acq_time": "0454",

      "frp": 1.7,

      "year": "2019",

      "acq_date": "2019-12-04",

      "latitude": 40.81285,

      "confidence": "n",

      "scan": 0.39,

      "instrument": "VIIRS",

      "geom": "POINT(118.5964 40.81285)",

      "version": "2.0NRT",

      "brightness": 327.7,

      "bright_t31": 280.7,

      "daynight": "D",

      "id": 1,

      "satellite": "1",

      "track": 0.36,

      "longitude": 118.5964

    },

    {

      "acq_time": "0500",

      "frp": 3.2,

      "year": "2019",

      "acq_date": "2019-12-09",

      "latitude": 41.2258,

      "confidence": "n",

      "scan": 0.39,

      "instrument": "VIIRS",

      "geom": "POINT(118.77624 41.2258)",

      "version": "2.0NRT",

      "brightness": 344.2,

      "bright_t31": 281.6,

      "daynight": "D",

      "id": 2,

      "satellite": "1",

      "track": 0.36,

      "longitude": 118.77624

    },

    {

      "acq_time": "1800",

      "frp": 0.4,

      "year": "2019",

      "acq_date": "2019-12-12",

      "latitude": 40.52177,

      "confidence": "n",

      "scan": 0.38,

      "instrument": "VIIRS",

      "geom": "POINT(117.60754 40.52177)",

      "version": "2.0NRT",

      "brightness": 296.8,

      "bright_t31": 267.7,

      "daynight": "N",

      "id": 3,

      "satellite": "1",

      "track": 0.36,

      "longitude": 117.60754

    },

    {

      "acq_time": "1724",

      "frp": 1,

      "year": "2019",

      "acq_date": "2019-12-14",

      "latitude": 40.73357,

      "confidence": "n",

      "scan": 0.52,

      "instrument": "VIIRS",

      "geom": "POINT(118.43446 40.73357)",

      "version": "2.0NRT",

      "brightness": 301.9,

      "bright_t31": 261.3,

      "daynight": "N",

      "id": 4,

      "satellite": "1",

      "track": 0.5,

      "longitude": 118.43446

    },

    {

      "acq_time": "1824",

      "frp": 0.7,

      "year": "2019",

      "acq_date": "2019-12-16",

      "latitude": 40.59779,

      "confidence": "n",

      "scan": 0.41,

      "instrument": "VIIRS",

      "geom": "POINT(118.62975 40.59779)",

      "version": "2.0NRT",

      "brightness": 297.9,

      "bright_t31": 271.7,

      "daynight": "N",

      "id": 5,

      "satellite": "1",

      "track": 0.45,

      "longitude": 118.62975

    },

    {

      "acq_time": "1824",

      "frp": 1.4,

      "year": "2019",

      "acq_date": "2019-12-16",

      "latitude": 40.52311,

      "confidence": "n",

      "scan": 0.55,

      "instrument": "VIIRS",

      "geom": "POINT(117.60539 40.52311)",

      "version": "2.0NRT",

      "brightness": 296.3,

      "bright_t31": 269.8,

      "daynight": "N",

      "id": 6,

      "satellite": "1",

      "track": 0.43,

      "longitude": 117.60539

    }

  ]

}

function addBusinessLayer() {

  // 创建矢量数据图层(业务数据图层)

  graphicLayer = new mars3d.layer.BusineDataLayer({

    data: historyFiresRes,

    dataColumn: "data", // 数据接口中对应列表所在的取值字段名

    lngColumn: "longitude",

    latColumn: "latitude",

    // 点的聚合配置

    clustering: {

      enabled: true,

      pixelRange: 10,

      clampToGround: false,

    //   addHeight: 1000

      // opacity: 1

      // getImage: function (count) { // getImage是完全自定义方式

      //   let colorIn

      //   if (count < 10) {

      //     colorIn = "rgba(110, 204, 57, 0.6)"

      //   } else if (count < 100) {

      //     colorIn = "rgba(240, 194, 12,  0.6)"

      //   } else {

      //     colorIn = "rgba(241, 128, 23,  0.6)"

      //   }

      //   const radius = 40

      //   const thisSize = radius * 2

      //   const circleCanvas = document.createElement("canvas")

      //   circleCanvas.width = thisSize

      //   circleCanvas.height = thisSize

      //   const circleCtx = circleCanvas.getContext("2d", { willReadFrequently: true })

      //   circleCtx.fillStyle = "#ffffff00"

      //   circleCtx.globalAlpha = 0.0

      //   circleCtx.fillRect(0, 0, thisSize, thisSize)

      //   // 圆形底色

      //   circleCtx.globalAlpha = 1.0

      //   circleCtx.beginPath()

      //   circleCtx.arc(radius, radius, radius, 0, Math.PI * 2, true)

      //   circleCtx.closePath()

      //   circleCtx.fillStyle = colorIn

      //   circleCtx.fill()

      //   // 数字文字

      //   const text = "故障" + count

      //   circleCtx.font = radius * 0.6 + "px bold normal" // 设置字体

      //   circleCtx.fillStyle = "#ffffff" // 设置颜色

      //   circleCtx.textAlign = "center" // 设置水平对齐方式

      //   circleCtx.textBaseline = "middle" // 设置垂直对齐方式

      //   circleCtx.fillText(text, radius, radius) // 绘制文字(参数:要写的字,x坐标,y坐标)

      //   return circleCanvas.toDataURL("image/png") // getImage方法返回任意canvas的图片即可

      // }

    },

    symbol: {

      type: "billboardP",

      styleOptions: {

        image: "img/marker/mark-blue.png",

        width: 25,

        height: 34, // billboard聚合必须有width、height

        horizontalOrigin: Cesium.HorizontalOrigin.CENTER,

        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,

        scaleByDistance: new Cesium.NearFarScalar(1000, 0.7, 5000000, 0.3),

        label: {

          text: "{text}",

          font_size: 19,

          color: Cesium.Color.AZURE,

          outline: true,

          outlineColor: Cesium.Color.BLACK,

          outlineWidth: 2,

          horizontalOrigin: Cesium.HorizontalOrigin.LEFT,

          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,

          pixelOffset: new Cesium.Cartesian2(10, 0), // 偏移量

          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 80000)

        }

      }

    }

    // 自定义创建对象,可替代symbol、

    // onCreateGraphic: function (e) {

    //   const graphic = new mars3d.graphic.BillboardEntity({

    //     position: e.position,

    //     style: {

    //       image: "img/marker/lace-blue.png",

    //       width: 25,

    //       height: 34, // 聚合必须有width、height

    //       horizontalOrigin: Cesium.HorizontalOrigin.CENTER,

    //       verticalOrigin: Cesium.VerticalOrigin.BOTTOM

    //     },

    //     attr: e.attr

    //   })

    //   graphicLayer.addGraphic(graphic)

    // },

  })

  map.addLayer(graphicLayer)

  graphicLayer.on("clustering", function (event) {

    console.log("新增聚合对象", event)

  })

  // 单击事件

  graphicLayer.on(mars3d.EventType.click, function (event) {

    console.log("你单击了", event)

    if (map.camera.positionCartographic.height > 90000) {

      const graphic = event.graphic

      // graphic.closePopup()

      if (graphic?.cluster) {

        // 单击了聚合的点

        console.log("单击了聚合的点", graphic.getGraphics())

      } else {

        // 单击了具体的点对象

        const position = graphic.positionShow

        map.flyToPoint(position, {

          radius: 5000, // 距离目标点的距离

          duration: 4,

          complete: function (e) {

            // 飞行完成回调方法

            // graphic.openPopup()

          }

        })

      }

    }

  })

  graphicLayer.bindPopup(function (event) {

    if (event.graphic.cluster && event.graphic.getGraphics) {

      const graphics = event.graphic.getGraphics() // 对应的grpahic数组,可以自定义显示

      if (graphics) {

        const inthtml = `单击了聚合点(${graphics.length}个)`

        return inthtml

      }

    }

    const item = event.graphic?.attr

    if (!item) {

      return false

    }

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

                  <tr>

                    <th scope="col" colspan="2" style="text-align:center;font-size:15px;">${item.text} </th>

                  </tr>

                  <tr>

                    <td>省:</td><td>${item.province}</td>

                  </tr>

                  <tr>

                    <td>市:</td> <td>${item.city}</td>

                  </tr>

                  <tr>

                    <td>县/区:</td> <td>${item.district}</td>

                  </tr>

                  <tr>

                    <td>地址:</td> <td>${item.address}</td>

                  </tr>

                  <tr>

                    <td>视频:</td> <td><video src='http://data.mars3d.cn/file/video/lukou.mp4' controls autoplay style="width: 300px;" ></video></td>

                  </tr>

                </table>`

    return inthtml

  })

}

/**

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

 * @returns {void} 无

 */

export function onUnmounted() {

  graphicLayer.remove()

  graphicLayer = null

  map = null

}

// 计算贴地高度示例代码,可以将获取到的高度更新到数据库内,后续不用重复计算。

export function getDataSurfaceHeight() {

  if (graphicLayer.length === 0) {

    globalMsg("数据尚未加载成功!")

    return

  }

  showLoading()

  // 对图层内的数据做贴地运算,自动得到贴地高度

  graphicLayer.autoSurfaceHeight().then((graphics) => {

    hideLoading()

    const arr = []

    for (let i = 0, len = graphics.length; i < len; i++) {

      const graphic = graphics[i]

      const point = graphic.point

      arr.push({

        ...graphic.attr,

        lat: point.lat,

        lng: point.lng,

        z: point.alt

      })

    }

    mars3d.Util.downloadFile("point.json", JSON.stringify({ data: arr }))

  })

}

export function enabledAggressive(val) {

  graphicLayer.clustering = val

}

export function layerShowChange(val) {

  graphicLayer.show = val

}

实现效果:

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

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

相关文章

@EnableXXX注解+@Import轻松实现SpringBoot的模块装配

文章目录 前言原生手动装配模块装配概述模块装配的四种方式准备工作声明自定义注解 导入普通类导入配置类导入ImportSelector导入ImportBeanDefinitionRegistrar 总结TODO后续--条件装配 前言 最早我们开始学习或接触过 SSH 或者 SSM 的框架整合&#xff0c;大家应该还记得那些…

Python图像处理:批量添加水印的优雅实现与进阶技巧

1. 简介 在日常图像处理中&#xff0c;为图片添加水印是一项常见任务。有多种方法和工具可供选择&#xff0c;而今天我们将专注于使用Python语言结合PIL库批量添加水印。 需要注意的是&#xff0c;所选用的图片格式不应为JPG或JPEG&#xff0c;因为这两种格式的图片不支持透明…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的

Python爬虫系列-有道批量翻译英文单词-注音标版

爬虫系列更新-第二篇文章——《Python爬虫系列-有道批量翻译英文单词-注音标版》 之前发布计算机英文单词时研究了下,怎么把一个含有大量英文单词的txt文件翻译成如下格式&#xff1a; 如上图,左边图片是需要翻译的txt文本,右边图片是翻译后的txt文本。 运行的实际界面效果。 …

电脑如何屏幕录制?轻松录制高清视频

在当今信息化的时代&#xff0c;电脑已经成为工作和生活的重要工具。无论是在进行演示、教学还是记录重要操作步骤时&#xff0c;屏幕录制都是非常有用的。可是电脑如何屏幕录制呢&#xff1f;本篇文章将介绍三种常见的电脑屏幕录制方法&#xff0c;通过学习这些方法&#xff0…

Vue中的计算属性与监听器

聚沙成塔每天进步一点点 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料,让你能够更轻松、更自信地理解和掌握 Vue.js 的核心概念和技…

centos7部署minio单机版

一、目标 在centos7上部署minio单机版 二、centos7部署minio 1、下载minio mkdir /usr/local/minio cd /usr/local/minio wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio 2、新建minio存储数据的目录 mkdir -p /data/minio/data3、新建…

航芯ACM32G103开发板评测 02-GPIO输入输出

航芯ACM32G103开发板评测 02-GPIO输入输出 航芯ACM32G103开发板评测 GPIO输入输出应用 软硬件平台 ACM32G103 Board开发板 MDK-ARM Keil GPIO输出典型应用——点灯 GPIO输入典型应用——按键 GPIO 功能概述 GPIO 是通用输入/输出&#xff08;General Purpose I/O&#x…

Mysql的基本用法(上)非常详细、快速上手

上篇结束了java基础&#xff0c;本篇主要对Mysql中的一些常用的方法进行了总结&#xff0c;主要对查询方法进行了讲解&#xff0c;包括重要的多表查询用到的内连接和外连接等&#xff0c;以下代码可以直接复制到可视化软件中&#xff0c;方便阅读以及练习&#xff1b; SELECT *…

CRM市场营销管理功能,如何进行客户细分和数据分析?

CRM管理系统中的营销管理模块&#xff0c;它的锋芒常被销售管理所掩盖&#xff0c;但对于企业的业务来说同样重要。营销部门虽然不像销售人员一样直接面对客户&#xff0c;却是挖掘线索、商机的重要角色。CRM在市场营销领域的关键功能包括&#xff1a;营销漏斗、客户细分、营销…

详解静态网页数据获取以及浏览器数据和网络数据交互流程-Python

目录 前言 一、静态网页数据 二、网址通讯流程 1.DNS查询 2.建立连接 3.发送HTTP请求 4.服务器处理请求 5.服务器响应 6.渲染页面 7.页面交互 三、URL/POST/GET 1.URL 2.GET 形式 3.POST 形式 四.获取静态网页数据 1.requests库 点关注&#xff0c;防走丢&am…

C++上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的方法

前言 本人一直从事C上位软件开发工作较多&#xff0c;在之前的项目中通过C访问西门子PLC S7-200/S7-1200/S7-1500并进行数据交互的应用中一直使用的是ModbusTCP/ModbusRTU协议进行。Modbus上位开源库采用的LibModbus。经过实际应用发现Modbus开源库单次发送和接受的数据不能超过…

基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 双闭环PI控制器设计 4.2 SVPWM技术 4.3 控制系统实现 5.完整工程文件 1.课题概述 基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真。系统包括逆变桥、PMSM、park变换、clark变换、SVPWM、PI控…

了解长短期记忆 (LSTM) 网络:穿越时间和记忆的旅程

一、说明 在人工智能和机器学习的迷人世界中&#xff0c;长短期记忆 (LSTM) 网络作为一项突破性创新脱颖而出。LSTM 旨在解决传统循环神经网络 (RNN) 的局限性&#xff0c;尤其是在学习长期依赖性方面的局限性&#xff0c;彻底改变了我们在各个领域建模和预测序列的能力。本文深…

算法分析与设计 第一次课外作业

算法分析与设计 第一次课外作业 文章目录 算法分析与设计 第一次课外作业一. 单选题&#xff08;共8题&#xff0c;80分&#xff09;二. 判断题&#xff08;共2题&#xff0c;20分&#xff09; 一. 单选题&#xff08;共8题&#xff0c;80分&#xff09; (单选题)以下叙述中错误…

【模拟电路】模拟集成电路之神-NE555

一、集成电路NE555简介 二、功能框图与引脚说明 三、比较器&#xff08;运放&#xff09; 四、反相门&#xff08;非门&#xff09; 五、或非门 六、双稳态触发器 七、NE555的工作原理 集成电路NE555的芯片手册 C5157696 一、集成电路NE555简介 NE555起源于上个世纪70年代&a…

CCNP课程实验-03-Route_Path_Control_CFG

目录 实验条件网络拓朴需求 基础配置需求实现1.A---F所有区用Loopback模拟&#xff0c;地址格式为&#xff1a;XX.XX.XX.XX/32&#xff0c;其中X为路由器编号。根据拓扑宣告进对应协议。A1和A2区为特例&#xff0c;A1&#xff1a;55.55.55.0/24&#xff0c;A2&#xff1a;55.55…

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

是否需要跟上鸿蒙(OpenHarmony)开发岗位热潮?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…

密码学上的经典瞬间:如果当时有Python!

提到“安全”&#xff0c;首先想到的一定是加密。 在如今的互联网环境中&#xff0c;信息加密无处不在&#xff0c;我们早已习惯&#xff0c;甚至毫无感觉。 比如&#xff0c;通过https协议访问的各个网站的内容&#xff0c;QQ&#xff0c;微信等聊天工具之间互相发送的信息等等…