使用 Vue 和 Leaflet 实现地图撒点功能

在现代 Web 应用中,地图功能变得越来越重要。Vue.js 结合 Leaflet 可以轻松实现复杂的地图功能。本文将介绍如何使用 Vue 和 Leaflet 实现地图撒点功能,展示一组数据点在地图上的分布情况。

安装 Leaflet

安装 Leaflet 库及其对应的 Vue 插件:

npm install leaflet vue2-leaflet
初始化项目

App.vue 中设置基础布局:

<template><div id="app"><h1>地图撒点功能</h1><MapComponent /></div>
</template><script>
import MapComponent from './components/MapComponent.vue';export default {name: 'App',components: {MapComponent}
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;text-align: center;margin-top: 60px;
}
</style>
创建地图组件

接下来,我们创建一个新的组件 MapComponent.vue,用于展示地图及撒点功能。

<template><div id="map" style="height: 500px;"></div>
</template><script>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';export default {data() {return {map: null,markers: [{ lat: 51.505, lng: -0.09, message: 'Marker 1' },{ lat: 51.515, lng: -0.1, message: 'Marker 2' },{ lat: 51.525, lng: -0.11, message: 'Marker 3' }]};},mounted() {this.initMap();this.addMarkers();},methods: {initMap() {this.map = L.map('map').setView([51.505, -0.09], 13);L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(this.map);},addMarkers() {this.markers.forEach(marker => {L.marker([marker.lat, marker.lng]).addTo(this.map).bindPopup(marker.message);});}}
};
</script><style>
#map {width: 100%;height: 100%;
}
</style>
解释代码
  1. 初始化地图:在 mounted 钩子中调用 initMap 方法初始化地图。
  2. 添加标记:定义了一组标记数据,并在 addMarkers 方法中将这些标记添加到地图上。
  3. 地图样式:使用 style 标签设置地图的高度和宽度。
动态添加标记

为了实现更灵活的撒点功能,可以动态地添加标记。修改 MapComponent.vue 如下:

<template><div><button @click="addRandomMarker">添加随机标记</button><div id="map" style="height: 500px;"></div></div>
</template><script>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';export default {data() {return {map: null,markers: [{ lat: 51.505, lng: -0.09, message: 'Marker 1' },{ lat: 51.515, lng: -0.1, message: 'Marker 2' },{ lat: 51.525, lng: -0.11, message: 'Marker 3' }]};},mounted() {this.initMap();this.addMarkers();},methods: {initMap() {this.map = L.map('map').setView([51.505, -0.09], 13);L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(this.map);},addMarkers() {this.markers.forEach(marker => {L.marker([marker.lat, marker.lng]).addTo(this.map).bindPopup(marker.message);});},addRandomMarker() {const lat = 51.505 + (Math.random() - 0.5) * 0.1;const lng = -0.09 + (Math.random() - 0.5) * 0.1;const message = `Random Marker (${lat.toFixed(2)}, ${lng.toFixed(2)})`;L.marker([lat, lng]).addTo(this.map).bindPopup(message);}}
};
</script><style>
#map {width: 100%;height: 100%;
}
</style>
解释代码
  1. 添加按钮:在模板中添加一个按钮,用于触发随机标记的添加。
  2. 动态添加标记方法:定义 addRandomMarker 方法,生成随机坐标并添加标记到地图上。
处理大规模数据

在实际应用中,可能需要处理成百上千个数据点。为了优化性能,可以使用 leaflet.markercluster 插件实现标记聚类。

安装 leaflet.markercluster
npm install leaflet.markercluster
更新组件代码

MapComponent.vue 中引入并使用 leaflet.markercluster 插件:

