Openlayers(五)点位聚合Cluster

Openlayers(五)点位聚合Cluster

1.业务问题

由于点位在地图上显示过多,会造成页面卡顿、点位标注信息相互叠加导致看不清

在这里插入图片描述

优化后效果

在这里插入图片描述
不断放大层级
在这里插入图片描述

2.聚合类Cluster

OpenLayers 中聚合是通过 ol.source.Cluster 实现,聚合的原理是将距离比较近的点位合并为一个点,并计算合并后点位的属性值。

在聚合源 ol.source.Cluster 中,当一个点被添加进来时,会检查该点与已有聚合点的距离是否在指定的聚合距离之内,如果是,则将该点加入到该聚合点中,同时更新聚合点的属性值(例如点数等)。如果该点与已有聚合点的距离都超出聚合距离,则将该点作为新的聚合点,加入到聚合源中。

在渲染时,对于聚合后的点,可以根据聚合点的属性值设置不同的样式,以区别于普通的点位。

重要参数说明

let clusterPondSource = new  Cluster({
  distance: 100, 
  source: new Vector()
});

distance: 聚合的距离,单位是像素

在聚合时,OpenLayers会计算每个点在屏幕上的像素位置,并根据像素位置计算聚合距离。因此,聚合距离不是以地理距离的方式计算的,而是以屏幕上的像素距离为基础。聚合距离的大小取决于地图缩放级别、地图分辨率和聚合距离参数的值。

聚合代码

在原本代码基础上,只需要把VectorLayer中数据源source替换成聚合类Cluster

import Cluster from "ol/source/Cluster"

//加载前端图片地址
 const iconTag   = reactive({
  title: `/public/title.png`,
  pond:`/public/pond.svg`
})

let clusterPondSource = new  Cluster({
  distance: 100, 
  source: new Vector()
});

let layerPondIcon = new VectorLayer({
  id: "layerPondIcon",
  title: 'layerPondIcon',
  source: clusterPondSource,
  zIndex: 1000,
  style: function (feature, resolution) {
    return  clusterStyle(feature,iconTag.pond,'#33C7CCFF')
  }
})

聚合样式

其中

let count = feature.get(“features”).length;

获取点位个数,判断当前点位如果数量大于1为聚合点,加载自定义圆。如果只有一个点位,显示我们原本点位。

function clusterStyle(feature,imgSrc,fillColor){
  let count = feature.get("features").length;
  if (count > 1) {
      //聚合样式
    return new Style({
      image: new Circle({ // 圆形
        radius: 15, // 半径
        stroke: new Stroke({ // 边框
          color: '#fff'
        }),
        fill: new Fill({ // 填充
          color: fillColor
        })
      }),
      text: new Text({
        fill: new Fill({
          //文本填充样式(即文字颜色)
          color: "#ffffff",
        }),
        font: "bold 14px sans-serif",
        text: count > 1 ? count.toString() : feature.get("features")[0].values_.name
      }),

    });
  } else {
      //默认样式
    return new Style({
      image: new Icon({
        src: imgSrc,
      }),
      text: new Text({
        textAlign: 'center',            //位置
        textBaseline: 'middle',         //基准线
        font: 'normal 13px 微软雅黑',    //文字样式
        offsetY: -25,    // Y轴偏置
        text: feature.get("features")[0].values_.name,      //文本内容
        fill: new Fill({       //文本填充样式(即文字颜色)
          color: '#FFF89A'
        }),
        stroke: new Stroke({
          color: '#12a2ee',
          width: 2
        })
      })
    });
  }
}

Select事件替换

