【vue+leaflet】vue使用leaflet.pm保存绘制后的图层的点位信息、图层回显、平面图切换、地图事件函数、图层事件函数说明(二)

本文介绍了如何在Vue项目中利用Leaflet实现平面图切换、图层点位信息存储与回显、图层删除及编辑事件。通过地图事件和图层事件,展示了详细的操作流程,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

在这里插入图片描述
看效果展示:

【vue+leaflet】第二节效果展示视频

1.平面图切换,多个平面图切换展示

    <div class="select">
      <span>平面图:</span>
      <el-select v-model="pic" placeholder="全部" clearable filterable @change="initDate">
        <el-option :label="item.name" v-for="(item, index) in picArr" :key="index" :value="item.id"> </el-option>
      </el-select>
    </div>
    ...
    pic: 0,
      picArr: [
        { id: 0, name: '1楼平面图', points: [] },
        { id: 1, name: '2楼平面图', points: [] },
        { id: 2, name: '3楼平面图', points: [] },
      ],
      imageOverlay: '',

来一个select展示多个平面图的下拉列表,点击切换更换平面图

initDate(){
	// 这段是为了切换的时候把上一个平面图中所有图层全删掉,防止携带到下一个平面图中
	  // 循环遍历图层删除
      this.map.eachLayer((layer) => {
        if (layer._latlngs != null || layer._latlng != null) {
          layer.remove()
        }
      })
      ...
      // select切换时,获取v-model绑定的id,动态更新平面图
      let url = require(`../../public/home/bgc${this.pic}.jpg`)
      ...
      // imageOverlay有值代表已经绘制过地图和平面图,切换平面图就换换url和尺寸就可以了
      // else 没值,就初始化加载一遍平面图到地图中.
       // 添加图片,更换图片
       if (this.imageOverlay) {
         this.imageOverlay.setUrl(url)
         this.imageOverlay.setBounds(this.bounds)
       } else {
         this.imageOverlay = L.imageOverlay(url, this.bounds).addTo(this.map)
       }
}

在这里插入图片描述

2.存储绘制图层的点位信息 (地图事件)

项目中是掉接口进行保存的,这里用本地缓存替换一下.都是一样的步骤

this.map.on('pm:create', this.createClick)//通过这个绑定的,这个写在initDate方法中
   // 图层绘制完成事件
    createClick(e) {
      // console.log('图层绘制完成', e)
      // 获取缓存的图层数据,看看之前有没有绘制过,本次绘制完push到改集合中
      let res = JSON.parse(localStorage.getItem('layers')) || []
      // 没有值没有绘制,赋个值初始值
      if (!res[this.pic]) res[this.pic] = []
      // 只要两个参数即可保存该图层信息,id和经纬度
      let obj = {
        _leaflet_id: e.layer._leaflet_id,
        latlngs: e.layer._latlngs,
      }
      res[this.pic].push(obj)
      localStorage.setItem('layers', JSON.stringify(res))
      // 给图层绑定点击、拖拽、编辑事件
      e.layer.on('pm:edit', this.editLayClick).on('click', this.layClick).on('pm:dragend', this.dragendLayClick)
    },

3.回显存储过的图层点位信息

回显就在平面图初始化的时候回显就可以了

initDate(){
	...
	      // 获取本地存储的图层数据
      let res = JSON.parse(localStorage.getItem('layers')) || []
      // 当前平面图下如果有绘制的图层,就进行回显
      if (res[this.pic]) {
        // 循环绘制图层
        res[this.pic].forEach((e) => {
          let lay = L.polygon(e.latlngs).addTo(this.map).on('pm:edit', this.editLayClick).on('click', this.layClick).on('pm:dragend', this.dragendLayClick)
          // 这个id每次刷新,来回切换平面图,都会改变,所以要更新一下,如果不更新,下面删除,拖拽,编辑,的时候就找不到图层了
          e._leaflet_id = lay._leaflet_id
        })
        localStorage.setItem('layers', JSON.stringify(res))
      }
      ...
}

4.图层删除事件 (地图事件)

 this.map.on('pm:remove', this.removeClick) // 在initDate方法中注册
 removeClick(){
	     // console.log('图层删除', e)
      let res = JSON.parse(localStorage.getItem('layers')) || []
      res[this.pic].forEach((d, i) => {
        if (d._leaflet_id == e.layer._leaflet_id) {
          res[this.pic].splice(i, 1)
        }
      })
      localStorage.setItem('layers', JSON.stringify(res))
 }

5.图层拖拽、编辑事件(图层事件)

拖拽和编辑其实差不多,拖拽后会走拖拽事件和编辑事件,因为项目没什么特殊要求,所以把拖拽和编辑后的逻辑处理统一写在编辑事件里面了
拖拽走过dragendLayClick方法后还会走editLayClick方法,编辑只会走editLayClick方法
// 在createClick图层绘制的方法中注册绑定的
   // 区域图层拖拽
    dragendLayClick(e) {
      console.log('图层拖拽', e)
    },
    // 区域图层编辑
    editLayClick(e) {
      console.log('图层编辑', e)
      let res = JSON.parse(localStorage.getItem('layers'))
      // 循环遍历更新一下id和经纬度就可以了
      res[this.pic].forEach((d) => {
        if (d._leaflet_id == e.target._leaflet_id) {
          d.latlngs = e.target._latlngs
          d._leaflet_id = e.target._leaflet_id
        }
      })
      localStorage.setItem('layers', JSON.stringify(res))
    },

所有示例代码已上传,点击前往获取
Done!

  • 87
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
对于vue2-leaflet软件包的MovingMarker插件扩展,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了vue2-leafletvue2-leaflet-movingmarker软件包。你可以使用npm或yarn进行安装。 ``` npm install vue2-leaflet vue2-leaflet-movingmarker ``` 2. 在你的Vue组件中,导入所需的库。 ```javascript import { LMap, LTileLayer, LMarker } from 'vue2-leaflet' import 'leaflet/dist/leaflet.css' import 'leaflet-movingmarker/MarkerMoving.css' import 'leaflet-movingmarker/MarkerMoving.js' ``` 3. 在Vue组件中,添加`l-moving-marker`标签,并使用`ref`属性命名。 ```html <template> <l-map :zoom="zoom" :center="center"> <l-tile-layer :url="url"></l-tile-layer> <l-marker :lat-lng="markerLatLng" ref="movingMarker"></l-marker> </l-map> </template> ``` 4. 在Vue组件的`mounted`生命周期钩子中,获取`movingMarker`实例,并使用其API进行动画设置。 ```javascript mounted() { const movingMarker = this.$refs.movingMarker.movingMarker const latLngs = [ [51.5, -0.09], // 起始位置 [52.5, -0.09], // 中间位置 [53.5, -0.09] // 结束位置 ] movingMarker.on('end', () => { // 动画结束时的回调函数 }) movingMarker.startMove(latLngs, 5000) // 每个位置之间的时间间隔为5000毫秒 } ``` 通过以上步骤,你可以在Vue应用中使用vue2-leaflet软件包的MovingMarker插件扩展来创建移动标记的动画效果。请注意,具体的使用方式可能会根据你的项目配置而有所不同,以上仅为示例。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨同学*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值