【vue+baiduMap】百度地图绘制多边形区域

news2024/9/21 8:04:09

在这里插入图片描述

1、创建百度地图应用,获取权限ak

百度地图服务台
在这里插入图片描述

Ps.本项目里按钮等基础控件使用的是element-ui版本控件

2、项目内全局引入

index.html页面插入引用代码:

<script
      src="//api.map.baidu.com/api?v=2.0&ak=你的密钥"
      type="text/javascript"
></script>

在这里插入图片描述

3、项目完整代码

template:

<template>
  <div class="map-wrap">
    <h1>{{ title }}</h1>
    <div class="flex">
      <div class="button-wrap">
        <el-button
          size="small"
          type="primary"
          icon="el-icon-edit"
          @click="handleDraw('polygon')"
          >编辑</el-button
        >
        <el-button size="small" icon="el-icon-check" @click="handelFinishDraw"
          >完成</el-button
        >
        <el-button
          size="small"
          icon="el-icon-refresh-left"
          @click="handleClearDraw"
          >重置</el-button
        >
      </div>
      <div class="picker-color">
        <div class="text">选择颜色</div>
        <span
          @click="handleChangeColor(item)"
          v-for="item in colors"
          :key="item.code"
          :class="[
            'color' + item.code,
            drawColor == item.value ? 'active' : '',
          ]"
        >
          <i v-if="drawColor == item.value" class="el-icon-check"></i>
          <i v-else>&nbsp;</i>
        </span>
      </div>
    </div>
    <!--  <div :id="mapId" class="allmap" /> -->
    <div>
      <baidu-map
        ak="123"
        class="baidu-map allmap"
        :center="center"
        :zoom="zoom"
        :scroll-wheel-zoom="true"
        :mapClick="false"
        @click="mapClick"
        @rightclick="mouseOverEvent = false"
        @mousemove="syncPolygon"
      >
        <bm-marker
          v-if="mouseOverEvent && isediting"
          :position="labelPostion"
          :icon="{ url: iconimg, size: { width: 32, height: 32 } }"
        >
          <bm-label
            content="双击鼠标开始绘制,右击鼠标结束绘制"
            :labelStyle="labelStyle"
            :offset="{ width: 35, height: 20 }"
          />
        </bm-marker>
        <bm-polygon
          :path="paths"
          :stroke-color="drawColor"
          :stroke-opacity="1"
          :stroke-weight="4"
          :fill-color="drawColor"
          :fill-opacity="0.2"
          :editing="isediting"
          @lineupdate="updatePolygonPath"
        />
      </baidu-map>
    </div>
  </div>
</template>

js:

<script>
import iconimg from "@/assets/logo.png";
import BaiduMap from "vue-baidu-map/components/map/Map.vue";
import BmMarker from "vue-baidu-map/components/overlays/Marker.vue";
import BmPolygon from "vue-baidu-map/components/overlays/Polygon.vue";
import BmLabel from "vue-baidu-map/components/overlays/Label";
export default {
  props: {
    defaultArea: {
      type: Array,
      default: () => [],
    },
    defaultColor: String,
  },
  components: { BaiduMap, BmMarker, BmPolygon, BmLabel },
  data() {
    return {
      title: "地图绘制展示页",
      center: {
        lng: 111.695793,
        lat: 40.822495,
      },
      iconimg: iconimg,
      isediting: true,
      labelPostion: { lng: 111.695793, lat: 40.822495 },
      labelStyle: {
        padding: "3px 5px",
        color: "#333",
        fontSize: "14px",
        background: "#fff",
        border: "1px solid #efefef",
      },
      mouseOverEvent: true,
      isediting: false,
      paths: [],
      zoom: 15,
      markers: [],
      map: null,
      mapId: null,
      actNav: null,
      drawColor: "#2A8DFF",
      drawingManagers: null,
      colors: [
        { code: 1, value: "#FF6B36" },
        { code: 2, value: "#FFAD29" },
        { code: 3, value: "#FFDA21" },
        { code: 4, value: "#29E98F" },
        { code: 5, value: "#1EEDE6" },
        { code: 6, value: "#2A8DFF" },
        { code: 7, value: "#CC16EF" },
        { code: 8, value: "#F53ABD" },
      ],
    };
  },
  created() {},
  mounted() {},
  watch: {
    defaultArea: {
      handler(val) {
        if (val) {
          this.drawColor = this.defaultColor || "#2A8DFF";
          this.$nextTick(() => {
            if (val) {
              this.mouseOverEvent = false;
              this.drawDefault(val);
            }
          });
        }
      },
      immediate: true,
      deep: true,
    },
  },
  methods: {
    //编辑多边形
    updatePolygonPath(e) {
      this.paths = e.target.getPath();
      console.log(e);
    },
    //鼠标移动
    syncPolygon(e) {
      if (!this.isediting) {
        return;
      }
      if (!this.paths.length) {
        return;
      }
      if (!this.mouseOverEvent) {
        return;
      }
      this.labelPostion = e.point;
      this.$set(this.paths, this.paths.length - 1, e.point);
    },
    /* 操作按钮 */
    // 编辑
    handleDraw() {
      this.isediting = true;
    },
    //完成
    handelFinishDraw() {
      this.isediting = false;
      this.$emit("getMapPointsData", this.paths, this.drawColor);
    },
    //重置
    handleClearDraw() {
      this.paths = [];
      this.mouseOverEvent = true;
      this.$emit("getMapPointsData", [], "");
    },
    //地图点击事件
    mapDblclick(e) {
      this.isediting = false;
    },
    mapClick(e) {
      if (!this.isediting) {
        return;
      }
      this.labelPostion = {
        lat: e.point.lat,
        lng: e.point.lng,
      };
      this.paths.push(e.point);
    },
    //编辑默认
    drawDefault(points) {
      if (points && points.length > 0) {
        this.center = points[0];
        this.paths = points;
      }
    },
    //切换颜色
    handleChangeColor(item) {
      this.drawColor = item.value;
      this.$emit("getMapPointsData", this.paths, this.drawColor);
    },
  },
};
</script>

