openlayers-18-聚合显示补充(切换聚合与非聚合状态)

news2024/11/23 20:12:10

最近有一些网友问我,聚合显示怎么实现聚合与不聚合之间的切换,有很多方法能够实现,下面是一个示例作为参考。

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>加载天地图</title>
    <link href="ol/ol.css" rel="stylesheet" type="text/css" />
    <script src="ol/ol.js" type="text/javascript"></script>
    <style type="text/css">
       html,body{
        margin:0px;
        padding:0px;
       }
       #mapCon {
            width: 100%;
            height: 98%;
        }
    </style>
</head>
<body>
    <!-- 地图容器 -->
    <div id="mapCon"></div>
    <div style="position: absolute;top:10px;left:50px;">
        <button onclick="toggleCluster()">切换聚合</button>
    </div>
    <script type="text/javascript">
        var key = "4689fc6b9bc0fdc8c48298f751ebfb41";//天地图密钥
        var center = [116.3913,39.9071];
        var pointArr = [[116.3913,39.9071],[116.3813,39.9071],[116.3713,39.9071],[116.3613,39.9071],[115.3913,38.9071],[115.3813,38.9071],[115.3613,38.9071],[115.3313,38.9071]];//北京经纬度
        //ol.layer.Tile:是一个瓦片图层类,用于显示瓦片资源。
        //source是必填项,用于为图层设置来源。

        //ol.source.XYZ: 
        //创建天地图矢量图层
        var TiandiMap_vec = new ol.layer.Tile({
            title: "天地图矢量图层",
            source: new ol.source.XYZ({
                url: "http://t{0-7}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=" + key,
                wrapX: false
            })
        });
        //创建天地图矢量注记图层
        var TiandiMap_cva = new ol.layer.Tile({
            title: "天地图矢量注记图层",
            source: new ol.source.XYZ({
                url: "http://t{0-7}.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=" + key,
            })
        });
        //1. 实例化Map对象加载地图
        var map = new ol.Map({
            //地图容器div的ID
            target: 'mapCon',
            //地图容器中加载的图层
            layers: [TiandiMap_vec, TiandiMap_cva],
            //地图视图设置
            view: new ol.View({
                //地图初始中心点(经纬度)
                center: center,
                //地图初始显示级别
                zoom: 8,
                projection: "EPSG:4326"
            })
        });
        //2.创建用于放置标注的矢量图层以及图层源
        //矢量标注的数据源-非聚合
        var vectorSource = new ol.source.Vector();
        //3.聚合标注数据源
        var clusterSource = new ol.source.Cluster({
            distance: 40,
            source: vectorSource
        });
        var styleCache = {};
        //矢量标注图层
        var vectorLayer = new ol.layer.Vector({
            source: clusterSource,//初始设置源为聚合源
            zIndex:1000,
            style: function (feature, resolution) {
                
                var size = feature.get('features').length;
                var style;
                //当前的标注仅包含一个feature时,采用该feature的样式显示,而不是统一聚合样式,这个很有用
                if (size == 1) {
                    style = styleCache[feature.get('features')[0].get("name")];
                } else {
                    style = styleCache[size];
                }
                if (!style) {
                    style = [
                        new ol.style.Style({
                            image: new ol.style.Circle({
                                radius: 10,
                                stroke: new ol.style.Stroke({
                                    color: '#fff'
                                }),
                                fill: new ol.style.Fill({
                                    color: '#cc4700'
                                })
                            }),
                            text: new ol.style.Text({
                                text: size.toString(),
                                fill: new ol.style.Fill({
                                    color: '#fff'
                                })
                            })
                        })
                    ];
                    if (size == 1) {
                        //这里采用那么作为styleCache对象key的值,name是唯一的,
                        //这样就可以为为每一个feature设置不同的样式,因为起初feature未聚合前,
                        //可能会使用不同的图标来表示不同的目标
                        let pkiaa = feature.get('features')[0].get("name");
                        style = feature.get('features')[0].getStyle();
                        styleCache[pkiaa] = style;
                    } else {
                        styleCache[size] = style;
                    }
                }
                return style;
            }
        });
        map.addLayer(vectorLayer);

        //4.实例化矢量标注对象并添加到矢量图层源
        for (let index = 0; index < pointArr.length; index++) {
            const element = pointArr[index];
            var markerFeature = new ol.Feature({
                geometry: new ol.geom.Point(element),
                name:'point_'+index,//保证唯一性,在聚合显示时用于区分独立的 style
            });
            markerFeature.setStyle(createMarkerStyle(markerFeature));
            //将新要素添加到数据源中
            vectorSource.addFeature(markerFeature);
        }
        //切换聚合状态
        function toggleCluster(){
            //获取当前矢量图层的源
            let vecSource = vectorLayer.getSource();
            //判断矢量图层的 源 是否 有 distance属性,该属性是聚合矢量源特有,可以根据此来判断当前 矢量图层的源是 聚合源还是非聚合源
            //如果有distance属性,则设置矢量图层的源 为  非聚合源
            if (vecSource.distance !=undefined){
                vectorLayer.setSource(vectorSource);
            }
            //如果没有distance属性,则设置矢量图层的源 为 聚合源
            else{
                vectorLayer.setSource(clusterSource);
            }
        }
        //创建矢量标注样式
        function createMarkerStyle(feature) {
            //获取name,根据不同的name,配置不同的图标
            let name = feature.get("name");
            let index = name.split('_')[1];
            console.log(index);
            let imageUrl = 'static/img/hq.png';
            if (index%2 == 0) {//与2求余为0的,设置为勋章 标记
                imageUrl = "static/img/xz.png";
            }
            return new ol.style.Style({
                /**{olx.style.IconOptions}类型*/
                image: new ol.style.Icon(
                    ({
                        // anchor: [0.5, 0.5],//图标的锚点,经纬度点所对应的图标的位置,默认是[0.5, 0.5],即为标注图标的中心点位置
                        anchorOrigin: 'top-right',//锚点的偏移位置,默认是top-left,
                        anchorXUnits: 'fraction',//锚点X的单位,默认为百分比,也可以使用px
                        anchorYUnits: 'pixels',//锚点Y的单位,默认为百分比,也可以使用px
                        offsetOrigin: 'top-right',//原点偏移bottom-left, bottom-right, top-left, top-right,默认 top-left
                        // offset:[0,10],
                        //图标缩放比例
                        // scale:0.5,//可以设置该比例实现,图标跟随地图层级缩放
                        //透明度
                        opacity: 0.75,//如果想隐藏某个图标,可以单独设置该值,透明度为0时,即可隐藏,此为隐藏元素的方法之一。
                        //图标的url
                        src: imageUrl
                    })
                ),
                text: new ol.style.Text({
                    //位置
                    textAlign: 'center',
                    //基准线
                    textBaseline: 'middle',
                    //文字样式
                    font: '20px 宋体',
                    //文本内容
                    text: feature.get('name'),//通过设置的fature的name属性获取,也可以通过参数获取设置,此处接收 字符串 对象
                    //文本填充样式(即文字颜色),红色
                    fill: new ol.style.Fill({ color: '#ff002f' }),
                    //描边颜色,蓝色
                    stroke: new ol.style.Stroke({ color: '#0022ff', width: 1 })
                })
            });
        }
    </script>
