Vue2+OpenLayers点聚合功能实现(提供Gitee源码)

devtools/2025/1/15 5:09:45/
htmledit_views">

目录

一、案例截图

二、安装OpenLayers库

三、代码实现

3.1、初始化点位

3.2、初始化VectorSource

3.3、初始化Cluster

3.4、初始化VectorLayer

3.5、完整代码

四、Gitee源码


一、案例截图

一定距离的点(可配置)系统会自动聚合:

二、安装OpenLayers库

npm install ol

三、代码实现

3.1、初始化点位

这里返回一个Features集合,也就是点位集合。

关键代码:

createFeatures() {const pointList = [[118.948627, 32.120428],[118.96233518104327, 32.132747608006014],[118.958412, 32.119130],[118.96025438585423, 32.11912102446365],[118.95747155302206, 32.12247160889601],[118.96085782572982, 32.122218561916334],[118.91074424415842, 32.138229548887665],];let list = [];for(let i = 0 ; i < pointList.length ; i++){let feature = new Feature({geometry: new Point(pointList[i]),});list.push(feature);}return list;
},

3.2、初始化VectorSource

VectorSource是一种数据源,专门用于存储和管理矢量图形特征。

功能:它可以存储多个特征(如点、线、多边形),并提供相应的功能用于添加、移除或修改这些特征。features通常是一个特征数组,这些特征被添加到当前的矢量源中。

关键代码:

let features = this.createFeatures();
const source = new VectorSource({features: features,
});

3.3、初始化Cluster

Cluster是一个用于将相近的特征聚合(分组)的数据源。

功能:通过将特征进行聚合,Cluster 可以减少地图上的标记数量,使得在高密度区域中更易于视觉分析。当多个特征在地图上相互接近(在distance指定的像素范围内)时,它们会被聚合成一个集群,从而提高地图的可读性和交互性。 

关键代码:

const clusterSource = new Cluster({source: source,distance: 80,
});

3.4、初始化VectorLayer

VectorLayer 是一个图层类,用于在地图上展示矢量数据。它可以包含来自多个源的数据,允许通过不同的样式对其进行可视化。

功能:可以将 vectorLayer 用于配置、渲染和互动特性,例如展示点、线或多边形等。

source属性指定了要在图层中使用的数据源。在这种情况下,它是clusterSource,可以将地图上的点进行聚合,集中显示在一起,提高地图的可读性。

style属性定义了如何绘制图层中显示的特征,可以使用一个函数来动态设置样式。在这里,样式是根据单个特征的聚合大小(集群中的特征数量)来进行配置的。

关键代码:

const vectorLayer = new VectorLayer({source: clusterSource,style: (feature) => {const size = feature.get('features').length;return new Style({image: new CircleStyle({radius: 25,stroke: new Stroke({color: '#fff',}),fill: new Fill({color: '#ff3d00',}),}),text: new Text({font: '25px Arial',text: size.toString(),fill: new Fill({color: '#fff',}),}),});},
});
map.addLayer(vectorLayer);

3.5、完整代码

