• Vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)


    场景

    Vue+Leaflet实现加载OSM显示地图:

    Vue+Leaflet实现加载OSM显示地图_霸道流氓气质的博客-CSDN博客

    在上面加载显示OSM的基础上,使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。

    Leaflet.pm插件

    用于创建和编辑几何图层的插件

    可绘制、编辑、拖动、剪切和捕捉图层

    支持标记、CircleMarkers、折线、多边形、圆形、矩形、LayerGroups、GeoJSON 和 MultiPolygons

    npm以及文档地址:

    leaflet.pm - npm

    在线演示地址:

    Leaflet-Geoman Pro

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    1、首先已经安装并引入了leaflet,其次安装leaflet.pm

    npm i leaflet.pm

    npm i leaflet.pm

     

     

    2、页面中引入

    1. import 'leaflet.pm';
    2. import 'leaflet.pm/dist/leaflet.pm.css';

    3、地图上添加组件,并设置哪些按钮显示

    1.       // 添加绘制工具
    2.       this.map.pm.setLang("zh");
    3.       this.map.pm.addControls({
    4.         position: "topleft",
    5.         drawPolygon: true, //绘制多边形
    6.         drawMarker: false, //绘制标记点
    7.         drawCircleMarker: false, //绘制圆形标记
    8.         drawPolyline: true, //绘制线条
    9.         drawRectangle: false, //绘制矩形
    10.         drawCircle: false, //绘制圆圈
    11.         editMode: true, //编辑多边形
    12.         dragMode: true, //拖动多边形
    13.         cutPolygon: true, //添加⼀个按钮以删除多边形⾥⾯的部分内容
    14.         removalMode: true, //清除多边形
    15.       });

    4、设置样式、设置事件

    1.       // 全局设置绘制样式
    2.       this.map.pm.setPathOptions({
    3.         color: "orange",
    4.         fillColor: "green",
    5.         fillOpacity: 0.4,
    6.       });
    7.       // 或者单独设置绘制样式
    8.       var options = {
    9.         // 连接线标记之间的线
    10.         templineStyle: {
    11.           color: "red",
    12.         },
    13.         // 提⽰线从最后⼀个标记到⿏标光标的线
    14.         hintlineStyle: {
    15.           color: "red",
    16.           dashArray: [5, 5],
    17.         },
    18.         // 绘制完成的样式
    19.         pathOptions: {
    20.           color: "orange",
    21.           fillColor: "green",
    22.         },
    23.       };
    24.       // 激活绘制多边形功能-1、单独设置某个模式的样式
    25.       this.map.pm.enableDraw("Polygon", options);
    26.       // 启用绘制--多边形功能
    27.       this.map.pm.enableDraw("Polygon", {
    28.         snappable: true, //启⽤捕捉到其他绘制图形的顶点
    29.         snapDistance: 20, //顶点捕捉距离
    30.       });
    31.       // 关闭绘制--注意也可以关闭其他模式的绘制功能
    32.       this.map.pm.disableDraw("Polygon");
    33.       // 绘制事件监听
    34.       this.map.on("pm:drawstart", (e) => {
    35.         console.log(e, "绘制开始第一个点");
    36.       });
    37.       this.map.on("pm:drawend", (e) => {
    38.         console.log(e, "禁⽌绘制、绘制结束");
    39.       });
    40.       this.map.on("pm:create", (e) => {
    41.         console.log(e, "绘制完成时调⽤");
    42.         if (e.shape == "Circle") {
    43.           console.log(e.layer._latlng, e.layer._radius, "绘制坐标");
    44.         } else {
    45.           console.log(e.layer._latlngs[0], "绘制坐标");
    46.         }
    47.       });
    48.       this.map.on("pm:globalremovalmodetoggled", (e) => {
    49.         console.log(e, "清除图层时调用");
    50.       });

    5、其他属性、事件说明等参考官方说明

     

    6、完整示例代码

    1. <template>
    2.   <div id="map" class="map">div>
    3. template>
    4. <script>
    5. import "leaflet/dist/leaflet.css";
    6. import L from "leaflet";
    7. import "leaflet.pm";
    8. import "leaflet.pm/dist/leaflet.pm.css";
    9. export default {
    10.   name: "leafletPm",
    11.   data() {
    12.     return {
    13.       map: null,
    14.       OSMUrl: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
    15.     };
    16.   },
    17.   mounted() {
    18.     this.initMap();
    19.   },
    20.   methods: {
    21.     initMap() {
    22.       this.map = L.map("map");
    23.       this.map.setView([34.03, -118.15], 13);
    24.       let tileLayer = L.tileLayer(this.OSMUrl);
    25.       tileLayer.addTo(this.map);
    26.       // 添加绘制工具
    27.       this.map.pm.setLang("zh");
    28.       this.map.pm.addControls({
    29.         position: "topleft",
    30.         drawPolygon: true, //绘制多边形
    31.         drawMarker: false, //绘制标记点
    32.         drawCircleMarker: false, //绘制圆形标记
    33.         drawPolyline: true, //绘制线条
    34.         drawRectangle: false, //绘制矩形
    35.         drawCircle: false, //绘制圆圈
    36.         editMode: true, //编辑多边形
    37.         dragMode: true, //拖动多边形
    38.         cutPolygon: true, //添加⼀个按钮以删除多边形⾥⾯的部分内容
    39.         removalMode: true, //清除多边形
    40.       });
    41.       // 全局设置绘制样式
    42.       this.map.pm.setPathOptions({
    43.         color: "orange",
    44.         fillColor: "green",
    45.         fillOpacity: 0.4,
    46.       });
    47.       // 或者单独设置绘制样式
    48.       var options = {
    49.         // 连接线标记之间的线
    50.         templineStyle: {
    51.           color: "red",
    52.         },
    53.         // 提⽰线从最后⼀个标记到⿏标光标的线
    54.         hintlineStyle: {
    55.           color: "red",
    56.           dashArray: [5, 5],
    57.         },
    58.         // 绘制完成的样式
    59.         pathOptions: {
    60.           color: "orange",
    61.           fillColor: "green",
    62.         },
    63.       };
    64.       // 激活绘制多边形功能-1、单独设置某个模式的样式
    65.       this.map.pm.enableDraw("Polygon", options);
    66.       // 启用绘制--多边形功能
    67.       this.map.pm.enableDraw("Polygon", {
    68.         snappable: true, //启⽤捕捉到其他绘制图形的顶点
    69.         snapDistance: 20, //顶点捕捉距离
    70.       });
    71.       // 关闭绘制--注意也可以关闭其他模式的绘制功能
    72.       this.map.pm.disableDraw("Polygon");
    73.       // 绘制事件监听
    74.       this.map.on("pm:drawstart", (e) => {
    75.         console.log(e, "绘制开始第一个点");
    76.       });
    77.       this.map.on("pm:drawend", (e) => {
    78.         console.log(e, "禁⽌绘制、绘制结束");
    79.       });
    80.       this.map.on("pm:create", (e) => {
    81.         console.log(e, "绘制完成时调⽤");
    82.         if (e.shape == "Circle") {
    83.           console.log(e.layer._latlng, e.layer._radius, "绘制坐标");
    84.         } else {
    85.           console.log(e.layer._latlngs[0], "绘制坐标");
    86.         }
    87.       });
    88.       this.map.on("pm:globalremovalmodetoggled", (e) => {
    89.         console.log(e, "清除图层时调用");
    90.       });
    91.     },
    92.   },
    93. };
    94. script>
    95. <style scoped>
    96. .map {
    97.   width: 100%;
    98.   height: 400px;
    99. }
    100. style>

    7、运行效果

     

  • 相关阅读:
    【区块链 | 以太坊】EVM 学习手册
    dbExpress Driver for Oracle
    python字典(dictionary)
    topk算法-leetcode java题解
    pat_basic_1016 部分A+B
    两种常见矩形框旋转方法推导及其C++实现
    STC - 同时外挂扩展RAM和12864时, C库函数失效的问题
    95. 最长公共子序列
    【分享】如何使用集简云的“数组拆分“ 功能
    Django系列3-Django常用命令
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126351717