Mapbox封装图形绘制工具 线,圆,polygon,删除,点 mapbox-gl-draw-circle mapbox-gl-draw

使用插件,安装

javascript 复制代码
npm install mapbox-gl-draw-circle   //绘制圆
npm install @mapbox/mapbox-gl-draw   //绘制点线面删除

相关API地址:https://github.com/mohong/mapbox-gl-draw-circle
https://github.com/mapbox/mapbox-gl-draw/blob/main/docs/API.md

vue案例,封装的组件

javascript 复制代码
<!--
 * @Description: 地图绘制
-->

<template>
  <div class="draw_map"></div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
//import {  } from '@/config/http/url';
import {
  CircleMode,
  DragCircleMode,
  DirectMode,
  SimpleSelectMode,
} from "mapbox-gl-draw-circle";
import MapBoxDraw from "@mapbox/mapbox-gl-draw";
import "@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css";
export default {
  name: "",
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {
    tools: {
      type: Object,
      default: () => {
        return {
          point: true,
          line_string: true,
          polygon: true,
          trash: true,
          circle: true,
        };
      },
    },
  },
  data() {
    //这里存放数据
    return {};
  },
  directives: {},
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {
    /**
     * @description: 添加绘制圆控件
     * @param {*} draw  new MapBoxDraw
     * @return {*}
     * @author: 邢康
     */
    addCircleControl(draw) {
      // mapboxgl-ctrl
      let parent = document.getElementsByClassName("mapboxgl-ctrl")[0];
      let brother = document.getElementsByClassName("mapbox-gl-draw_trash")[0];
      let newChild = document.createElement("button");
      newChild.title = "Circle";
      newChild.className = "mapbox-gl-draw_ctrl-draw-btn mapbox-gl-draw_circle";
      newChild.innerHTML = "⚪";
      newChild.style.color = "black";
      newChild.addEventListener("click", () => {
        draw.changeMode("draw_circle", {
          initialRadiusInKm: Math.floor(100 / window.myMap.getZoom()),//根据地图缩放层级计算默认半径
        });
      });
      parent.insertBefore(newChild, brother);
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {},
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() {
    const draw = new MapBoxDraw({
      displayControlsDefault: false,
      userProperties: true,
      controls: this.tools,
      modes: {
        ...MapBoxDraw.modes,
        draw_circle: CircleMode,
        drag_circle: DragCircleMode,
        direct_select: DirectMode,
        simple_select: SimpleSelectMode,
      },
    });
    let time = setInterval(() => {
      let map = window.myMap; //mapbox对象,根据需要更改
      if (map) {
        clearInterval(time);
        map.addControl(draw);
        map.on("draw.create", (e) => {
          console.log(e);

          this.$emit("drawCreate", e);
        });
        map.on("draw.update", (e) => {
          console.log(e);

          this.$emit("drawUpdate", e);
        });
        this.tools.circle && this.addCircleControl(draw);
      }
    }, 1000);
  },
  beforeCreate() {}, //生命周期 - 创建之前
  beforeMount() {}, //生命周期 - 挂载之前
  beforeUpdate() {}, //生命周期 - 更新之前
  updated() {}, //生命周期 - 更新之后
  beforeDestroy() {}, //生命周期 - 销毁之前
  destroyed() {}, //生命周期 - 销毁完成
  activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style lang="less" scoped>
//@import ''; 引入公共css类
::v-deep .mapboxgl-ctrl-top-right {
  right: 15px !important;
}
</style>

使用方式,通过tools控制需要哪些绘制控件

javascript 复制代码
    <draw-map
      :tools="{
        // point: true,
        // line_string: true,
        polygon: true,
        trash: true,
        // circle: true,
      }"
    ></draw-map>

相关问题处理

安装mapbox-gl-draw-circle,引入后运行编译报错 can't resolve 'fs'...

{path:false}...此类错误

在vue.config.js中配置configureWebpack>resolve>alias添加path:false,

resolve中添加fallback: { fs: false },

javascript 复制代码
 config.resolve = {
      alias: {
        "@": path.join(__dirname, "./src"),
        "@public": path.join(__dirname, "./public"),

        vue: "vue/dist/vue.esm.js",
        path: false,
      },
      fallback: { fs: false },
    };

最终效果:

相关推荐
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
hackeroink5 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
迷雾漫步者6 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-7 小时前
验证码机制
前端·后端
燃先生._.8 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖9 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
m0_748235249 小时前
前端实现获取后端返回的文件流并下载
前端·状态模式
m0_748240259 小时前
前端如何检测用户登录状态是否过期
前端
black^sugar9 小时前
纯前端实现更新检测
开发语言·前端·javascript