<template><div><button @click="addRandomMarker">添加随机标记</button><div id="map" style="height: 500px;"></div></div>
</template><script>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';
import 'leaflet.markercluster';
import 'leaflet.markercluster/dist/MarkerCluster.Default.css';export default {data() {return {map: null,markers: L.markerClusterGroup()};},mounted() {this.initMap();this.addMarkers();},methods: {initMap() {this.map = L.map('map').setView([51.505, -0.09], 13);L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(this.map);this.map.addLayer(this.markers);},addMarkers() {const initialMarkers = [{ lat: 51.505, lng: -0.09, message: 'Marker 1' },{ lat: 51.515, lng: -0.1, message: 'Marker 2' },{ lat: 51.525, lng: -0.11, message: 'Marker 3' }];initialMarkers.forEach(marker => {const newMarker = L.marker([marker.lat, marker.lng]).bindPopup(marker.message);this.markers.addLayer(newMarker);});},addRandomMarker() {const lat = 51.505 + (Math.random() - 0.5) * 0.1;const lng = -0.09 + (Math.random() - 0.5) * 0.1;const message = `Random Marker (${lat.toFixed(2)}, ${lng.toFixed(2)})`;const newMarker = L.marker([lat, lng]).bindPopup(message);this.markers.addLayer(newMarker);}}
};
</script><style>
#map {width: 100%;height: 100%;
}
</style>
解释代码
  1. 引入插件:在组件中引入 leaflet.markercluster 插件及其样式文件。
  2. 初始化聚类组:在数据中初始化 L.markerClusterGroup
  3. 添加标记到聚类组:将所有标记添加到 markerClusterGroup 中,并将其添加到地图图层中。

总之,我们展示了如何在 Vue.js 中使用 Leaflet 实现地图撒点功能,包括基本的标记添加和处理大规模数据的聚类功能。希望这篇文章能帮助你更好地理解和应用 Vue 和 Leaflet 进行地图开发。

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

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

相关文章

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(五)数据处理

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

性能级NVMe全闪存储系统开箱评测

近日&#xff0c;我们对一款备受瞩目的Infortrend普安科技推出更高性能的存储产品——性能级NVMe全闪存储系统GS 5024UE 进行评测&#xff0c;这款设备搭载第五代IntelXeon处理器&#xff0c;性能达到50GB/s、1.3M IOPS与0.3毫秒延迟。下面对此款设备从外观、配置、产品性能及适…

瑞鑫RK3588 画中画 OSD 效果展示

这些功能本来在1126平台都实现过 但是迁移到3588平台之后 发现 API接口变化较大 主要开始的时候会比较费时间 需要找到变动接口对应的新接口 之后 就比较好操作了 经过几天的操作 已实现 效果如下

ThinkPHP发邮件配置教程?群发功能安全吗?

ThinkPHP发邮件的注意事项&#xff1f;如何优化邮件发送的性能&#xff1f; 无论是用户注册、密码重置还是消息提醒&#xff0c;发送邮件都是一个常见的需求。AokSend将详细介绍如何在ThinkPHP框架中配置和发送邮件&#xff0c;帮助开发者轻松实现邮件功能。 ThinkPHP发邮件&…

【Linux驱动】【手把手配置3568寄存器】点亮RK3568的一颗LED

【硬件】 3568的LED9 &#xff1a;引脚 GPIO0 B7 【配置GPIO的复用】 找配置复用关系的寄存器基地址、偏移地址、对应配置的GPIO。 查找&#xff1a;io -r -4 0xfdc2000c 系统设置的默认值 结果为1&#xff0c;意思是只有bit 0是1&#xff0c;其他全都为0。所以系统默认就是…

前端使用axios下载文件

首先&#xff0c;axios实例在发起下载文件请求时&#xff0c;应该配置responseType: ‘blob’&#xff0c;例如&#xff1a; // axios发起下载文档请求 export const downloadDoc (id: string) > {return request.get(/downloadDoc?id${id}, {// 参考官方文档https://www…

资质升级路径:掌握建筑装饰乙级设计资质要求

建筑装饰乙级设计资质的升级路径及要求可以归纳如下&#xff1a; 一、基本要求 企业资历与信誉&#xff1a; 企业需具有独立法人资格。社会信誉良好&#xff0c;注册资本不少于100万元人民币。从事建筑设计业务4年以上&#xff0c;并独立承担过不少于3项工程等级为二级及以上的…

翻译《The Old New Thing》- What were ShellExecute hooks designed for?

What were ShellExecute hooks designed for? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080910-00/?p20933 Raymond Chen 2008年09月10日 ShellExecute 钩子是为什么设计的&#xff1f; 简要 ShellExecute钩子设计用于扩展可执行字…

比较PWM调光和无极调光

