cesium实现绘制图标,并实现图标的聚合功能

news2024/12/24 0:37:41

点聚合说明

  • 在Cesium中,点聚合功能是指将大量的点数据聚合成一个更大的点或者其他形状,以减少在地图上显示大量点数据时的视觉混乱和性能问题。点聚合功能通常用于在地图上显示大量的点标记,例如地图上的POI(兴趣点)、传感器数据等。

  • 通过点聚合功能,可以将附近的点聚合成一个单独的点或者其他形状,当用户放大地图时,聚合的点会逐渐展开显示更详细的信息。这样可以在保持地图清晰的同时,有效地展示大量的点数据,提高用户体验。

  • 点聚合功能在Cesium中是一种处理大量点数据的有效方式,可以提高地图的可读性和性能。

思路实现

  • 定义变量,生成随机位置的点(根据个人需求需要绘制点或图标点坐标)
  • 在地图上打点或绘制图标
  • 对生成的点进行聚合功能(聚合对鼠标滚轮事件进行监听,根据点位的多少展示不同的聚合效果)

完成效果

在这里插入图片描述

在这里插入图片描述

实现

封装cesiumCluster.ts

let removeListener:any = null
import * as Cesium from 'cesium';
const cesiumCluster= (options:any) => {
    // 根据业务来
    // let itemList = options.data
    // if (!itemList || itemList.length <= 0) return;

    // const dataSource = new Cesium.CustomDataSource(options.name);

    // for (let i = 0; i < itemList.length; ++i) {
    //     const lon = Number(itemList[i].longitude);
    //     const lat = Number(itemList[i].latitude);
    //     const height = Number(itemList[i].height ? itemList[i].height : 0);
    //     dataSource.entities.add({
    //         type: options.type,
    //         name: 'coverageControl',
    //         id: itemList[i].id,
    //         position: Cesium.Cartesian3.fromDegrees(lon+ Math.random() * 0.1, lat + Math.random() * 0.1, height),
    //         billboard: {
    //             image: options.billboardImg,
    //             scale: 1.2,
    //             horizontalOrigin: Cesium.HorizontalOrigin.CENTER, 
    //             verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
    //         }
    //     });
    // }

    // 测试生成随机数点
    const dataSource = new Cesium.CustomDataSource(options.name);

    for (let i = 0; i <5000; ++i) {
        const lon = Number(112);
        const lat = Number(22);
        const height = Number(0);
        dataSource.entities.add({
            name: 'coverageControl',
            position: Cesium.Cartesian3.fromDegrees(lon+ Math.random() * 0.2, lat + Math.random() * 0.2, height),
            label: {
                text: '樱桃水果',
                pixelOffset: new Cesium.Cartesian2(10, -70), // 偏移方向
                fillColor: Cesium.Color.WHITE,
                backgroundColor: Cesium.Color.fromCssColorString('#e71236'),
                showBackground: true,
                font: '12px;'
            },
            billboard: {
                image: '/img/樱桃水果.png',
                scale: 0.5,
                horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // 相对于对象的原点(注意是原点的位置)的水平位置
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
            }
        });
    }


    dataSource.show = options.show
    const dataSourcePromise = window.viewer.dataSources.add(dataSource);
    dataSourcePromise.then(function (dataSource:any) {
        const pixelRange = 15;
        const minimumClusterSize = 3;
        const enabled = true;
        dataSource.clustering.enabled = enabled; //是否聚合
        dataSource.clustering.pixelRange = pixelRange;
        dataSource.clustering.minimumClusterSize = minimumClusterSize;
        dataSource.type = options.type;
        const pinBuilder = new Cesium.PinBuilder();
        const pin1000 = pinBuilder
            .fromText("1000+", Cesium.Color.RED, 48)
            .toDataURL();
        const pin500 = pinBuilder
            .fromText("100+", Cesium.Color.RED, 48)
            .toDataURL();
        const pin100 = pinBuilder
            .fromText("100+", Cesium.Color.RED, 48)
            .toDataURL();
        const pin50 = pinBuilder
            .fromText("50+", Cesium.Color.RED, 48)
            .toDataURL();
        const pin40 = pinBuilder
            .fromText("40+", Cesium.Color.ORANGE, 48)
            .toDataURL();
        const pin30 = pinBuilder
            .fromText("30+", Cesium.Color.YELLOW, 48)
            .toDataURL();
        const pin20 = pinBuilder
            .fromText("20+", Cesium.Color.GREEN, 48)
            .toDataURL();
        const pin10 = pinBuilder
            .fromText("10+", Cesium.Color.BLUE, 48)
            .toDataURL();
        function customStyle(billboard:any , distance:any , bool:any ) {
            let distanceCondition = new Cesium.DistanceDisplayCondition(3000.0, distance);
            let offset1 = new Cesium.Cartesian2(-8, 0);
            let offset2 = new Cesium.Cartesian2(-4, 0);
        
            removeListener = dataSource.clustering.clusterEvent.addEventListener((clusteredEntities:any , cluster:any ) => {
              cluster.billboard.disableDepthTestDistance = 10000000000;
        
              if (!bool) {
                cluster.label.show = true;
                cluster.label.distanceDisplayCondition = distanceCondition;
                cluster.label.showBackground = false;
                cluster.label.text = clusteredEntities.length.toString();
                if (clusteredEntities.length > 9) {
                  cluster.label.pixelOffset = offset1;
                } else {
                  cluster.label.pixelOffset = offset2;
                }
                cluster.label.disableDepthTestDistance = 100000000000;
                cluster.label.eyeOffset = new Cesium.Cartesian3(0, 0, -10);
                cluster.label.font = '15px Arial';
                cluster.label.style = Cesium.LabelStyle.FILL_AND_OUTLINE;
                cluster.label.fillColor = Cesium.Color.WHITE;
                cluster.label.outlineColor = Cesium.Color.WHITE;
                cluster.label.outlineWidth = 4;
              } else {
                cluster.label.show = false;
              }
        
              cluster.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(3000.0, distance);
              cluster.billboard.show = true;
              cluster.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND;
              cluster.billboard.id = cluster.label.id;
              cluster.billboard.image = billboard;
              cluster.billboard.scale = 0.7
            });
        
            let pixelRange = dataSource.clustering.pixelRange;
            dataSource.clustering.pixelRange = 0;
            dataSource.clustering.pixelRange = pixelRange;
        }
        customStyle(options.billboardImg2, 5000000000, false);
    })
}
export default cesiumCluster;