</body>
</html>

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

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

相关文章

怎么保护苹果手机移动应用程序ios ipa文件中的代码?

目录 前言 代码混淆步骤 1. 选择要混淆保护的ipa文件 2. 选择要混淆的类名称 3. 选择要混淆保护的函数&#xff0c;方法 4. 配置签名证书 5. 混淆和测试运行 前言 在当今移动应用市场竞争激烈的环境中&#xff0c;代码保护功能对于iOS应用程序的成功非常关键。代码保护可…

不同走向地下管线的地质雷达响应特征分析

不同走向地下管线的地质雷达响应特征分析 前言 以PVC管线为例&#xff0c;建立不同走向&#xff08;水平倾斜、垂直倾斜、水平相邻&#xff09;的三维管线地质模型&#xff0c;进行三维地质雷达数据模拟&#xff0c;分析不同走向地下管线的地质雷达响应特征。 文章目录 不同…

【AntDesign】封装全局异常处理-全局拦截器

[toc] 场景 本文前端用的是阿里的Ant-Design框架&#xff0c;其他框架也有全局拦截器&#xff0c;思路是相同&#xff0c;具体实现自行百度下吧 因为每次都需要调接口&#xff0c;都需要单独处理异常情况&#xff08;code !0&#xff09;&#xff0c;因此前端需要对后端返回的…

vue3-ts-vite:Google 多语言调试 / 网页中插入谷歌翻译元素 / 翻译