在监听select事件的回调函数中判断当前选中的是单个点还是聚合点,如果是聚合点位,点击会放大地图层级,如果是单个点位,加载之前业务。

  let selectSingleClick = new Select({ style: null });
  myMap.value.addInteraction(selectSingleClick);
  // feature点击事件
  selectSingleClick.on("select", (e) => {
    let selectedFeatures = e.selected;
    if (selectedFeatures.length > 0) {
      let feature = selectedFeatures[0];
      let features = feature.get('features');
      if (features.length === 1) {
        // 单个点位
        // 执行之前的业务逻辑
        console.log('之前业务')
      } else {
        // 聚合点
        // 放大地图层级
        myMap.value.getView().animate({
          center: feature.getGeometry().getCoordinates(),
          zoom: myMap.value.getView().getZoom() + 1
        });
      }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink的窗口机制

窗口机制 tumble(滚动窗口) hop(滑动窗口) session(会话窗口) cumulate(渐进式窗口) Over(聚合窗口) 滚动窗口(tumble) 概念 滚…

系统复杂度之【高性能】

系统复杂度之【高性能】 今天我们来谈一谈系统复杂度的根源之【高性能】 对性能的不懈追求一直是人类科技持续发展的核心动力。例如计算机,从电子管计算机到晶体管计算机,再到集成电路计算机,运算性能从每秒几次提高到每秒几亿次。然而&#…

VUE_学习笔记

一、 xx 二、模板语法 1.模板语法之差值语法 :{{ }} 主要研究:{{ 这里可以写什么}} 在data中声明的变量、函数等都可以。常量只要是合法的javascript表达式,都可以。模板表达式都被放在沙盒中,只能访问全局变量的一个白名单&a…

【微服务笔记14】微服务组件之Config配置中心高可用环境搭建

这篇文章,主要介绍微服务组件之Config配置中心高可用环境搭建。 目录 一、高可用Config配置中心 1.1、高可用配置中心介绍 1.2、搭建Eureka注册中心 1.3、搭建ConfigServer服务端 (1)引入依赖 (2)添加配置文件 …

Jetson nano部署剪枝YOLOv8

目录前言一、YOLOv8模型剪枝训练1. Pretrain[option]1.1 项目的克隆1.2 数据集1.3 训练2. Constraint training3. Prune4. finetune二、YOLOv8模型剪枝部署1. 源码下载2. 环境配置2.1 trtexec环境变量设置3. ONNX导出3.1 Transpose节点的添加3.2 Resize节点解析的问题4. 运行4.…

FIFO的工作原理及其设计

1.简介 FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。 对于单片FIFO来说,主要有两种…

SHELL函数可课后作业

一、题目 1、编写函数,实现打印绿色OK和红色FAILED 判断是否有参数,存在为Ok,不存在为FAILED 2、编写函数,实现判断是否无位置参数,如无参数,提示错误 3、编写函数实现两个数字做为参数,返回最…

多线程 之 CAS与synchronized的优化过程

前言 本篇介绍什么是CAS与synchronized的优化过程,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录前言1. 什么是CAS?2. CAS实现的操作2.1 实现原子类2.2 实现自旋锁3. CAS的aba问题4. synchr…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

链式二叉树及相关操作(前,中,后,层序遍历)

欢迎来到 Claffic 的博客 💞💞💞 “春来无事,只为花忙。” 前言: 上一期给大家介绍了二叉树的一种顺序结构:堆,这一期承接上一期,给大家继续介绍二叉树的另一种结构:链式结构。 目录…

golang指针相关

指针相关的部分实在是没有搞太明白,抽时间来总结下。 1.指针相关基础知识 比如现在有一句话:『谜底666』,这句话在程序中一启动,就要加载到内存中,假如内存地址0x123456,然后我们可以将这句话复制给变量A&…

多线程(八):常见锁策略

目录 前言 1. 乐观锁 VS 悲观锁 乐观锁 悲观锁 2. 轻量级锁 VS 重量级锁 轻量级锁 3. 自旋锁 VS 挂起等待锁 自旋锁 挂起等待锁 4. 读写锁 VS 互斥锁 5. 可重入锁 vs 不可重入锁 死锁 发生死锁的情况 死锁产生的四个必要条件如下: 6. 公平锁和非公平锁…

【Java EE】-多线程编程(九) 锁策略CAS锁优化

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 主要内容:乐观锁VS悲观锁、轻量级锁VS重量级锁、自旋锁VS挂起等待锁、互斥锁VS读写锁、公平锁VS非公平锁、可重入锁VS不可重入锁。CAS实…

Python数据结构与算法-树

一、树的概念详情见 https://blog.csdn.net/little_limin/article/details/129845592 Python数据结构与算法-堆排序(NB组)—— 一、树的基础知识二、树的实例:模拟文件系统1、树的存储树结构也是链式存储的,与链表的结构相似&…

类ChatGPT代码级解读:如何从零起步实现Transformer、llama/ChatGLM

前言 最近一直在做类ChatGPT项目的部署 微调,关注比较多的是两个:一个LLaMA,一个ChatGLM,会发现有不少模型是基于这两个模型去做微调的,说到微调,那具体怎么微调呢,因此又详细了解了一下微调代…

Vulnhub_Pylington

目录 一、信息收集 (一)端口服务探测 (二)目录扫描 二、漏洞挖掘 (一)robots敏感信息泄露 (二)python IDE沙箱绕过RCE 1. python敏感函数沙盒绕过 2. exec(__import_…

【ES】搜索结果处理RestClient查询文档

【ES】搜索结果处理&RestClient查询文档2.搜索结果处理2.1.排序2.1.1.普通字段排序2.1.2.地理坐标排序2.2.分页2.2.1.基本的分页2.2.2.深度分页问题2.2.3.小结2.3.高亮2.3.1.高亮原理2.3.2.实现高亮2.4.总结3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响…

Python做个猫狗识别系统,给人美心善的邻居

嗨害大家好鸭!我是爱摸鱼的芝士❤ 宠物真的看着好治愈 谁不想有一只属于自己的乖乖宠物捏~ 这篇文章中我放弃了以往的model.fit()训练方法, 改用model.train_on_batch方法。 两种方法的比较: model.fit():用起来十分简单&#…

Kubernetes 部署 StarRocks 集群

文章目录StarRocks简介系统架构图安装部署StarRocks手动部署通过 Docker部署使用 StarGo 部署管理通过 StarRocks Manager部署管理通过 Kubernetes部署工作原理逻辑图部署 StarRocks Operator部署 StarRocks 集群访问 StarRocks 集群集群内访问 StarRocks 集群集群外访问 StarR…

【案例实践】R语言多元数据统计分析在生态环境中的实践应用

查看原文>>>R语言生物群落分析绘图、多元统计分析、CMIP6、遥感碳储量、GEE林业、InVEST等 生态环境领域研究中常常面对众多的不同类型的数据或变量,当要同时分析多个因变量(y)时需要用到多元统计分析(multivariate sta…