使用

import cesiumClusterfrom './cesium/cesiumCluster';
cesiumClusterHelper(options)

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

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

相关文章

YOLOv5 V7.0 - rknn模型的验证 输出精度(P)、召回率(R)、mAP50、mAP50-95

1.简介 RKNN官方没有提供YOLOv5模型的验证工具&#xff0c;而YOLOv5自带的验证工具只能验证pytorch、ONNX等常见格式的模型性能&#xff0c;无法运行rknn格式。考虑到YOLOv5模型转换为rknn会有一定的精度损失&#xff0c;但是需要具体数值才能进行评估&#xff0c;所以需要一个…

鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口

系列篇从内核视角用一句话概括shell的底层实现为&#xff1a;两个任务&#xff0c;三个阶段。其本质是独立进程&#xff0c;因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry)&#xff1a; 负责接受来自终端(控制台)敲入的一个个字符&…

13.跳跃游戏

文章目录 题目简介题目解答解法一&#xff1a;贪心算法&#xff0b;动态规划代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 跳跃游戏面试题 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 思路&#xff1a;这…

如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

续篇——源码部署LAMP环境上线项目——禅道项目

上篇:LNMP环境部署WordPress——使用源码包安装方式部署环境-CSDN博客 目录 一.前提准备 1. 名词区别 2. 下载项目软件包 3. 上传项目源码到虚拟机并解压 二.安装Apache 1. 环境清理 2.关闭Nginx 3. 下载Apache 4. 下载APR组件 4.1 安装apr 4.2 安装apr-util组件 5…

【投稿资讯】区块链会议CCF C -- CoopIS 2024 截止7.10 附录用率

会议名称&#xff1a;CoopIS CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;人机交互与普适计算 录用率&#xff1a;2023年接收率21% (21 regular 10 work-in-progress papers/100) AREA 5: HUMAN-CENTRIC SECURITY AND PRIVACY IN INFORMATION SYSTEMS Access Con…

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 #pragma once#include <memory> #include <functional>class Buffer; class TcpConnection;using TcpConnectionPtrstd::shared_ptr<TcpConnection>; using ConnectionCall…

