OpenLayers基础教程——点要素图层的聚合显示

本文介绍如何在OpenLayers中实现点要素图层的聚合处理,包括基本聚合、特殊处理及聚合样式的扩展,提升用户体验并避免地图界面卡顿。

1、前言

在某些情况下,图层中的点数量可能会成百上千,这时候如果不做任何处理将其直接加载到地图上,那么不仅会使用户视觉体验下降,同时也会造成地图界面的卡顿。下面这段代码创建了200个随机点进行显示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聚合</title>
    <style>
        html,
        body,
        #map {
     
     
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <link rel="stylesheet" href="libs/ol/ol.css" />
    <script src="libs/ol/ol.js"></script>
</head>
<body>
    <div id="map"></div>

    <script>
        // 随机创建200个要素
        var source = new ol.source.Vector();
        for (var i = 1; i <= 200; i++) {
     
     
            var coordinates = [120.00 + Math.random(), 30.00 + Math.random()];
            var feature = new ol.Feature(new ol.geom.Point(coordinates));
            source.addFeature(feature);
        }

        // 创建图层
        var layer = new ol.layer.Vector({
     
     
            source: source,
            style: function (feature, resolution) {
     
     
                var style = new ol.style.Style({
     
     
                    image: new ol.style.Icon({
     
     
                        src: 'img/point.png'
                    })
                })
                return style;
            }
        });

        // 创建地图
        var map = new ol.Map({
     
     
            target: 'map',
            layers: [
                layer
            ],
            view: new ol.View({
     
     
                projection: 'EPSG:4326',
                center: [120, 30],
                zoom: 10,
                minZoom: 5,
                maxZoom: 14
            })
        });
    </script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

一般情况下,如果一个点要素图层中的点数量很多,可以采用图层聚合的方式对其进行处理。但需要注意:图层聚合只对点要素图层有效,对线和面图层无效

2、点要素图层的聚合

openlayers中,图层聚合的一般步骤如下:

  1. 创建要素
  2. 创建数据源添加要素
  3. 创建聚合数据源,设置聚合的距离
  4. 创建图层,将数据源设置为聚合数据源
  5. 创建地图,添加聚合图层

图层聚合代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聚合</title>
    <style>
        html,
        body,
        #map {
     
     
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <link rel="stylesheet" href="libs/ol/ol.css" />
    <script src="libs/ol/ol.js"></script>
</head>
<body>
    <div id="map"></div>

    <script>
        // 随机创建200个要素
        var source = new ol.source.Vector();
        for (var i = 1; i <= 200; i++) {
     
     
            var coordinates = [120.00 + Math.random(), 30.00 + Math.random()];
            var feature = new ol.Feature(new ol.geom.Point(coordinates));
            source.addFeature(feature);
        }

        // 创建聚合数据源
        var cluster = new ol.source.Cluster({
     
     
            source: source,
            distance: 100
        });

        // 创建图层
        var layer = new ol.layer.Vector({
     
     
            source: cluster,
            style: function (feature, resolution) {
     
     
                var size = feature.get('features').length;
                var style = new ol.style.Style({
     
     
                    image: new ol.style.Circle({
     
     
                        radius: 30,
                        stroke: new ol.style.Stroke({
     
     
                            color: 'white'
                        }),
                        fill: new ol.style.Fill({
     
     
                            color: 'blue'
                        })
                    }),
                    text: new ol.style.Text({
     
     
                        text: size.toString(),
                        fill: new ol.style.Fill({
     
     
                            color: 'white'
                        })
                    })
                })
                return style;
            }
        });

        // 创建地图
        var map = new ol.Map({
     
     
            target: 'map',
            layers: [
                layer
            ],
            view: new ol.View({
     
     
                projection: 'EPSG:4326',
                center: [120, 30],
                zoom: 10,
                minZoom: 5,
                maxZoom: 14
            })
        });
    </script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

3、聚合特殊处理一

上面的代码虽然实现了点要素图层的聚合,但其实存在着一个问题:地图缩放层级最大时仍然保持着聚合效果,如下图所示:

在这里插入图片描述

一般情况下,当某处只有一个点时就应该取消聚合效果,这时候就需要对style: function (feature, resolution)这个回调函数进行处理,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聚合</title>
    <style>
        html,
        body,
        #map {
     
     
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <link rel="stylesheet" href="libs/ol/ol.css" />
    <script src="libs/ol/ol.js"></script>
</head>
<body>
    <div id="map"></div>

    <script>
        
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值