在比较PWM调光和无极调光哪种方式更节能时&#xff0c;需要综合考虑多个因素&#xff0c;如灯具类型、光源效率、调光范围以及使用场景等。 PWM调光系统通过调节LED驱动电流的占空比来实现LED亮度的调节&#xff0c;具有高精度、高稳定性、无闪烁现象以及适用范围广等优点。其节…

Python中的“点阵字体”

“点阵字体”是个啥&#xff1f;&#xff0c;在python中怎么使&#xff1f;在现在全面高清的 5 G 5G 5G时代&#xff0c;它还有用“武”之地&#xff1f; (笔记模板由python脚本于2024年06月01日 18:44:31创建&#xff0c;本篇笔记适合会基本编程的coder翻阅) 【学习的细节是欢…

一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较

引言 近年来&#xff0c;“Ops”一词在 IT 运维领域的使用迅速增加。IT 运维正在向自动化过程转变&#xff0c;以改善客户交付。传统的应用程序开发采用 DevOps 实施持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。但对于数据密集型的机器学习和人…

网络隔离后的跨网投递需求,要这样做才能让需求落地

为了保护企业的核心数字资产、隔离有害的网络安全威胁、保障数据信息在可信网络内进行安全交互&#xff0c;越来越多的企业在网络建设时&#xff0c;选择进行网络隔离。应用较为普遍的网络隔离手段包括物理隔离、协议隔离、应用隔离等&#xff0c;而常见的状态是企业进行内部网…

Lab_ Finding and exploiting an unused API endpoint

https://portswigger.net/web-security/learning-paths/api-testing/api-testing-identifying-and-interacting-with-api-endpoints/api-testing/lab-exploiting-unused-api-endpoint# 查看功能点&#xff1a; 在Burp的HTTP history中发现 /api路径 我们先尝试一下将API请求…

全网最全!场外个股期权的询价下单流程的详细解析

场外个股期权的询价下单流程 场外个股期权交易&#xff0c;作为在交易所外进行的个性化期权交易方式&#xff0c;为投资者提供了更加灵活和定制化的交易选择。以下是场外个股期权询价下单流程的详细步骤&#xff1a; 文章来源/&#xff1a;财智财经 第一步&#xff1a;明确交…

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC&#xff08;Analogto-Digital Converter&#xff09;模拟数字转换器&#xff0c;是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号&#xff0c;单片机无法直接采集&#xff0c;此时需要ADC先将短租两端的电…

AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了!

文章推荐 AI搜索哪家强&#xff1f;16款产品实战测评&#xff0c;效率飙升秘籍&#xff01; AI日报&#xff5c;智谱AI再降价&#xff0c;同时开源9B系列模型&#xff1b;国内外气象大模型竞逐升级 字节推出文本到语音模型家族Seed-TTS&#xff1a;擅长情感表达&#xff0c;…

27个适合上班摸鱼的网页游戏平台,游戏党必备

在繁忙的工作和学习生活中&#xff0c;我们总是在寻找一丝丝的娱乐和放松。而玩游戏无疑是一种轻松愉快的方式。那么&#xff0c;有没有想过在上班上课的时候&#xff0c;偷偷打开浏览器玩几局游戏呢&#xff1f;今天&#xff0c;我们就为大家推荐27个网页游戏平台&#xff0c;…

短视频矩阵系统----可视化剪辑独立开发(采用php)

短视频矩阵系统源头技术开发&#xff1a; 打磨短视频矩阵系统的开发规则核心框架可以按照以下几个步骤进行&#xff1a; 明确系统需求&#xff1a;首先明确系统的功能需求&#xff0c;包括短视频的上传、编辑、发布、播放等环节。确定系统的目标用户和主要的使用场景&#xff…

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时&#xff0c;都希望能够利用已有的软件资源&#xff0c;以缩短开发周期&#xff0c;提高开发效率。 为了提高软件的可重用性(reusability)&#xff0c;C提供了类的继承机制。 1.继承的概念 继承&#xff1a; 指在现有…

mysql数据库学习-mysql内存IO性能优化

Mysql内存性能优化 1 CPU模式优化 1.7、安装jemalloc,避免原生内存分配器带来的内存碎片问题. cp $basedir/lib/mysql/libjemalloc.so.1 /usr/lib64/libjemalloc.so 数据库配置文件添加如下 [mysqld_safe] malloc-lib/usr/lib64/libjemalloc.so 1.8、修改cpu模式 cat …