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

点聚合说明

  • 点聚合功能是指将地图上密集的点数据聚合成一个更大的点或者其他形状,以改善地图的可视化效果和性能。点聚合功能通常用于在地图上显示大量的点标记,例如地图上的POI(兴趣点)、传感器数据等。
  • 通过点聚合功能,可以将附近的点聚合成一个单独的点或其他形状,以减少地图上点数据过多时的视觉混乱,并提高地图的加载和交互性能。当用户放大地图时,聚合的点会逐渐展开显示更详细的信息,从而帮助用户更好地理解地图上的数据分布情况。
  • 在OpenLayers中,点聚合功能可以通过使用OpenLayers的相关功能和插件来实现。通常会根据地图上点的位置和密度来动态生成聚合点,并在用户交互时进行相应的展开和收缩操作,以提供更好的用户体验。
  • 点聚合功能在OpenLayers中是一种处理大量点数据的有效方式,可以改善地图的可读性和性能,同时提供更好的用户交互体验。

思路实现

  • 引入openlayers类
  • 在地图上打点或绘制图标
  • 对生成的点进行聚合功能,根据数量进行样式定义

完成效果

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

实现

封装olCluster.ts

import 'ol/ol.css'
import {Fill, Style, Icon, Stroke,Text, Circle as CircleStyle} from "ol/style";
import Feature from 'ol/Feature';
import Point from 'ol/geom/Point';
import {Vector as VectorLayer} from 'ol/layer';
import {Vector as VectorSource, Cluster} from 'ol/source';
import {fromLonLat} from 'ol/proj';


const olCluster = (options: any) => {
    const features = []
    for (let i = 0; i <5000; ++i) {
        const lon = Number(112);
        const lat = Number(22);
        const point = fromLonLat([lon+ Math.random() * 0.6, lat + Math.random() * 0.6]);
        let feature = new Feature({
            geometry: new Point(point),
        });
        feature.setProperties({
            id_Index: i, 
            type: options.type,
            name: 'olCluster',
            id: i,
        });
        features.push(feature)
    }

    const source = new VectorSource({
        features: features,
    });

    const clusterSource = new Cluster({
        distance: parseInt('40', 10),
        minDistance: parseInt('20', 10),
        source: source,
    });

    const layer:any = new VectorLayer({
        id: options.type, 
        source: clusterSource,
        style: clusterStyle,
        zIndex: 99
    });


    window.map.addLayer(layer);
    function clusterStyle(feature:any) {
        const size = feature.get('features').length;
        let style;
        if (!style) {
            if(size < 10){
                style = new Style({
                    image: new Icon({
                            anchor: [0.5, 1],
                            scale: 0.5,
                            src: '/img/樱桃水果.png'
                    })
                });
            }else{
                style = new Style({
                    image: new Icon({
                            anchor: [0.5, 1],
                            scale: 0.7,
                            src: options.billboardImg2
                    }),
                    text: new Text({
                        text: size.toString(),
                        fill: new Fill({
                            color: '#fff',
                        }),
                        textBaseline: 'middle', 
                        textAlign: 'center',
                        offsetY: -48
                    }),
                });
            }
        }
        return style;
    }
};


export default olCluster;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smile_zxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值