在内网中使用leaflet和leaflet-geoman

前提: 项目需要在内网进行,需求是在地图上进行画矩形,画多边形,画圆。

查了很多资料发现,离线瓦片地图是要通过软件进行下载并且使用 leaflet插件 的 tileLayer方法 进行拼接才可以显示出来。
(注:有很多软件是要收费的,找了一个免费的,现在分享链接:http://www.allmapsoft.com/omm/download.html

一、打开软件如下:

(1)总共有19个级别
From zoom:开始的级别
To zoom:最后的级别

(2)填写经纬度的信息
(3)填写图片的保存位置

 

数据填完之后,离线瓦片地图就做好了。

 二、使用leaflet和leaflet-geoman插件
(1)安装:npm install leaflet
                    npm install @geoman-io/leaflet-geoman-free
(2)全局引入插件,在main.js中引入:
import 'leaflet/dist/leaflet.css';
import * as L from 'leaflet';
import '@geoman-io/leaflet-geoman-free';
import '@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css';
Vue.L = Vue.prototype.$L = L
(3)在vue文件中使用:
<div id="map"></div>

mounted() {
  this.initData();
}
methods: {
  initData() {
    this.map = L.map("map", {
      attributionControl: false //去除右下角leaflet标识
    })
    L.tileLayer("./test/{z}/{x}/{y}.png", {
       minZoom: 3,
       maxZoom: 6,
       noWrap: true    //解决背景图片重复的问题
   }).addTo(this.map);
   // 根据坐标来画图
   

  // L.circle(纬度, 经度)  
  var circle = L.circle([40.3130432088809, 96.767578125], {
        color: "red",
        fillColor: "#f03",
        fillOpacity: 0.5,
        radius: 1036308.1917954731
   }).addTo(this.map);

   

 //  添加左侧按钮
 this.map.pm.addControls({
        // position: "topleft",
        drawPolygon: true, // 添加绘制多边形
        drawMarker: false, //添加按钮以绘制标记
        drawRectangle: true, //添加按钮绘制矩形
        drawCircleMarker: false, //添加按钮以绘制圆形标记
        drawPolyline: false, //添加按钮绘制线条

        drawCircle: false, //  添加按钮绘制圆圈
        editMode: false, //  添加按钮编辑多边形
        dragMode: false, //   添加按钮拖动多边形
        cutPolygon: false, // 添加一个按钮以删除图层里面的部分内容
        removalMode: true, // 清除图层
   });

  

// 设置绘制线条颜色
      this.map.pm.setPathOptions({
        color: "orange",
        fillColor: "green",
        fillOpacity: 0.4,
      });
      this.map.pm.setLang("zh"); //设置语言  en, de, it, ru, ro, es, fr, pt_br, zh , nl
      this.getlatLngs();


  }
}

getlatLngs() {
      var latlngsStr = "";
      this.map.on("pm:create", (e) => {
        var shape = e.shape;
        var layer = e.layer;
        if (shape !== "Circle") {
          for (
            var latlngslength = 0;
            latlngslength < layer._latlngs[0].length;
            latlngslength++
          ) {
            latlngsStr +=
              "经度:<font>" +
              layer._latlngs[0][latlngslength].lng +
              ",纬度:" +
              layer._latlngs[0][latlngslength].lat +
              "</font><br>";
          }
          console.log(latlngsStr);
        } else {
       // 获取圆形的圆心经纬度和半径
          console.log(
            "经度:" + layer._latlng.lng + ", 纬度" + layer._latlng.lat
          );
          console.log("半径:" + layer._mRadius);
        }

        // 获取拖拽后的信息
        layer.on("pm:edit", (e) => {
          console.log("拖动");
          if (shape !== "Circle") {
            console.log(e.target._latlngs[0], "拖动后的坐标");
          } else {
            console.log(e.target);
            console.log(
              "拖动后的纬度是:" +
                e.target._latlng.lat +
                ",纬度是:" +
                e.target._latlng.lng
            );
          }
        });
      });
    },

 

posted @ 2022-06-01 16:55  always_strive  阅读(1216)  评论(0编辑  收藏  举报