<template><div id="map-container"></div>
</template>
<script>
import { Map, View } from 'ol';
import { Tile as TileLayer } from 'ol/layer';
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import { Cluster } from 'ol/source';
import Text from 'ol/style/Text'
import CircleStyle from 'ol/style/Circle';
import Fill from 'ol/style/Fill';
import Stroke from 'ol/style/Stroke';
import Point from 'ol/geom/Point';
import Feature from 'ol/Feature';
import {Icon, Style} from "ol/style";
import { get } from 'ol/proj';
import { getWidth, getTopLeft } from 'ol/extent';
import { WMTS } from 'ol/source';
import WMTSTileGrid from 'ol/tilegrid/WMTS';
import { defaults as defaultControls } from 'ol/control';export const projection = get("EPSG:4326");
const projectionExtent = projection.getExtent();
const size = getWidth(projectionExtent) / 256;
const resolutions = [];
for (let z = 0; z < 19; ++z) {resolutions[z] = size / Math.pow(2, z);
}let map;
export default {data() {return {}},mounted(){this.initMap() // 加载矢量底图},methods:{initMap() {const KEY = '你申请的KEY'map = new Map({target: 'map-container',layers: [// 底图new TileLayer({source: new WMTS({url: `http://t{0-6}.tianditu.com/vec_c/wmts?tk=${KEY}`,layer: 'vec', // 矢量底图matrixSet: 'c', // c: 经纬度投影 w: 球面墨卡托投影style: "default",crossOrigin: 'anonymous', // 解决跨域问题 如无该需求可不添加format: "tiles", //请求的图层格式,这里指定为瓦片格式wrapX: true, // 允许地图在 X 方向重复(环绕)tileGrid: new WMTSTileGrid({origin: getTopLeft(projectionExtent),resolutions: resolutions,matrixIds: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15','16','17','18']})})}),// 标注new TileLayer({source: new WMTS({url: `http://t{0-6}.tianditu.com/cva_c/wmts?tk=${KEY}`,layer: 'cva', //矢量注记matrixSet: 'c',style: "default",crossOrigin: 'anonymous',format: "tiles",wrapX: true,tileGrid: new WMTSTileGrid({origin: getTopLeft(projectionExtent),resolutions: resolutions,matrixIds: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15','16','17','18']})})})],view: new View({center: [118.958366,32.119577],projection: projection,zoom: 13,maxZoom: 17,minZoom: 1}),//加载控件到地图容器中controls: defaultControls({zoom: false,rotate: false,attribution: false})});let features = this.createFeatures();const source = new VectorSource({features: features,});const clusterSource = new Cluster({source: source,distance: 80,});const vectorLayer = new VectorLayer({source: clusterSource,style: (feature) => {const size = feature.get('features').length;return new Style({image: new CircleStyle({radius: 25,stroke: new Stroke({color: '#fff',}),fill: new Fill({color: '#ff3d00',}),}),text: new Text({font: '25px Arial',text: size.toString(),fill: new Fill({color: '#fff',}),}),});},});map.addLayer(vectorLayer);},createFeatures() {const pointList = [[118.948627, 32.120428],[118.96233518104327, 32.132747608006014],[118.958412, 32.119130],[118.96025438585423, 32.11912102446365],[118.95747155302206, 32.12247160889601],[118.96085782572982, 32.122218561916334],[118.91074424415842, 32.138229548887665],];let list = [];for(let i = 0 ; i < pointList.length ; i++){let feature = new Feature({geometry: new Point(pointList[i]),});list.push(feature);}return list;},}
}
</script>
<style scoped>
#map-container {width: 100%;height: 100vh;
}
</style>

四、Gitee源码

地址:Vue2+OpenLayers点聚合功能实现


http://www.ppmy.cn/devtools/150584.html

相关文章

HTML文章翻页功能

效果展示&#xff1a; 效果原理&#xff1a; 1、引入CDN 2、绘制文章翻页样式&#xff0c;以及自动分段 3、获取窗口宽高&#xff0c;计算出当前文章总分段&#xff0c;并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

Postman接口测试基本操作

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman-获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果。 地址&#xff1a;http://kdtx-test.itheima.net/api/captchaIm…

zerox - 使用视觉模型将 PDF 转换为 Markdown

7900 Stars 478 Forks 39 Issues 17 贡献者 MIT License Python 语言 代码: https://github.com/getomni-ai/zerox 主页: OmniAI. Automate document workflows 更多AI开源软件&#xff1a;AI开源 - 小众AI zerox基于视觉模型 API 服务&#xff0c;提供了将 PDF 文档转化为 Mar…

蓝桥杯嵌入式速通(1)

1.工程准备 创建一文件夹存放自己的代码&#xff0c;并在mdk中include上文件夹地址 把所有自身代码的头文件都放在headfile头文件中&#xff0c;之后只需要在新的文件中引用headfile即可 headfile中先提前可加入 #include "stdio.h" #include "string.h"…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么&#xff1f; 阻塞队列的特点是什么&#xff1f; Lua脚本在这里的作用是什么&#xff1f; 异步调用创建订单的具体逻辑是什么&#xff1f; 为什么要用代理对象proxy调用createVoucherOrder方法&#xff1f; 对于代码的详细…

IP层之分片包的整合处理

前言 在上一章节中&#xff0c;笔者就IP层的接收代码逻辑做了简单介绍&#xff0c;并对实现代码进行了逻辑梳理以及仿真测试&#xff0c;并且在上一章节中&#xff0c;就IP层的分片包问题&#xff0c;如何确定分片包是否存在已经进行了简单介绍&#xff0c;并在接收模块中&…