Vue中使用VueAMap

2023-09-21 16:53:14

npm 安装

npm install vue-amap --save

注册:高德地图


// 在main.js中注册:高德地图
import VueAMap from "vue-amap";
Vue.use(VueAMap);
VueAMap.initAMapApiLoader({
  key: "你的高德key",
  plugin: [
    "AMap.AutoComplete", //输入提示插件
    "AMap.PlaceSearch", //POI搜索插件
    "AMap.Scale", //右下角缩略图插件 比例尺
    "AMap.OverView", //地图鹰眼插件
    "AMap.ToolBar", //地图工具条
    "AMap.MapType", //类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制
    "AMap.PolyEditor", //编辑 折线多,边形
    "AMap.PolygonEditor", //编辑 折线多,边形
    "AMap.CircleEditor", //圆形编辑器插件
    "AMap.Geolocation", //定位控件,用来获取和展示用户主机所在的经纬度位置
  ],
  // 默认高德 sdk 版本为 1.4.4
  v: "2.0",
});

配置安全密钥

// 在public/index.html中配置
  <script type="text/javascript">
    // 使用高德,需要配置安全密钥
    window._AMapSecurityConfig = {
      securityJsCode: "xxx",
    };
  </script>

VueAMap使用

效果图
在这里插入图片描述

// 核心代码
<template>
  <div class="app-container">
    <div class="main">
      <!-- 地图 -->
      <div id="container" style="width: 100%; height: 500px" />
      <!-- 搜索 -->
      <div class="info">
        <div class="input-item">
          <div class="input-item-prepend">
            <span class="input-item-text" style="width: 8rem"
              >请输入关键字</span
            >
          </div>
          <input id="tipinput" type="text" style="margin-right: 5px" />
          <el-button type="primary" @click="onSearch" size="mini"
            >搜索</el-button
          >
        </div>
      </div>
      <!-- 控制按钮组 -->
      <section class="section">
        <div class="ebox">
          <el-button-group>
            <el-button
              type="info"
              icon="el-icon-circle-plus-outline"
              @click="drawRectangle"
              :disabled="path.length > 0"
              >绘制围栏</el-button
            >
            <el-button type="primary" icon="el-icon-edit" @click="editRectangle"
              >编辑围栏</el-button
            >
            <el-button
              type="success"
              icon="el-icon-success"
              @click="saveRectangle"
              >保存围栏</el-button
            >
            <el-button
              type="danger"
              icon="el-icon-delete"
              @click="deleRectangle"
              >删除围栏</el-button
            >
          </el-button-group>
        </div>
      </section>
    </div>
  </div>
</template>

