使用 Vue2 + Leaflet 快速搭建一个交互式地图(含标记、圆形、多边形)2

使用 Vue2 + Leaflet 快速搭建一个交互式地图(含标记、圆形、多边形)

在很多项目中,地图应用是必不可少的功能模块,比如展示地点信息、划分区域、定位服务等等。本文将手把手教你如何基于 Vue3 和 Leaflet,快速搭建一个基础的交互式地图,并添加标记、圆形、多边形等常见元素。

1. 引入 Leaflet 及其样式

首先,安装 Leaflet(如果尚未安装的话):

复制代码
bash
复制编辑
npm install leaflet

接着在 Vue 组件中引入 Leaflet 和其必要的 CSS 样式:

javascript 复制代码
javascript
复制编辑
import L from 'leaflet'
import 'leaflet/dist/leaflet.css'

2. 组件结构

我们在模板中留一个地图容器。注意,容器一定要设置宽高,否则地图不会显示!

xml 复制代码
html
复制编辑
<template>
  <div id="leaflet-map" ref="leafletMap"></div>
</template>

CSS 样式中,我们让地图占满整个视口:

xml 复制代码
css
复制编辑
<style scoped>
#leaflet-map {
  width: 100vw;
  height: 100vh;
}
</style>

3. 初始化地图

mounted 生命周期中调用 initMap 方法,来初始化 Leaflet 地图实例。

javascript 复制代码
javascript
复制编辑
mounted() {
  this.initMap()
},

methods 中定义具体的地图初始化逻辑:

kotlin 复制代码
javascript
复制编辑
methods: {
  initMap() {
    this.map = L.map(this.$refs.leafletMap, {
      center: [31.230378, 121.473658], // 上海市中心
      zoom: 11,
      zoomControl: false,       // 不显示缩放控件
      attributionControl: false // 不显示版权信息(正式项目建议保留)
    });

    // 加载高德地图瓦片
    L.tileLayer('https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', {
      subdomains: '1234',
      maxZoom: 19,
      minZoom: 10
    }).addTo(this.map);
  }
}

这里使用的是高德地图作为瓦片底图,可以根据需要切换成其他地图源。

4. 添加标记、圆形和多边形

为了让地图更具交互性,我们继续在 initMap 方法中添加一些元素:

(1)添加自定义标记
php 复制代码
javascript
复制编辑
const icon = L.icon({
  iconUrl: 'https://img2.baidu.com/it/u=1017327473,3649258168&fm=253&fmt=auto&app=138&f=PNG?w=500&h=500',
  iconSize: [50, 50],
});

const marker = L.marker([31.230378, 121.473658], {
  icon: icon,
  interactive: true
}).addTo(this.map);
(2)添加圆形覆盖物
arduino 复制代码
javascript
复制编辑
const circle = L.circle([31.250578, 121.503158], {
  color: 'red',
  fillColor: '#f03',
  fillOpacity: 0.5,
  radius: 2000 // 半径2公里
}).addTo(this.map);
(3)添加多边形
csharp 复制代码
javascript
复制编辑
const polygon = L.polygon([
  [31.227378, 121.4156588],
  [31.224378, 121.4446588],
  [31.291378, 121.4800658],
]).addTo(this.map);

5. 添加点击事件

Leaflet 的交互性很强,我们可以直接给地图上的元素添加点击事件。

javascript 复制代码
javascript
复制编辑
marker.on('click', function(e) {
  alert('标记 clicked!');
  console.log(e);
});

circle.on('click', function(e) {
  alert('圆 clicked!');
  console.log(e);
});

polygon.on('click', function(e) {
  alert('多边形 clicked!');
  console.log(e);
});

点击标记、圆形、多边形时,会弹出提示框,并在控制台打印事件对象。


完整代码

为了方便大家参考,下面是本文完整的 Vue 组件示例:

xml 复制代码
vue
复制编辑
<template>
  <div id="leaflet-map" ref="leafletMap"></div>
</template>

<script>
import L from 'leaflet'
import 'leaflet/dist/leaflet.css'

export default {
  data() {
    return {
      map: null,
      zoom: 11,
      center: [31.230378, 121.473658],
    }
  },
  mounted() {
    this.initMap()
  },
  methods: {
    initMap() {
      this.map = L.map(this.$refs.leafletMap, {
        center: this.center,
        zoom: this.zoom,
        zoomControl: false,
        attributionControl: false
      });

      L.tileLayer('https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', {
        subdomains: '1234',
        maxZoom: 19,
        minZoom: 10
      }).addTo(this.map);

      const icon = L.icon({
        iconUrl: 'https://img2.baidu.com/it/u=1017327473,3649258168&fm=253&fmt=auto&app=138&f=PNG?w=500&h=500',
        iconSize: [50, 50],
      });

      const marker = L.marker([31.230378, 121.473658], { icon, interactive: true }).addTo(this.map);

      const circle = L.circle([31.250578, 121.503158], {
        color: 'red',
        fillColor: '#f03',
        fillOpacity: 0.5,
        radius: 2000
      }).addTo(this.map);

      const polygon = L.polygon([
        [31.227378, 121.4156588],
        [31.224378, 121.4446588],
        [31.291378, 121.4800658],
      ]).addTo(this.map);

      marker.on('click', (e) => {
        alert('标记 clicked!');
        console.log(e);
      });

      circle.on('click', (e) => {
        alert('圆 clicked!');
        console.log(e);
      });

      polygon.on('click', (e) => {
        alert('多边形 clicked!');
        console.log(e);
      });
    }
  }
}
</script>

<style scoped>
#leaflet-map {
  width: 100vw;
  height: 100vh;
}
</style>

总结

以上就是使用 Vue2 + Leaflet 打造一个基础交互地图的全过程。通过简单几步,你就可以在项目中嵌入自定义地图,还可以根据需求扩展更多功能,比如:

  • 地图绘制
  • POI搜索
  • 轨迹播放
  • 热力图分析
  • 自定义图层控制

Leaflet 是一个非常轻量又灵活的地图库,值得在项目中一试!

如果你觉得这篇文章对你有帮助,别忘了点赞 + 收藏哦!😉

相关推荐
FSHOW2 小时前
【独立开发日记】MQ端到端类型安全
前端·javascript·后端
老华带你飞2 小时前
社区互助|基于SSM+vue的社区互助平台的设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·小程序·毕设·社区互助平台
一支鱼2 小时前
前端使用次数最多的工具封装
前端·typescript·编程语言
GIS之路2 小时前
GDAL 简介
前端
前端工作日常3 小时前
单元测试与E2E测试中使用浏览器的原因及区别
前端·单元测试
Js_cold3 小时前
Notepad++使用技巧1
前端·javascript·fpga开发·notepad++
接着奏乐接着舞。4 小时前
前端RSA加密遇到Java后端解密失败的问题解决
java·开发语言·前端
dreams_dream4 小时前
vue中的与,或,非
前端·javascript·vue.js
柳杉4 小时前
使用three.js搭建3d隧道监测-3
前端·javascript·three.js
携欢5 小时前
PortSwigger靶场之Reflected XSS into HTML context with nothing encoded通关秘籍
前端·xss