vue+leaflet笔记之地图聚合

vue+leaflet笔记之地图聚合

文章目录

  • vue+leaflet笔记之地图聚合
    • 开发环境
    • 代码简介
      • 插件简介与安装
      • 使用简介
    • 详细源码(Vue3)

本文介绍了Web端使用Leaflet开发库进行地图聚合查询的一种方法 (底图来源:中科星图),结合Leaflet.markercluster插件能够快速的实现地图聚合查询功能,显示效果如下图所示。


开发环境

Vue开发库:3.2.37 & Leaflet开发库:1.9.3

Leaflet主要插件:Leaflet.markercluster


代码简介

插件简介与安装

Leaflet.markercluster是为一个Leaflet提供漂亮的动画标记聚类功能的插件,优点是功能强大、简单易用,建议结合github文档仔细研究下,部分功能由于篇幅有限未列举;缺点是在加载大批量(10w+点数据)层级切换时,有明显的卡顿感。

官方文档 https://github.com/Leaflet/Leaflet.markercluster

# 插件安装
npm install leaflet.markercluster
# 插件安装(国内镜像,速度较快)
npm --registry https://registry.npm.taobao.org install leaflet.markercluster
# 引入地图聚合插件 Leaflet.markercluster
import "leaflet.markercluster/dist/MarkerCluster.css";
import "leaflet.markercluster/dist/MarkerCluster.Default.css";
import "leaflet.markercluster";

使用简介

// 创建新的聚合图层,向其添加标记,然后将其添加到地图中
const markerClusterLayer = L.markerClusterGroup({showCoverageOnHover: false, // 为true时,当鼠标悬停在点上时,它会显示它聚合的边界zoomToBoundsOnClick: true, //  为true时,当鼠标点击某个点时,会缩放到它的边界范围chunkedLoading: true, maxClusterRadius: 80, // 聚类从中心标记覆盖的最大半径(以像素为单位),默认值 80
}).addTo(map);
// 加载待聚合的geojson点数据
let geojson = pointData;
if (geojson) {let markerList = []; // 聚合标记点列表if (geojson.features.length > 0) {for (let i = 0; i < geojson.features.length; i++) {if (geojson.features[i].geometry) {// 属性const properties = geojson.features[i].properties;// 经纬度坐标const coordinate = geojson.features[i].geometry.coordinates;// 点状展示样式(无聚合状态)let img = dot3Url;const myIcon = L.icon({iconUrl: img,iconSize: [25, 25],});// 创建标记点const marker = L.marker(new L.LatLng(coordinate[1], coordinate[0]), {properties: properties,icon: myIcon,});markerList.push(marker);}}}// 添加聚合标记点列表markerClusterLayer.addLayers(markerList);
}

此外,L.markerClusterGroup还提供了几个别的属性:

属性默认值说明备注
showCoverageOnHovertrue为true时,当鼠标悬停在聚合点上时,它会显示它聚合的边界
zoomToBoundsOnClicktrue为true时,当鼠标点击某个聚合点时,会缩放到它的边界范围
spiderfyOnMaxZoomtrue为true时,当你在最大缩放级别点击一个聚合点时,会将其蜘蛛化,以便你能看到其包含的所有标记
chunkedLoadingtrue为true时,将 addLayers 的处理流程拆分成小间隔时间去处理,这样页面不会看起来静止不动
removeOutsideVisibleBoundstrue为true时,如果聚合点处于地图的显示区域外,则出于性能考虑将其从地图上移除
spiderLegPolylineOptions{…}允许定义一个给蜘蛛脚一个多边形选项 PolylineOptions实测,无用
maxClusterRadius80聚合点从中心标记覆盖的最大半径(以像素为单位)

详细源码(Vue3)

源代码下载地址 链接:https://pan.baidu.com/s/1axmOSj3cc8ve26_aODISeg?pwd=GIS6
提取码:GIS6

