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的id
    center: [25.67052, 121.99804], //初始地图中心
    zoom: 12, //初始缩放等级
    maxZoom: 20,
    minZoom: 2,
    zoomControl: true, //缩放组件
    attributionControl: false, //去掉右下角logol
    scrollWheelZoom: 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, // 聚类从中心标记覆盖的最大半径(以像素为单位),默认值 80
    spiderLegPolylineOptions: { 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.mfbz.cn/a/49215.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库数据恢复-Syabse数据库存储页底层数据杂乱的数据恢复案例

数据库恢复环境&#xff1a; Sybase版本&#xff1a;SQL Anywhere 8.0。 数据库故障&#xff1a; 数据库所在的设备意外断电后&#xff0c;数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接后报错&#xff1a; 数据库故障分析&#xff1a; 经过北亚企安数据恢复…

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…

机器学习——异常检测

异常点检测(Outlier detection)&#xff0c;⼜称为离群点检测&#xff0c;是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点&#xff08;outlier&#xff09;是⼀个数据对象&#xff0c;它明显不同于其他的数据对象。异…

soft ip与hard ip

ip分soft和hard两种&#xff0c;soft就是纯代码&#xff0c;买过来要自己综合自己pr。hard ip如mem和analog与工艺有关。 mem的lib和lef是memory compiler产生的&#xff0c;基于bitcell&#xff0c;是foundry给的。 我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起…

pyspark 笔记 cast 转换列的类型

1 不借助 pyspark.sql.types from pyspark.sql.functions import coldata [("Alice", "28"), ("Bob", "22"), ("Charlie", "30")] columns ["name", "age_str"] df spark.createDataFram…

第一章 计算机网络概述

第一章 计算机网络概述 1.1 计算机网络在信息时代的作用 1.2 因特网概述 网络分类&#xff1a; 网络&#xff1a;许多计算机连接在一起的的局域网&#xff1b; 互联网&#xff1a;internet许多网络连接在一起&#xff1b; 因特网&#xff1a;Internet 全球最大的互联网&…

15.Netty源码之EventLoop

highlight: arduino-light Netty配置主从Reactor模式 通过将NioServerSocketChannel绑定到了bossGroup。 将NioServerSocketChannel接收到请求创建的SocketChannel放入workerGroup。 将2个不同的SocketChannel绑定到2个不同的Group完成了主从 Reactor 模式。 分配NIOEventLoop的…

【java安全】RMI

文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为&#xff1a;Remote Method Invocation 远程方法调用&#xff0c;是java独立的一种机制。 RM…

Mnist分类与气温预测任务

目录 传统机器学习与深度学习的特征工程特征向量pytorch实现minist代码解析归一化损失函数计算图Mnist分类获取Mnist数据集&#xff0c;预处理&#xff0c;输出一张图像面向工具包编程使用TensorDataset和DataLoader来简化数据预处理计算验证集准确率 气温预测回归构建神经网络…

ChatGPT统计“一到点就下班”的人数

ChatGPT统计“一到点就下班”的人数 1、到点下班 Chatgpt统计各部门F-D级员工到点下班人数占比&#xff0c;是在批评公司内部存在到点下班现象。 根据图片&#xff0c;该占比的计算方法是&#xff1a;最后一次下班卡在17:30-17:40之间&#xff0c;且1-5月合计有40天以上的人…

无人机影像配准并发布(共线方程)

无人机影像 DEM 计算四个角点坐标&#xff08;刚性变换&#xff09; 像空间坐标&#xff08;x,y,-f&#xff09; 像空间坐标畸变纠正 deltax,deltay 已知(x,y)&#xff0c;求解(X,Y, Z)或者(Lat,Lon) 这里的Z是DEM上获取的坐标和Zs为相机坐标的高程&#xff0c;如果均为已…

Django on_delete参数在sql级别操作中不生效问题

class AA(models.Model):name models.CharField(max_length128)class Meta:db_table aaclass BB(models.Model):name models.CharField(max_length128)aa models.ForeignKey(AA, nullTrue, on_deletemodels.CASCADE)class Meta:db_table bb 如上当使用ORM删除aa表中的数据…

12-1_Qt 5.9 C++开发指南_自定义插件和库-自定义Widget组件(提升法(promotion)创建自定义定制化组件)

当UI设计器提供的界面组件不满足实际设计需求时&#xff0c;可以从 QWidget 继承自定义界面组件。 有两种方法使用自定义界面组件&#xff1a; 一种是提升法(promotion)&#xff0c;例如在8.3 节将一个QGraphicsView组件提升为自定义的 QWGraphicsView 类&#xff0c;提升法用…

html实现蜂窝菜单

效果图 CSS样式 keyframes _fade-in_mkmxd_1 {0% {filter: blur(20px);opacity: 0}to {filter: none;opacity: 1} } keyframes _drop-in_mkmxd_1 {0% {transform: var(--transform) translateY(-100px) translateZ(400px)}to {transform: var(--transform)} } ._examples_mkmx…

MHA高可用配置及故障切换

文章目录 MHA高可用配置及故障切换一. MySQL MHA1.什么是MHA&#xff12;.&#xff2d;&#xff28;&#xff21;的组成&#xff12;.&#xff11;MHA Node (数据节点)&#xff12;.&#xff12;MHA Manager (管理节点) &#xff13;.&#xff2d;&#xff28;&#xff21;的特…

使用python库uvicorn替代Nginx发布Vue3项目

目录 一、Vue3项目打包 二、将打包文件放到python项目 三、配置uvicorn服务 四、启动服务 【SpringBoot版传送门&#xff1a;使用SpringBoot替代Nginx发布Vue3项目_苍穹之跃的博客-CSDN博客】 一、Vue3项目打包 &#xff08;博主vue版本&#xff1a;3.2.44&#xff09; 由…

POI 导出 树形结构

参考文章&#xff1a;(327条消息) Excel树状数据绘制导出_excel导出树形结构_Deja-vu xxl的博客-CSDN博客https://blog.csdn.net/weixin_45873182/article/details/120132409?spm1001.2014.3001.5502 Overridepublic void exportPlus(String yearMonth, HttpServletRequest re…

spring5源码篇(12)——spring-mvc请求流程

spring-framework 版本&#xff1a;v5.3.19 文章目录 一、请求流程1、处理器映射器1.1、 RequestMappingHandlerMapping1.2、获取对应的映射方法1.3、添加拦截器 2、获取合适的处理器适配器3、通过处理器适配器执行处理器方法3.1、拦截器的前置后置3.2、处理器的执行3.2.1 参数…

重生之我要学C++第四天

这篇文章的主要内容是类的默认成员函数。如果对大家有用的话&#xff0c;希望大家三连支持&#xff0c;博主会继续努力&#xff01; 目录 一.类的默认成员函数 二.构造函数 三.析构函数 四.拷贝构造函数 五.运算符重载 一.类的默认成员函数 如果一个类中什么成员都没有&…

目标检测-击穿黑夜的PE-YOLO

前言 当前的目标检测模型在许多基准数据集上取得了良好的结果&#xff0c;但在暗光条件下检测目标仍然是一个巨大的挑战。为了解决这个问题&#xff0c;作者提出了金字塔增强网络&#xff08;PENet&#xff09;并将其与YOLOv3结合&#xff0c;构建了一个名为PE-YOLO的暗光目标检…
最新文章