【 Vue2.X按 NPM 方式局部引用 高德amap-jsapi-loader(踩坑贴)】

Vue2.X按 NPM 方式局部引用 高德amap-jsapi-loader


功能包括:
1.多次点击地图只有一个标点覆盖物、
2.根据经纬度查询地址、
3.地图与卫星图切换、
4.根据地名搜索展示查询的列表、
5.点击地图展示经纬度和地名

效果图如下:
在这里插入图片描述
正式开工
第一步:NPM包引入

在项目终端Powershell输入如下

npm i @amap/amap-jsapi-loader --save

第二步:局部引入
在需要的vue页面

//  <!-- 高德地图用来获取经纬度转换地址使用的-->
window._AMapSecurityConfig = {
  securityJsCode: '你的高德key',
}
//引入的包
import AMapLoader from '@amap/amap-jsapi-loader'

第三步:初始化创建地图
template里代码

    <div>
              <div class="map-search">
                <a-form-model-item label="地图" prop="keywords" style="margin-left: -80px">
                  <a-input-search
                    placeholder="请输入地名后按回车键搜索"
                    v-model="form.keywords"
                    class="search-input"
                    @search="onSearch"
                  />
                  <span class="clear-coord" @click="clearCoord" style="margin-left: 10px">重置</span>
                </a-form-model-item>
              </div>
              <div class="show-map">
                <!-- //container是地图容器id -->
                <div id="container"></div>
                <ul v-if="resultList.length" style="left: 0px">
                  <li
                    class="flex map-list cursor"
                    v-for="item in resultList"
                    :key="item.id"
                    @click="selectAddress(item)"
                  >
                    <svg-icon icon-class="map_coord" />
                    <div>
                      <p title="item.name"><span>名称:</span>{{ item.name }}</p>
                      <p title="item.address"><span>地址:</span>{{ item.address || '暂无详细地址!' }}</p>
                    </div>
                  </li>
                </ul>
              </div>
              <div class="flex map-coord">
                <a-form-model-item label="经度:" prop="lng">
                  <a-input v-model="form.lng" />
                </a-form-model-item>
                <a-form-model-item label="纬度:" prop="lat"> <a-input v-model="form.lat" /></a-form-model-item>
              </div>
            </div>

script里的代码:

//data申明的变量
 data() {
    return {
      cityinfo: '', //IP定位城市
      map: null, //地图
      resultList: [], //搜索结果列表
      form: {
        lng: '114.329268',//经纬度设置的默认值
        lat: '30.578576',//经纬度设置的默认值
        keywords: '', //搜索关键字
      },
      //地图搜索的列表页
      pagination: {
        pageIndex: 1,
        pageSize: 10,
        total: 0,
      },
      //地图标记变量
      marker: null,
    }
  }
//mounted生命周期里创建地图
  mounted() {
    this.$nextTick(() => {
      this.initMap()
    })
  }