css:

<style scoped>
.map-wrap {
  position: relative;
  width: 100%;
  height: 100%;
}
.map-wrap .flex {
  display: flex;
  flex-shrink: 0;
  white-space: nowrap;
  justify-content: space-between;
  align-items: center;
  height: 50px;
  line-height: 50px;
}
.allmap {
  width: 100%;
  height: calc(100% - 50px);
  position: absolute;
}
ul {
  list-style: none;
}
.picker-color {
  text-align: right;
  padding-right: 30px;
}
.text {
  display: inline-block;
  padding: 0 10px;
  float: left;
}
span {
  display: inline-block;
  width: 24px;
  height: 24px;
  line-height: 20px;
  border-radius: 4px;
  border-width: 2px;
  border-style: solid;
  margin-left: 8px;
  overflow: hidden;
  text-align: center;
  margin-top: 10px;
  float: left;
}
span i {
  font-weight: 600;
}
.color1 {
  border-color: #ff6b36;
  background: rgba(255, 107, 54, 0.3);
  color: #ff6b36;
}
.color2 {
  border-color: #ffad29;
  background: rgba(255, 173, 41, 0.3);
  color: #ffad29;
}
.color3 {
  border-color: #ffda21;
  background: rgba(255, 218, 33, 0.3);
  color: #ffda21;
}
.color4 {
  border-color: #29e98f;
  background: rgba(41, 233, 143, 0.3);
  color: #29e98f;
}
.color5 {
  border-color: #1eede6;
  background: rgba(30, 237, 230, 0.3);
  color: #1eede6;
}
.color6 {
  border-color: #2a8dff;
  background: rgba(42, 141, 255, 0.3);
  color: #2a8dff;
}
.color7 {
  border-color: #cc16ef;
  background: rgba(204, 22, 239, 0.3);
  color: #cc16ef;
}
.color8 {
  border-color: #f53abd;
  background: rgba(245, 58, 189, 0.3);
  color: #f53abd;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1202719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单链表(8)

单链表的特点 可以发现&#xff0c;在单链表的for循环里&#xff0c;初始化就总结为这两种情况 上图中 用第一条&#xff08;要改变链表的结构&#xff0c;增加&#xff0c;减少结点个数等&#xff09;的有&#xff1a;尾插&#xff0c;插入&#xff0c;删除pos位置值&#x…

vue脚手架初始化项目搭建后配置路由【小白易学】

首先这里你已经创建好项目了&#xff0c;这是跑起来的效果 首先第一步&#xff0c;需要下载路由router npm install vue-router4下载好了之后找到main.js页面,加入router import { createApp } from vue; import App from ./App.vue; import router from ./routercreateApp(A…

做一个springboot登陆注册功能

目录 一、环境搭建 1、数据库 2、引入依赖 3、配置信息 4、创建包结构和数据库实体类 二、接口开发-注册接口 前提准备 响应数据 需求分析 全局异常处理 代码编写 测试 三、接口开发-登录接口 前提准备 响应数据 需求分析 代码编写 测试 拦截器 测试 一、环…

IP地址如何实现定位功能?

网络犯罪、保护网络安全的重要手段。近日&#xff0c;一则新闻引起了广大网友的关注&#xff1a;IP也能实现定位功能&#xff0c;这是如何做到的呢&#xff1f;本文将对此进行深入解析。 首先&#xff0c;我们需要了解什么是IP地址定位。IP地址定位是通过IP地址确定网络用户所在…

面试被问答3-5年职业规划,该怎么回答

面试官问这些问题的目的是什么&#xff1f;他想得到什么满意的答案。只要清楚这些&#xff0c;就不难回答这个问题。 1、你有没有上进心&#xff1f;公司是否值得培养呢&#xff1f; 你需要对专业能力充满向往&#xff0c;希望自己在3~5年内&#xff0c;把专业能力做好&#…

字符串和内存函数(1)

文章目录 目录1. 前言2. 函数介绍2.1 strlen2.2 strcpy2.3 strcat2.4 strcmp2.5 strncpy2.6 strncat2.7 strncmp2.8 strstr2.9 strtok2.10 strerror2.11 字符分类函数2.12 字符转换函数 目录 求字符串长度函数长度不受限制的字符串函数长度受限制的字符串函数字符串查找函数错…

TikTok影响力经济:解锁社交媒体的商业机遇

社交媒体平台的崛起改变了我们与世界互动的方式&#xff0c;而TikTok作为其中的一员&#xff0c;已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐&#xff0c;还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济&#xff0…

linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh

系统部署在物理机上&#xff0c;开机后一直pxe不进系统&#xff0c;怀疑GRUB丢失。 查看bios 里 采用uefi 启动方式&#xff0c; 无硬盘系统引导选项&#xff0c; 且BMC设置为硬盘永久启动也无效。 挂载光驱ISO进入救援模式,sda为系统盘&#xff0c;重装grub报错 grub2-inst…

如何用自然语言 5 分钟构建个人知识库应用?我的 GPTs builder 尝试

开发者的想象力闸门一旦打开&#xff0c;迎接我们的必然是目不暇接的 AI 应用浪潮冲击。 兴奋 早晨&#xff0c;我突然发现 ChatGPT 最新的 Create GPTs 功能可以用了。 这太让我意外了&#xff0c;没想到这么快。根据页面上的提示&#xff0c;我一直以为还得等上一周左右。于是…

腾讯待办为什么停止运营?ics文件如何导入日程APP继续使用?

有不少网友表示自己想要记录待办事项、设置待办提醒的时候&#xff0c;会直接使用微信中的腾讯待办小程序来记录。但是最近这段时间在使用这款小程序设置待办提醒的时候&#xff0c;看到了“业务关停通知”的弹窗&#xff0c;大意就是说&#xff0c;腾讯待办将于2023年12月20日…

CoRL 2023 获奖论文公布,manipulation、强化学习等主题成热门

今年大模型及具身智能领域有了非常多的突破性进展&#xff0c;作为机器人学与机器学习交叉领域的全球顶级学术会议之一&#xff0c;CoRL也得到了更多的关注。 CoRL 是面向机器人学习的顶会&#xff0c;涵盖机器人学、机器学习和控制等多个主题&#xff0c;包括理论与应用。今年…

CCF ChinaSoft 2023 论坛巡礼 | 生成式AI与软件自动化论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

说说react中引入css的方式有哪几种?区别?

一、是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则: 可以编写局部css,不会随意污染其他组件内的原生;可以编写动态的css,可以获取当前组件的一些状态,根据状态的变化生成不同的css样式;支持所有的css特性:伪类、动画、媒体查询等;编写起来简洁…

牛客网:OR36 链表的回文结构

一、题目 函数原型&#xff1a; bool chkPalindrome(ListNode* A) 二、思路 判断一个单链表是否为回文结构&#xff0c;由于单链表不能倒序遍历&#xff0c;所以需要找到单链表的后半段&#xff0c;并将其逆置&#xff0c;再与前半段链表进行比较。 如何找到单链表的后半段呢&a…

3D造型渲染软件DAZ Studio mac中文版介绍

DAZ Studio mac是一款3D造型和渲染软件&#xff0c;由 Daz 3D 公司开发。它允许用户创建、编辑、动画化并渲染精美的数字图像与动画。DAZ Studio 还提供了一个虚拟的3D艺术家工作室环境&#xff0c;让用户可以轻松地设置场景、布置角色和应用材质。 用户可以通过 DAZ Studio 中…

麒麟KYLINOS中使用Ghost镜像文件还原系统

原文链接&#xff1a;麒麟KYLINOS中使用Ghost镜像文件还原系统 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS备份还原的第三篇文章&#xff0c;使用Ghost镜像文件还原系统&#xff0c;将之前做好的Ghost镜像文件拷贝到u盘里&#xff0c;然后在另一台终端上…

如何在群晖虚拟机快速部署线上web网站并实现公网访问

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页&#xff0c;实现公网…

2023年【汽车驾驶员(高级)】证考试及汽车驾驶员(高级)实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;高级&#xff09;证考试考前必练&#xff01;安全生产模拟考试一点通每个月更新汽车驾驶员&#xff08;高级&#xff09;实操考试视频题目及答案&#xff01;多做几遍&#xff0c;其实通过汽车…

ASAM OpenDRIVE V1.7协议超详解(一)

文章目录 前言一、仿真场景的构成二、openDRIVE框架三、g_additionalData四、openDRIVE-header五、openDRIVE-road1、Road总拓扑结构2、Road-link介绍1&#xff09;link的拓扑结构2&#xff09;link链接示例3&#xff09;link前继后继4&#xff09;道路link规则 3、road-type介…

从0到0.01入门React | 005.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…