vue3中使用leaflet加载瓦片地图

在内网部署项目时,不能使用在线地图API,因此采用Leaflet.js库进行离线地图的展示。通过npm安装Leaflet及其contextmenu插件,全局引入并配置地图选项,包括右键菜单功能。地图瓦片使用自定义的服务器路径,需提前下载并在内网服务器上可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中有时会在内网进行部署,这样就不能使用在线地图api,所以就要使用离线地图来满足需求。在这里我们使用leftlet.js库。

首先使用npm进行安装 指令 npm install leaflet --save

找到项目的main.js文件引入并全局注册,也可以在需要使用的vue页面单独引入,由于我的项目在多个页面都有使用到,全局引入更方便些,小伙伴们可以根据需求自行选择。

import 'leaflet/dist/leaflet.css'
import L from 'leaflet'
app.config.globalProperties.L = L

我的项目中有右键菜单的需求,有需要的可以引入以下两个文件,在引入之前需要npm先安装,指令 npm install leaflet-contextmenu --save

import 'leaflet-contextmenu/dist/leaflet.contextmenu.css'
import 'leaflet-contextmenu/dist/leaflet.contextmenu'

 在需要使用的页面粘贴以下代码

<template>
    <div id="offLine"></div>
</template>

<script setup>
    import { onMounted, nextTick } from 'vue'
    let map = null
    const initMap = ()=>{
    map = L.map('offLine', {
        minZoom: 1,
        maxZoom: 18,
        contextmenu: true,//是否开启右键菜单
        contextmenuItems: [
          {
        text: '右键菜单',
        icon: icon1,
        callback: (event) => {
          menuClick(1)
            },
          },
        ],
      }).setView(centerPoint, level)
    
    L.tileLayer('http://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}').addTo(map)
    }
    onMounted(() => {
      nextTick(() => {
        initMap()
      })
    })
<script>

这样就可以在页面上看到加载完成的瓦片地图了,注意这里的'http://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'是在线的瓦片地图源,在内网上使用需要下载瓦片地图放到服务器上 。

### 解决Vue3使用Leaflet瓦片图片加载失败的问题 在 Vue3 中集成 Leaflet 地图库时遇到的常见问题是瓦片图像无法正常加载。这通常是因为路径配置不正确或是资源未被正确引入所致。 为了确保 Leaflet 的默认图标和其他资源能够顺利加载,在项目的入口文件 `main.js` 或者相应的设置文件中应当调整 L.Icon.Default 的属性,以适应 Webpack 或 Vite 构建工具对于静态资源处理的方式[^2]: ```javascript import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; // 导入并修改 Leaflet 默认图标路径 import L from &#39;leaflet&#39;; delete L.Icon.Default.prototype._getIconUrl; L.Icon.Default.mergeOptions({ iconRetinaUrl: require(&#39;leaflet/dist/images/marker-icon-2x.png&#39;), iconUrl: require(&#39;leaflet/dist/images/marker-icon.png&#39;), shadowUrl: require(&#39;leaflet/dist/images/marker-shadow.png&#39;) }); createApp(App).mount(&#39;#app&#39;); ``` 当涉及到 Tile Layer 图像加载失败的情况时,除了上述针对 Icon 资源的操作外,还需要确认所使用的 Tile URL 是否有效,并且网络请求可以成功到达目标服务器获取到地图切片数据。如果是在本地开发环境中测试,则可能需要考虑跨域资源共享 (CORS) 设置问题。 另外一种可能是由于某些浏览器的安全策略阻止了来自不同域名下的 HTTP 请求,这时可以在创建 Map 实例之前通过设定合适的 CORS 头来解决问题;或者是更换为支持 HTTPS 协议的地图服务提供商所提供的 Tile URL 来规避此类安全限制。 最后值得注意的是,在 Vue 组件内部定义 map 初始化逻辑的时候要确保 DOM 已经完成渲染再执行相关操作,可以通过 mounted 生命周期钩子函数来进行这一工作[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值