vue使用leafLet方式(绘图工具)
作者:清虚桂意
这篇文章主要介绍了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(); }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。