一、实现目标 二、代码实现 2.1、项目vue3 - ts - vite 2.2、index.html 引入文件 <script>window.onload function () {const script document.createElement(SCRIPT)script.src https://translate.google.com/translate_a/element.js?cbgoogleTranslateElementI…

ROS的通信机制

ROS是一个分布式框架&#xff0c;为用户提供多节点&#xff08;进程&#xff09;之间的通信服务&#xff0c;所有软件功能和工 具都建立在这种分布式通信机制上&#xff0c;所以ROS的通信机制是最底层也是最核心的技术。在大多数应用场景下&#xff0c;尽管我们不需要关注底层通…

缓冲技术在嵌入式中的应用

引言 在嵌入式中&#xff0c;不可避免地会遇到数据的收发。 其实&#xff0c;数据的收发有很多情况。 总体上&#xff0c;分为数据的收和发&#xff1a; 其中&#xff0c;数据发送是一个主动的行为&#xff0c;我们对要发送数据的数量特点等都是知道的&#xff0c;比如我们通过…

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32)。MobileNet网络…

读取.nrrd和.dcm文件格式医学图片可视化与预处理

nrrd数据格式 MITK默认会将医学图像保存为格式为NRRD的图像&#xff0c;在这个数据格式中包含&#xff1a; 1、一个单个的数据头文件&#xff1a;为科学可视化和医学图像处理准确地表示N维度的栅格信息。 2、既能分开又能合并的图像文件。 nrrd_options输出 {u’dimension’:…

CoreData/数据存储管理, CoreDataRelationships/关系型数据结构存储管理 的使用

1. CoreData 数据的增删改查操作 1.1 创建数据实体管理文件 点击菜单栏 File -> New -> File... -> Core Data 栏下&#xff0c;选择 Data Mode&#xff0c;创建 FruitsContainer.xcdatamodeld 文件 1.2 创建 FruitEntity 实体表 打开 FruitsContainer.xcdatamodeld 文…

Quartus医院病房呼叫系统病床呼叫Verilog,源代码下载

名称&#xff1a;医院病房呼叫系统病床呼叫 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 1、用1~6个开关模拟6个病房的呼叫输入信号,1号优先级最高;1~6优先级依次降低; 2、 用一个数码管显示呼叫信号的号码;没信号呼叫时显示0;有多个信号呼叫时,显…

2023年鄂州中级职称申报时间是什么时候呢?

鄂州在6.7月份组织了一次水平能力测试&#xff0c;鄂州中级职称申报时间终于出来了&#xff0c;关于鄂州中级职称申报的一些情况&#xff0c;甘建二告诉你&#xff1a; 一、鄂州中级职称申报时间&#xff1a; 1.网上申报审核时间。个人申报2023年09月27日至2023年10月10日&…

单链表操作 C实现

struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…

leetCode 62.不同路径 动态规划 + 空间复杂度优化

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xf…

运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享

Mfc100u.dll 丢失的问题可能困扰着许多使用计算机的用户。Mfc100u.dll 是一个重要的动态链接库文件&#xff0c;它包含了许多功能模块&#xff0c;如字符串处理、数学计算、文件操作等。当 Mfc100u.dll 文件丢失或损坏时&#xff0c;可能会导致许多应用程序无法正常运行&#x…

【深度学习实验】卷积神经网络(六):卷积神经网络模型(VGG)训练、评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&…

Chrome(谷歌浏览器)如何关闭搜索栏历史记录

目录 问题描述解决方法插件解决&#xff08;亲测有效&#xff09;自带设置解决步骤首先打开 地址 输入&#xff1a;chrome://flags关闭浏览器&#xff0c;重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器&#xff0c;但是搜索栏的历史记录如何自己一条条的删…

学校宿舍一键视频对讲

学校宿舍一键视频对讲 大学宿舍一键视频对讲是指在大学宿舍内安装一套视频对讲系统&#xff0c;通过一键操作&#xff0c;实现与宿舍内其他人进行视频通话的功能。 该系统通常包括以下组成部分&#xff1a; 1. 室内终端&#xff1a;每个宿舍内安装一个室内终端&#xff0c;室…

JavaScript求数组的交集和差集

1. 求交集(从2个数组中找到相同的元素, 组成新数组, 注意去重): 1) Setfilterincludes // 求交集: const arr1 [0, 1, 2] const arr2 [3, 2, 0] function intersectSet(arr1, arr2) {return [...new Set(arr1)].filter(item>arr2.includes(item)) } const values inter…

26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法

声明 本文是学习GB-T 26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用X 射线CT 装置(以下简称CT 装置)性能测试的术语、定义、缩略语以及空间 分辨力、密度分辨率…

BChecks 自定义poc检测 - 把BurpSuite 打造成强大的漏洞扫描器

BChecks是什么&#xff1f; BChecks可以创建和导入的自定义扫描检查。Burp Scanner在执行其内置扫描例程的同时运行这些检查&#xff0c;帮助您定位扫描并使测试工作流尽可能高效。 每个BCheck都定义为一个以.bcheck文件扩展名结尾的纯文本文件。这些文件使用自定义语言来指定…