vue 高德地图 矢量覆盖物绘制 多边形 多边形编辑器吸附功能多版本共存(vue-amap和amap-vue共存)

多边形编辑器吸附功能

在这里插入图片描述

<template>
  <div class="container">
    <div id="container"></div>
    <div class="input-card" style="width: 120px">
      <button class="btn" @click="createPolygon()" style="margin-bottom: 5px">
        新建
      </button>
      <button class="btn" @click="polyEditor.open()" style="margin-bottom: 5px">
        开始编辑
      </button>
      <button class="btn" @click="polyEditor.close()">结束编辑</button>
    </div>
  </div>
</template>

<script>
import AMapLoader from "@amap/amap-jsapi-loader";
export default {
  name: "AreaMap",
  data() {
    return {
      map: null,
      polyEditor: null,
    };
  },
  mounted() {
    this.echart();
  },
  methods: {
    echart() {
      AMapLoader.load({
        key: "xxx", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: [
          "AMap.ToolBar",
          "AMap.Driving",
          "AMap.PolygonEditor",
          "AMap.PlaceSearch",
        ], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
      })
        .then((AMap) => {
          this.map = new AMap.Map("container", {
            resizeEnable: true,
            zoom: 8, //初始化地图级别
            center: [114.573471, 25.128443], //初始化地图中心点位置
          });

          var path1 = [
            [116.475334, 39.997534],
            [116.476627, 39.998315],
            [116.478603, 39.99879],
            [116.478529, 40.000296],
            [116.475082, 40.000151],
            [116.473421, 39.998717],
          ];
          var path2 = [
            [116.474595, 40.001321],
            [116.473526, 39.999865],
            [116.476284, 40.000917],
          ];
          var polygon1 = new AMap.Polygon({
            path: path1,
          });
          var polygon2 = new AMap.Polygon({
            path: path2,
          });

          this.map.add([polygon1, polygon2]);
          this.map.setFitView();
          this.polyEditor = new AMap.PolygonEditor(this.map);
          console.log(this.polyEditor);
          console.dir(this.polyEditor);
          // this.polyEditor.addAdsorbPolygons([polygon1, polygon2]);
          this.polyEditor.on("add", function (data) {
            console.log(data);
            var polygon = data.target;
            // this.polyEditor.addAdsorbPolygons(polygon);
            polygon.on("dblclick", () => {
              this.polyEditor.setTarget(polygon);
              this.polyEditor.open();
            });
          });
          polygon1.on("dblclick", () => {
            this.polyEditor.setTarget(polygon1);
            this.polyEditor.open();
          });
          polygon2.on("dblclick", () => {
            this.polyEditor.setTarget(polygon2);
            this.polyEditor.open();
          });

          this.polyEditor.setTarget(polygon2);
          this.polyEditor.open();
        })
        .catch((e) => {
          console.log(e);
        });
    },
    createPolygon() {
      this.polyEditor.close();
      this.polyEditor.setTarget();
      this.polyEditor.open();
    },
  },
};
</script>

<style lang="scss" scoped>
#container {
  width: 1000px;
  height: 1000px;
}
</style>

新创建的高德key还需要引入密钥

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="renderer" content="webkit" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
  <meta name=referrer content=no-referrer>
  <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
  <title><%= webpackConfig.name %></title>
</head>

<body>
  <div id="app"></div>
  <!-- built files will be auto injected -->
  <script>
    window._AMapSecurityConfig = {
      securityJsCode: "xxx 高德开发中心密钥",
    };
  </script>
</body>
</html>

vue多版本共存(@amap/amap-jsapi-loader)

首先提示大家,对于是否要使用vue-amap这个组件,请三思后而行,组件化和插件按需引入确实比较方便,但是已经不支持高德2.0API 且有很多坑点,因为作者大概在2019年后就没有再管过这个项目,所以推荐大家使用兼容高德2.0 API的amap-vue(没错 这俩不是一个东西)

使用场景

公司的项目之前一直使用的是vue-amap 引入的高德API版本也是1.4.4的旧版本,所以很多功能如绘制geo区域等都不能使用,但是有这个需求,我们就得去兼容更高的版本,然鹅vue-amap并不兼容2.0,引入2.0会直接报错,官方的issue也有人提出,但作者并未给出回答,故必须舍弃vue-amap

但是舍弃掉vue-amap 更改所有地图相关的页面 工作量又太大 所以我就想到了一个办法,能不能让2.0和1.4.4版本共存?

实现

最后的方案是 vue-amap 和 @amap/amap-vue 组件共存,amapvue 组件完美兼容2.0 api 推荐使用
实现共促的方法很简单,需要引入一个npm包 @amap/amap-jsapi-loader

使用方法:

import AMapLoader from '@amap/amap-jsapi-loader'

AMapLoader.reset();

// 清除全局的amap AMapLoader.reset()

// 再重新引入一下 AMapLoader.load({})

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
很抱歉,我是AI语言模型,无法提供代码实现。不过,我可以给你提供一些参考和建议。 首先,你需要在Vue3中安装`amap-jsapi-loader`和`amap`。 ```bash npm install amap-jsapi-loader amap --save ``` 然后,在需要使用高德地图的组件中,引入`amap-jsapi-loader`和`amap`。 ```javascript import { AMapLoader } from 'amap-jsapi-loader'; import AMap from 'amap'; export default { name: 'MyMapComponent', data() { return { keyword: '', searchResult: null, map: null, marker: null, }; }, mounted() { AMapLoader.load({ key: 'your_amap_key', version: '2.0', plugins: ['AMap.Geocoder'], }).then((AMap) => { this.map = new AMap.Map('map-container', { zoom: 15, }); }); }, methods: { search() { if (!this.keyword) { return; } AMapLoader.load({ key: 'your_amap_key', version: '2.0', plugins: ['AMap.PlaceSearch'], }).then((AMap) => { const placeSearch = new AMap.PlaceSearch({ pageSize: 1, pageIndex: 1, city: '全国', }); placeSearch.search(this.keyword, (status, result) => { if (status === 'complete' && result.info === 'OK') { const poi = result.poiList.pois[0]; this.searchResult = poi.name + ', ' + poi.address; const lnglat = [poi.location.lng, poi.location.lat]; this.marker = new AMap.Marker({ position: lnglat, map: this.map, }); this.map.setCenter(lnglat); } else { this.searchResult = '无结果'; } }); }); }, }, }; ``` 在上面的代码中,我们使用了`AMapLoader`来异步加载高德地图API和插件。在`mounted`生命周期函数中,我们创建了一个地图实例,并将其挂载到DOM元素中。在`search`方法中,我们通过`AMap.PlaceSearch`来搜索关键词,并将第一个结果的位置和名称显示在地图上。 注意,在使用高德地图API之前,你需要先在高德地图开发者平台申请一个地图API的key,并在代码中替换`your_amap_key`。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值