20.接口自动化-Git

1、Git和SVN–版本控制系统 远程服务出问题后&#xff0c;可以先提交commit到本地仓库&#xff0c;之后再提交push远程仓库 git有clone Git环境组成部分 常用Git代码仓库服务-远程仓库 GitHub-服务器在国外&#xff0c;慢 GitLab-开源&#xff0c;可以在自己服务器搭建&…

示例六、湿敏传感器

通过以下几个示例来具体展开学习,了解湿敏传感器原理及特性&#xff0c;学习湿敏传感器的应用&#xff1a; 示例六、湿敏传感器 一、基本原理&#xff1a;随着人们生活水平的不断提高&#xff0c;湿度监控逐步提到议事日程上。由于北方地区秋冬季干燥&#xff0c;需要控制室内…

如何选择合适加密软件来保护信息资产|精选加密软件分析

五款加密软件对比分析&#xff0c;是一项复杂而必要的任务&#xff0c;旨在帮助用户选择最适合其需求的加密工具。在数字化时代&#xff0c;信息安全显得尤为重要&#xff0c;因此&#xff0c;对加密软件的评估与比较显得尤为关键。 首先&#xff0c;我们要考虑的是这些加密软件…

基于单片机的温度控制系统设计(51基础版)-设计说明书

本论文设计了一种基于51单片机的温度控制系统&#xff0c;该系统具备以下主要功能&#xff1a;首先&#xff0c;通过温度传感器实时检测环境温湿度&#xff0c;以获取准确的温度数值。其次&#xff0c;通过按键设置温度阈值&#xff0c;用户可以根据需求自行调整控制温度的上限…

Container exited with a non-zero exit code 1

最近遇到运行yarn pi的时候遇到如下问题。 很明显是container出错了&#xff0c;但是错误没有提示的很清楚。然后去看nodemanager日志也是如此。这时候笔者第一个想到要去看container的执行日志。container具体的日志目录位置是通过YARN的配置文件&#xff08;如yarn-site.xml&…

虚拟机CentOS密码重置

1&#xff0c;reboot重启 在出现下面的界面1按e 如果有选项就选择“CentOS Linux &#xff08;3.10.0-327.e17.x86_64&#xff09;7 &#xff08;Core&#xff09;”【我的电脑没有直接显示界面2】 界面1 界面2 2&#xff0c;在上述界面2中继续按e进入编辑模式 找到“ro cr…

AI办公自动化-用kimi批量重命名Word文档

文件夹里面有很多个word文档&#xff0c;标题里面都含有零代码编程&#xff0c;现在想将其替换为AI办公自动化。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&am…

翻译/润色找哪里比较专业,机构怎么选?

英文专业术语多&#xff0c;润色是很有必要的&#xff0c;大家可以选择专业的文章翻译润色服务&#xff0c;一定要挑选好正规的机构&#xff0c;这样的机构在出版过程中会为作者提供多项支持&#xff0c;对顺利发表是有帮助的。 科研领域英文论文专业润色包含这些内容&#xff…

SC-Lego-LOAM建图与ndt_localization的实车实现

参考&#xff1a;https://blog.csdn.net/weixin_44303829/article/details/121524380 https://github.com/AbangLZU/SC-LeGO-LOAM.git https://github.com/AbangLZU/ndt_localizer.git 将建图和定位分别使用lego-loam和ndt来进行&#xff0c;实车上的效果非常不错&#xff0c;…

SeetaFace6人脸特征提取与对比C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

Threejs 动态修改InstanceMesh实例化几何体中单个实例的颜色

目录 InstanceMesh多实例 场景 思路 注意点 实现 效果 InstanceMesh多实例 instanceMesh 是使用InstancedMesh类来创建实例化的几何体。它适用于当需要大量重复的几何体时&#xff0c;但是每个实例之间有不同的变换属性&#xff08;如位置、旋转、缩放等&#xff09; 场…

LangChain:大模型框架的深度解析与应用探索

在数字化的时代浪潮中&#xff0c;人工智能技术正以前所未有的速度蓬勃发展&#xff0c;而大模型作为其中的翘楚&#xff0c;以生成式对话技术逐渐成为推动行业乃至整个社会进步的核心力量。再往近一点来说&#xff0c;在公司&#xff0c;不少产品都戴上了人工智能的帽子&#…

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…