<script>
export default {
  name: "Society",
  data() {
    return {
      map: null, // 地图组件
      center: [114.0579, 22.5431], //地图中心位置,不能为空数组【为空数组会报错】
      path: [], //绘制的数据
      polyEditor: null, // polyEditor组件
    };
  },
  created() {},
  mounted() {
    setTimeout(() => {
      //异步加载(否则报错initMap is not defined)
      this.initMap();
    }, 1000);
  },
  methods: {
    // 地图初始化
    initMap() {
      this.map = new AMap.Map("container", {
        resizeEnable: true, // 窗口大小调整
        center: this.center, // 中心
        zoom: 15, //放大级别
        showLabel: true, // 是否显示地图文字标记
      });
      // 添加工具栏
      this.map.plugin(
        [
          "AMap.ToolBar",
          "AMap.AutoComplete",
          "AMap.PlaceSearch",
          "AMap.Geolocation",
        ],
        () => {
          const toolbar = new AMap.ToolBar(); // 工具条
          this.map.addControl(toolbar);
          // 实例化Autocomplete 搜索
          const autoOptions = {
            //city 限定城市,默认全国
            city: "全国",
            input: "tipinput",
          };
          const AutoComplete = new AMap.AutoComplete(autoOptions);
          this.AutoComplete = AutoComplete;
          // AutoComplete.search(keyword, (status, result) => {
          //   console.log(status, result);
          //   // 搜索成功时,result即是对应的匹配数据
          // });

          // 获取定位工具
          const geolocation = new AMap.Geolocation({
            enableHighAccuracy: true, //是否使用高精度定位,默认:true
            timeout: 10000, //超过10秒后停止定位,默认:无穷大
            maximumAge: 0, //定位结果缓存0毫秒,默认:0
            convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
            showButton: true, //显示定位按钮,默认:true
            position: "LB", //定位按钮停靠位置,默认:'LB',左下角
            buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
            showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
            showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
            panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
            zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
          });
          this.map.addControl(geolocation);
          geolocation.getCurrentPosition((status, result) => {
            if (status == "complete") {
              this.$modal.msgSuccess("获取定位成功");
              this.center = [result.position.lng, result.position.lat];
            } else {
              this.$modal.msgWarning("获取定位失败");
            }
          });
          // 获取后端返回的数据,创建围栏
          if (this.path && this.path.length > 0) {
            const polygon = new AMap.Polygon({
              path: this.path,
            });
            // 创建围栏实例
            this.polyEditor = new AMap.PolyEditor(this.map, polygon);
            // 清空地图
            this.map.clearMap();
            // 地图添加围栏
            this.map.add(polygon);
            // 聚焦当前围栏
            this.map.setFitView(this.polyEditor.getTarget());
          }
        }
      );
    },
    // 绘制多边形
    drawRectangle() {
      const This = this;
      // 创建并开启围栏编辑器
      const polyEditor = new AMap.PolygonEditor(this.map);
      this.polyEditor = polyEditor;
      polyEditor.close();
      polyEditor.setTarget();
      polyEditor.open();
      // 创建一个覆盖物之后触发该事件,target即为创建对象。
      // 当editor编辑对象为空时,调用open接口,再点击一次屏幕就会创建新的覆盖物对象
      polyEditor.on("add", (data) => {
        const polygon = data.target;
        // 添加吸附多边形围栏
        polyEditor.addAdsorbPolygons(polygon);
        This.map.setFitView([polygon]);
        // 围栏双击事件,编辑完后聚焦当前围栏
        polygon.on("dblclick", () => {
          polyEditor.setTarget(polygon);
          This.map.setFitView([polygon]);
          polyEditor.open();
        });
      });
    },
    // 编辑围栏
    editRectangle() {
      // 聚焦当前围栏,打开编辑
      this.map.setFitView(this.polyEditor.getTarget());
      this.polyEditor.open();
    },
    //保存围栏
    saveRectangle() {
      this.path = [];
      // 获取当前最新的坐标,并取消编辑状态
      this.polyEditor
        .getTarget()
        .getPath()
        .forEach((v) => {
          this.path.push([v.lng, v.lat]);
        });
      this.polyEditor.close();
    },
    // 删除围栏
    deleRectangle() {
      this.path = [];
      this.map.clearMap(); // 删除地图所有覆盖物
    },
    // 搜索
    onSearch() {
      const vm = this;
      const keyword = document.getElementById("tipinput").value;
      // 实例化PlaceSearch
      const place = {
        map: vm.map,
        extensions: "all",
        autoFitView: true, // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
      };
      const PlaceSearch = new AMap.PlaceSearch(place);
      PlaceSearch.search(keyword, (status, result) => {
        // 搜索成功时,result即是对应的匹配数据
      });
    },
  },
};
</script>
<style lang="scss" scoped>
@import url("https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css");
</style>
<style lang="scss"scoped>
.amap-box {
  width: 100%;
  height: 600px;
}
.section {
  position: relative;
}

.info {
  position: absolute;
  right: 0px;
  top: 0px;
}
</style>

如果在弹窗中使用VueAMap,需要全局引用改样式

// AMap.Autocomplete会被elment ui弹窗遮挡问题
.amap-sug-result {
  z-index: 99999 !important;
}
更多推荐