//methods里申明封装方法
  methods: {
	  //初始化地图
    initMap() {
      //地图销毁
      if (this.map != null || this.map != undefined) {
        this.map && this.map.destroy()
      }

      AMapLoader.load({
        key: '你的高德key', // 申请好的Web端开发者Key,首次调用 load 时必填
        version: '1.4.15', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15(踩坑:2.0.0版本的有问题建议设置低版本)
        plugins: [
          'AMap.ToolBar',
          'AMap.Scale',
          'AMap.MapType',
          'AMap.Geolocation',
          'AMap.CitySearch',
          'AMap.PlaceSearch',
          'AMap.Geocoder',
        ], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
        zoom: 17,
        center: [this.form.lng, this.form.lat], //中心点坐标
        resizeEnable: true,
      })
        .then((AMap) => {
          var _that = this
          var map = new AMap.Map('container')

          //添加地图点击事件
          var clickHandler = function (e) {
            if (_that.marker != null || _that.marker != undefined) {
              map.remove(_that.marker)
            }
            _that.marker = new AMap.Marker({
              position: [e.lnglat.getLng(), e.lnglat.getLat()], //位置
            })

            map.add(_that.marker) //添加到地图
            _that.map = map
            _that.form.lng = e.lnglat.getLng()
            _that.form.lat = e.lnglat.getLat()
            //根据经纬度查询地址
            _that.regeoCode()
          }
          //初始化添加标记
          _that.marker = new AMap.Marker({
            position: [_that.form.lng, _that.form.lat], //位置
          })
          map.add(_that.marker) //添加到地图
          // 绑定事件
          map.on('click', clickHandler)
          //查询城市
          _that.regeoCode()
          map.setCenter([_that.form.lng, _that.form.lat]) //设置地图中心点
          // 在图面添加工具条控件,工具条控件集成了缩放、平移、定位等功能按钮在内的组合控件
          map.addControl(new AMap.ToolBar())

          // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
          map.addControl(new AMap.Scale())
          // 在图面添加类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制
          map.addControl(new AMap.MapType())

          // 在图面添加定位控件,用来获取和展示用户主机所在的经纬度位置
          map.addControl(new AMap.Geolocation())
        })
        .catch((e) => {
          console.log(e)
          // this.$message.error(e)
        })
    },
        //根据经纬度查询地址
    regeoCode() {
      var lnglat = [this.form.lng, this.form.lat]
      var geocoder = new AMap.Geocoder({
        radius: 1000, //范围,默认:500
      })
      var _that = this
      geocoder.getAddress(lnglat, function (status, result) {
        console.log(result)
        if (status === 'complete' && result.regeocode) {
          var address = result.regeocode.formattedAddress
          _that.form.keywords = address
          _that.cityinfo = address
        } else {
          _that.$message.error('根据经纬度查询地址失败')
        }
      })
    },
    // 选择查询列表的地址在地图上标记并且载入标记点的经纬度和地址名称
    selectAddress(item) {
      var _this = this
      this.form.lng = item.location.lng
      this.form.lat = item.location.lat
      this.initMap()
    },

    //重置地图
    clearCoord() {
      this.initMap()
      this.form = this.$options.data().form
    },

    //地图搜索
    onSearch(value) {
      var _this = this
      this.form.keywords = value
      var autoOptions = {
        city: _this.cityinfo,
        pageSize: _this.pagination.pageSize, //每页结果数,默认10
        pageIndex: _this.pagination.pageIndex, //请求页码,默认1
      }
      var placeSearch = new AMap.PlaceSearch(autoOptions)
      placeSearch.search(_this.form.keywords, function (status, result) {
        // 搜索成功时,result即是对应的匹配数据
        console.log(result, '搜索结果')
        _this.resultList = result.poiList.pois
        _this.pagination.pageSize = result.poiList.pageSize
        _this.pagination.pageIndex = result.poiList.pageIndex
        _this.pagination.total = result.poiList.count
        var pois = result.poiList.pois
        for (var i = 0; i < pois.length; i++) {
          var poi = pois[i]
          _this.marker = new AMap.Marker({
            position: [poi.location.lng, poi.location.lat], // 经纬度对象,也可以是经纬度构成的一维数组
            title: poi.name,
          })
          _this.form.keywords = poi.name
          _this.cityinfo = poi.name
        }
      })
    },
  }

css的代码

//这个是搜索框
.search-input {
  width: 400px;
  /deep/.ant-input {
    border-radius: 20px;
  }
}
//这个是搜索列表的css
.show-map {
  position: relative;
  ul {
    padding: 10px;
    position: absolute;
    top: 10px;
    right: -35px;
    width: 200px;
    height: 310px;
    background-color: #f1f1f1;
    overflow-y: scroll;
  }
  .map-list {
    padding-top: 10px;
    align-items: center;
    border-bottom: 1px solid #ccc;
    .svg-icon {
      font-size: 16px;
      margin-right: 8px;
    }
    p {
      width: 150px;
      margin-bottom: 10px;
      font-size: 12px;
      line-height: 16px;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      span {
        margin-right: 5px;
      }
    }
  }
}
//这个是重置按钮
.clear-coord {
  color: #317ffb;
}
//这个是定义地图的大小
#container {
  width: 530px;
  height: 330px;
}

踩坑总结:
1.高德地图版本建议选择低于2.0.0,我选择的是1.4.15,因为2.0.0地图老是灰的无法显示太坑了
2.生命周期,初始化在mounted里或watch里
3.一定要声明window._AMapSecurityConfig的securityJsCode,不然经纬度查询地址报错异常
4.根据屏幕大小自动展示地图的大小,在最外层div 带上ref=“test”,然后声明mounted里如下

  var backtop = this.$refs.container
  backtop.style.height = this.$refs.test.offsetHeight + 'px'
  backtop.style.width = this.$refs.test.offsetWidth + 'px'
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值