vue使用leafLet方式(绘图工具)

 更新时间:2024年08月10日 17:06:33   作者:清虚桂意  
这篇文章主要介绍了vue使用leafLet方式(绘图工具),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

安装

npm install leaflet
npm install leaflet.pm

引入,在项目main.js中

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";

// 引入Leaflet对象 挂载到Vue上,便于全局使用,也可以单独页面中单独引用
import * as L from "leaflet";
import "leaflet/dist/leaflet.css";
import "leaflet.pm";
import "leaflet.pm/dist/leaflet.pm.css";

Vue.config.productionTip = false;
Vue.L = Vue.prototype.$L = L;

/* leaflet icon */
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
  iconRetinaUrl: require("leaflet/dist/images/marker-icon-2x.png"),
  iconUrl: require("leaflet/dist/images/marker-icon.png"),
  shadowUrl: require("leaflet/dist/images/marker-shadow.png"),
});

new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount("#app");

初始化地图

初始化

this.map = L.map("map", {
	  center: [40.02404009136253, 116.50641060224784], // 地图中心
	  zoom: 14, //缩放比列
	  zoomControl: false, //禁用 + - 按钮
	  doubleClickZoom: false, // 禁用双击放大
	  attributionControl: false, // 移除右下角leaflet标识
});

引入图层,可以引入多个图层

let gaoDeLayer = L.tileLayer(
  "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}"
)
gaoDeLayer.addTo(this.map);

地图事件

// 添加地图点击弹窗
this.map.on('click', (e) => {
   L.popup().setLatLng(e.latlng)
     .setContent("You clicked the map at " + e.latlng.toString())
     .openOn(this.map);
 });

添加绘制工具

引入leafle.pm原生组件

this.map.pm.addControls({
	  position: "topleft",
	  drawPolygon: true, // 绘制多边形
	  drawMarker: false, //绘制标记点
	  drawCircleMarker: false, //绘制圆形标记
	  drawPolyline: false, //绘制线条
	  drawRectangle: true,	//绘制矩形
	  drawCircle: false, //绘制圆圈
	  editMode: true, //编辑多边形
	  dragMode: true, //拖动多边形
	  cutPolygon: true, // 添加一个按钮以删除多边形里面的部分内容
	  removalMode: true  // 清除多边形
});

设置绘图样式

接收参数

1、单独设置某个模式的样式

// 控制绘制样式  如下给Polygon多边形设置样式
var options = {
  // 连接线  标记之间的线
  templineStyle: {
    color: 'red',
  },
  // 提示线  从最后一个标记到鼠标光标的线
  hintlineStyle: {
    color: 'red',
    dashArray: [5, 5],
  },
  // 绘制完成的样式
  pathOptions: {
    color: 'orange',
    fillColor: 'green',
  },
};
// 会激活绘制多边形功能
this.map.pm.enableDraw('Polygon', options);

2、设置全局的pathOptions样式

this.map.pm.setPathOptions({
  color: 'orange',
  fillColor: 'green',
  fillOpacity: 0.4,
});

设置语言

//设置语言  en, de, it, ru, ro, es, fr, pt_br, zh , nl
this.map.pm.setLang('zh');  

自定义绘图按钮

Drawing Mode绘图模式

// 启用绘制多边形功能
map.pm.enableDraw('Polygon', {
  snappable: true,//启用捕捉到其他绘制图形的顶点
  snapDistance: 20,//顶点捕捉距离
});
 
// 关闭绘制  注意也可以关闭其他模式的绘制功能
map.pm.disableDraw('Polygon');

绑定按钮

<template>
  <div class="home">
    <button @click="drawRectangle">绘制矩形</button>
    <button @click="drawCircle">绘制圆</button>
    <button @click="disableDraw">关闭绘制</button>

    <div id="map"></div>
  </div>
</template>
drawRectangle () {
  this.map.pm.enableDraw('Rectangle', {
    snappable: true,
    snapDistance: 20,
  });
},
drawCircle () {
  this.map.pm.enableDraw('Circle', {
    snappable: true,
    snapDistance: 20,
  });
},
disableDraw () {
  this.map.pm.disableDraw('Rectangle');
},

获取绘制的坐标

//pm:drawstart 开始第一个点的时候调用
//pm:drawend  禁止绘制时调用
//pm:create  图形创建完成时调用
this.map.on("pm:drawstart", e => {
  console.log(e, "first");
});
this.map.on("pm:drawend", e => {
  console.log(e, "禁止绘制");
});
this.map.on("pm:create", e => {
  console.log(e, "绘制完成时调用");
  if (e.shape == "Circle") {
    console.log(e.layer._latlng, e.layer._radius, "绘制坐标")
  } else {
    console.log(e.layer._latlngs[0], "绘制坐标")
  }
});

自定义编辑按钮

绘制多边形