<template><div class="app-contain"><!-- leaflet 地图容器 --><div id="myMap"></div></div>
</template><script setup>
// 本地资源数据
import dot3Url from '/@/assets/images/dot3.png'
// 引入数据
import pointData from '/@/assets/mapData/heatData.json' // 地图聚合数据
// 引入样式
import { onMounted } from 'vue'
import L from 'leaflet';
import 'leaflet/dist/leaflet.css'
// 地图聚合 Leaflet.markercluster(聚合图层)
import "leaflet.markercluster/dist/MarkerCluster.css";
import "leaflet.markercluster/dist/MarkerCluster.Default.css";
import "leaflet.markercluster";
// 星图地球token
let geovisearthToken = 'YOURS_TOKEN'
let map = null;
const initMap = () => {const imagesLayer = L.tileLayer(`https://tiles1.geovisearth.com/base/v1/img/{z}/{x}/{y}?token=${geovisearthToken}`);const imagesLableLayer = L.tileLayer(`https://tiles1.geovisearth.com/base/v1/cia/{z}/{x}/{y}?token=${geovisearthToken}`);const layers = L.layerGroup([imagesLayer, imagesLableLayer])map = L.map('myMap', {  //需绑定地图容器div的idcenter: [25.67052, 121.99804], //初始地图中心zoom: 12, //初始缩放等级maxZoom: 20,minZoom: 2,zoomControl: true, //缩放组件attributionControl: false, //去掉右下角logolscrollWheelZoom: true, //默认开启鼠标滚轮缩放// 限制显示地理范围maxBounds: L.latLngBounds(L.latLng(-90, -180), L.latLng(90, 180)),layers: [layers] // 图层})// 添加比例尺要素显示L.control.scale({ maxWidth: 200, metric: true, imperial: false }).addTo(map)/** 地图聚合 */addMapFeature(pointData);
}// 地图聚合
const addMapFeature = (pointData) => {// 创建新的聚合图层,向其添加标记,然后将其添加到地图中const projectPointLayer = L.markerClusterGroup({showCoverageOnHover: false, // 为true时,当鼠标悬停在聚合点上时,它会显示它聚合的边界zoomToBoundsOnClick: true, //  为true时,当鼠标点击某个聚合点时,会缩放到它的边界范围chunkedLoading: true,spiderfyOnMaxZoom: true,maxClusterRadius: 80, // 聚类从中心标记覆盖的最大半径(以像素为单位),默认值 80spiderLegPolylineOptions: { weight: 1, color: '#222', opacity: 0.5 },}).addTo(map);let geojson = pointData;if (geojson) {addProjectClusterLayers(geojson, projectPointLayer);projectPointLayer.on("click", function (e) {e.layer.unbindPopup(); // 用于解除地图图层(layer)与其关联的弹出窗口(popup)// 图层点击弹出窗口处理事件const elements = getProjectPopupContent(e.layer.options.properties); // 返回内容e.layer.bindPopup(elements).openPopup(e.latlng); // 弹窗});}
};/** 点单击内容函数*/
const getProjectPopupContent = (item) => {// 内容及单击事件const elements = `<div>${toPopupItemStr("经度", item.lon)} ${toPopupItemStr("纬度", item.lat)} ${toPopupItemStr("阈值", item.valve)}</div>`;return elements;
};
const toPopupItemStr = (name, value) => {return value ? `<b>${name}:</b>${value}<br>` : "";
};/** 加载聚合图层*/
const addProjectClusterLayers = async (geojson, clusterlayer) => {let markerList = []; // 聚合标记点列表if (geojson.features.length > 0) {for (let i = 0; i < geojson.features.length; i++) {if (geojson.features[i].geometry) {const properties = geojson.features[i].properties;const coordinate = geojson.features[i].geometry.coordinates;/*  点状展示样式(无聚合状态) */let img = dot3Url;const myIcon = L.icon({iconUrl: img,iconSize: [25, 25],});const marker = L.marker(new L.LatLng(coordinate[1], coordinate[0]), {properties: properties,icon: myIcon,});markerList.push(marker);}}}clusterlayer.addLayers(markerList);
};onMounted(() => {initMap()
})
</script><style scoped>
#myMap {width: 92vw;height: 92vh;
}
</style>

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

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

相关文章

计算机组成原理(2)- 浮点数的存储

1、浮点数的表示方法 假设有以下小数&#xff0c;它表示的十进制数是多少呢&#xff1f; 00000000 00000000 00000000 1010.10101*2^3 1*2^1 1*2^-1 1*2^-3 10.625 1010.1010可以用科学计数法来表示为1.0101010 * 2^3。关于科学计数法再举个例子0.10101用科学计数法表示…

Docker容器基本操作之启动-停止-重启

一、安装启动RabbitMQ容器 此处以rabbitmq容器为例 前提&#xff1a;需要安装配置好docker(设置镜像源、配置阿里云加速)、开启docker&#xff0c;停止(stop)或者禁用(disable)手动解压缩安装的rabbitmq,以防与docker中安装的rabbitmq冲突。 //查看docker状态 systemctl stat…

计算机视觉(四)神经网络与典型的机器学习步骤

文章目录 神经网络生物神经元人工神经元激活函数导数 人工神经网络“层”的通俗理解 前馈神经网络Delta学习规则前馈神经网络的目标函数梯度下降输出层权重改变量 误差方向传播算法误差传播迭代公式简单的BP算例随机梯度下降&#xff08;SGD&#xff09;Mini-batch Gradient De…

SRS开源代码框架,协程库state-threads的使用

本章内容解读SRS开源代码框架&#xff0c;无二次开发&#xff0c;以学习交流为目的。 SRS是国人开发的流媒体服务器&#xff0c;C语言开发&#xff0c;本章使用版本&#xff1a;https://github.com/ossrs/srs/tree/5.0release。 目录 SRS协程库ST的使用源码ST协程库测试SrsAut…

Go语言网络库net/http

Go语言网络库net/http Http 协议(Hyper Text Transfer Protocol&#xff0c;超文本传输协议)是一个简单的请求-响应协议&#xff0c;它通常运行在 TCP 之 上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。 Http 协…

C++ malloc/free和new/delete

1.malloc和free malloc是开辟内存单元的库函数&#xff1b; malloc不会调用构造函数&#xff1b; free只是释放malloc所开辟的空间&#xff1b; free不会调用析构函数。 #include <iostream> using namespace std; class A { public:A(int i0) { cout << "A&…

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换&#xff08;一般用于小转大&#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符&#xff1a;&& || !3.8 单目运算符3.9 三目运算符…

简单工厂模式VS策略模式

简单工厂模式VS策略模式 今天复习设计模式&#xff0c;由于简单工厂模式和策略模式太像了&#xff0c;重新整理梳理一下 简单工厂模式MUL图&#xff1a; 策略模式UML图&#xff1a; 1、简单工厂模式中只管创建实例&#xff0c;具体怎么使用工厂实例由调用方决定&#xff0c…

【unity细节】怎么让物体产生碰撞后不会被撞飞,但是有碰撞停止的效果

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐怎么让物体产生碰撞后不会被撞飞&#xff0c;但是有碰撞停止的效果⭐ 文章目录…

渗透测试工程师的一些面试题1(同样适合刚入门的小白看哦~~!)

一、主要面试内容 1.什么是 WebShell? 2.什么是网络钓鱼&#xff1f; 3.你获取网络安全知识途径有哪些&#xff1f; 4.什么是 CC 攻击&#xff1f; 5.Web 服务器被入侵后&#xff0c;怎样进行排查&#xff1f; 6.dll 文件是什么意思&#xff0c;有什么用&#xff1f;DLL…

python与深度学习(九):CNN和cifar10

目录 1. 说明2. cifar10实战2.1 导入相关库2.2 加载数据2.3 数据预处理2.4 数据处理2.5 构建网络模型2.6 模型编译2.7 模型训练2.8 模型保存2.9 模型评价2.10 模型测试2.11 模型训练结果的可视化 3. cifar10的CNN模型可视化结果图4. 完整代码5. 改进后的代码和结果 1. 说明 本…

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…

CSS中display属性的inline-block导致布局错位问题

HTML部分代码 <div class"header_wrap"><ul><li><a href"#">首页</a></li><li>新闻</li><li>角色</li><li>世界</li><li>漫画</li><li>漫画</li><l…

力扣热门100题之轮转数组【中等】

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6…

libcomposite: Unknown symbol config_group_init (err 0)

加载libcomposite.ko 失败 问题描述 如图&#xff0c;在做USB OTG 设备模式的时候需要用到libcomposite.ko驱动&#xff0c;加载失败了。 原因&解决方法 有一个依赖叫configfs.ko的驱动没有安装。可以从内核代码的fs/configfs/configfs.ko中找到这个驱动。先加载confi…

测试,这是一个测试

这里写目录标题 一级目录二级目录三级目录 一级目录 二级目录 三级目录 测试&#xff0c;这是一个测试

王道数据结构-代码实操1(全注解版)

#include<stdio.h>void loveyou(int n){ // 传入参数类型为int型&#xff0c;在此函数中表示为n&#xff1b;返回值类型为void&#xff0c;即没有返回值&#xff1b; int i1; //定义了一个整数型变量i&#xff0c;且只在loveyou函数中有用&#xff1b;while(i…

electron 打开本地文件夹

使用的api为shell.openPath,有些文章会提到shell.openItem&#xff0c;这个方法在electron 9.0后就废弃被openPath替代了。 打开E盘根目录下名为test的文件夹 const { shell } require(electron) shell.openPath(E:\\test)能打开的前提是&#xff0c;E盘根目录下确实有这个文…

【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】

文章目录 BIC 指令ORR 位或指令EOR 异或指令 上篇文章&#xff1a;ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr BIC 指令 指令格式 bic{条件}{S} Rd&#xff0c;Rn&#xff0c;operand根据operand哪个位为1&#xff0c;清除Rn对应的位&#xff0c;然后将结果存入Rd…

QT第二讲

思维导图 完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中 loginscuueed.h #ifndef LOGINSUCCEED_H #define LOGINSUCCEED_H#include <QWidget>namespace Ui { class loginSucceed; }class loginSucceed : public QWidget {…