Java线程池ExecutorService和Executors应用(Spring Boot微服务)

记录:476场景:在SpringBoot微服务中使用ExecutorService管理Java线程池。使用Executors创建线程池。使用Runnable接口实现类提交线程任务到线程池执行。版本:JDK1.8,SpringBoot2.6.3。1.线程和线程池基础JDK自带线程和线程池包位置:java.util.con

嵌入的是PWM

PWM简介在嵌入式系统中,PWM(脉冲宽度调制)是一种常用的技术,用于控制和生成脉冲信号,通常用于控制电机、LED亮度、音频输出等。针对STM32微控制器,它们通常具有内置的PWM控制器模块,使PWM生成相对容易。PWM是一种用于控制电子设备的技术,通过调整信号的脉冲宽度和周期,可以模拟出不同的电压或功率级别。频率、占

JVM 虚拟机 ---->垃圾收集算法

文章目录JVM垃圾收集器一、判断对象是否存活1、引用计数算法(1)基本思路(2)存在的问题2、可达性分析算法(1)基本思路二、Java中的四种引用方式1、强引用(StrongReference)(1)弱化方式1(2)弱化方式22、软引用(SoftReference)3、弱引用(WeakReference)4、虚引用(P

外包干了2个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试,已经让我变得不思进取,谈了2年的女朋友也因为我的心态和工资和我分手了。于是,我决定要改变现状,冲击下大厂。刚开始准备时

十五、垃圾回收相关算法

目录一、标记阶段:引用计算法对象存活判断引用计算法二、标记阶段:可达性分析算法三、对象的finalization机制四、MAT和Jprofiler的GCToots的溯源五、垃圾清除算法之标记-清除算法六、垃圾清除算法之复制算法七、垃圾清除算法之标记-压缩算法八、小结分代收集算法九、增量收集算法、分区算法1、什么是增量收

【EI会议信息】第五届物联网、自动化和人工智能国际会议(IoTAAI 2023)

第五届物联网、自动化和人工智能国际会议(IoTAAI2023)20235thInternationalConferenceonInternetofThings,AutomationandArtificialIntelligence第五届物联网、自动化和人工智能国际会议(IoTAAI2023)将于2023年11月24-2

你的服务器还安全吗?用户数据是否面临泄露风险?

一系列严重的网络安全事件引起了广泛关注,多家知名公司的服务器遭到黑客挟持,用户的个人数据和敏感信息面临泄露的风险。这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性,提醒着企业和个人加强对网络安全的重视。一、入侵案例1.1蔚来数据泄露1.2特斯拉、波音、SpaceX供应商拒付赎金遭机密泄露二、入侵常见方式2.1弱密码攻击

【Rust 基础篇】Rust动态大小类型:理解动态大小类型与编写安全的代码

导言Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。在Rust中,动态大小类型(DST)是一种特殊的类型,它的大小在编译时无法确定,需要在运行时根据实际情况进行确定。动态大小类型在Rust中有着重要的应用场景,例如引用类型、trait对象等。本篇博客将

ATECLOUD电源测试软件平台如何测试电源纹波?

电源纹波是影响电源稳定性的重要因素,过大的纹波会导致电源模块的工作效率降低,可能使电源模块直接损坏。使用ATECLOUD碘盐测试软件平台对纹波进行测试,检测其工作情况,以确保其稳定性和性能。电源纹波的产生电源的纹波通俗的来讲就是电源模块电压波动而造成的一种现象。一般情况下电源模块中的纹波都是由交流电经过整流稳压环节之后

开源软件的漏洞响应:应对安全威胁

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Learned-Based VO 梳理(USTC Paper Reading)

梗概主题:VOinDynamic思路简答介绍SLAM框架,引入VO问题直接从LearnedVO开始,介绍VO问题的相关研究,总结当前研究存在的问题讨论DynamicVO中的相关做法,总结问题,提出想法拓展VO和navigation的关系引入SLAM的全称是SimultanousLocationAndMapping,同步

热文推荐