官方详解

      // 绘制多边形
      let latlngs = [
        [50.0214690112063, 116.50239229202272],
        [50.019694293123855, 116.50224208831787],
        [50.01979288978388, 116.50580406188966],
        [50.021436146476105, 116.50601863861085],
        [50.02253710631967, 116.50316476821901]
      ];
      // color:线段颜色
      // weight:线段宽度
      // opacity:线段透明度
      // dashArray:虚线间隔
      // fill:是否填充内部(true/false)
      // fillColor:内部填充颜色,如不设置,默认为color颜色
      // fillOpacity:内部填充透明度
      this.myPolygon = L.polygon(latlngs, { color: "red" }).addTo(this.map);
      // 调整地图视图中心点为多边形中心点
      this.map.setView(this.myPolygon.getCenter(), 16)

Edit Mode 编辑功能

layer为需要改变的图层,即矢量元素(如多边形等)

<button @click="enableEdit">编辑</button>
<button @click="disableEdit">关闭编辑</button>

// 编辑
enableEdit () {
  let layer = this.myPolygon
  // 添加可编辑功能
  layer.pm.enable({
    allowSelfIntersection: false,
  });
  
  // 监听编辑事件
  layer.on('pm:vertexadded', e => {
    console.log(e, "添加顶点")
  });
  layer.on('pm:edit', e => {
    console.log(e, "拖动");
    console.log(e.target._latlngs[0], "拖动后的坐标")
  });
},

// 关闭编辑
disableEdit () {
  let layer = this.myPolygon
  layer.pm.disable()
}

全局编辑

// 开启全体编辑
this.map.pm.enableGlobalEditMode();
// 禁用全局编辑
this.map.pm.disableGlobalEditMode()
// 全局编辑切换
this.map.pm.toggleGlobalEditMode();
// 判断是否全局编辑,有返回值
let isEdit = this.map.pm.globalEditEnabled();

Drag Mode 拖拽模式

// 全局拖拽模式切换
this.map.pm.toggleGlobalDragMode();
// 是否启用全局拖动模式,有返回值
console.log(this.map.pm.globalDragModeEnabled())

// 全局的拖拽模式切换监听器
this.map.on('pm:globaldragmodetoggled', e => {
  console.log(e);
});
// 单个元素添加拖拽监听
let layer = this.myPolygon
layer.on('pm:dragend', e => {
  console.log(e, "拖拽")
});

Removal Mode 移除模式

map.pm.toggleGlobalRemovalMode();
map.pm.globalRemovalEnabled()

Cutting Mode 剪切模式

<button @click="enableCut">启用剪辑</button>
<button @click="disableCut">关闭剪辑</button>

enableCut () {
  // 开启剪切功能
  this.map.pm.Draw.Cut.enable({
    allowSelfIntersection: false,
  });
  // 单个元素添加剪切监听
  let layer = this.myPolygon
  layer.on('pm:cut', e => {
    console.log(e, "剪切")
  });
},
disableCut () {
  // 关闭剪切功能
  this.map.pm.Draw.Cut.disable();
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue实现div高度可拖拽

    vue实现div高度可拖拽

    这篇文章主要为大家详细介绍了vue实现div高度可拖拽,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • vue 开发企业微信整合案例分析

    vue 开发企业微信整合案例分析

    这篇文章主要介绍了vue 开发企业微信整合,结合具体案例形式分析了vue.js使用企业微信JSSDK实现手机端程序可以和企业微信进行整合功能的相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • Vue插件之滑动验证码

    Vue插件之滑动验证码

    这篇文章主要为大家详细绍介绍了Vue插件之滑动验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 解决vue.js not detected的问题

    解决vue.js not detected的问题

    本文主要介绍了解决vue.js not detected的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • vscode 开发Vue项目的方法步骤

    vscode 开发Vue项目的方法步骤

    这篇文章主要介绍了vscode 开发Vue项目的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Vue中如何使用Map键值对传参详析

    Vue中如何使用Map键值对传参详析

    最近在做一个vue的项目,碰到一点关于Map键值对传参的问题,下面这篇文章主要给大家介绍了关于Vue中如何使用Map键值对传参的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Vue组件开发技巧总结

    Vue组件开发技巧总结

    这篇文章通过代码示例给大家详细分析了Vue组件开发的相关技巧以及知识点,对此有需要的读者们参考下吧。
    2018-03-03
  • vue.js 子组件无法获取父组件store值的解决方式

    vue.js 子组件无法获取父组件store值的解决方式

    今天小编就为大家分享一篇vue.js 子组件无法获取父组件store值的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vuejs中监听窗口关闭和窗口刷新事件的方法

    vuejs中监听窗口关闭和窗口刷新事件的方法

    今天小编就为大家分享一篇vuejs中监听窗口关闭和窗口刷新事件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue事件监听函数on中的this指针域使用

    vue事件监听函数on中的this指针域使用

    这篇文章主要介绍了vue事件监听函数on中的this指针域使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论