vue项目使用高德地图的定位及关键字搜索功能

1.首先在index.html引入高德地图的秘钥。如图:
在这里插入图片描述注意:如果使用关键字搜索功能要加上 plugin=AMap.Autocomplete,AMap.PlaceSearch,否则功能无法使用,并会报错
2. 定位功能,代码如下:

const map = new AMap.Map(this.$refs.container, {
        resizeEnable: true
      }) // 创建Map实例
      const options = {
        'showButton': true, // 是否显示定位按钮
        'buttonPosition': 'LB', // 定位按钮的位置
        'buttonOffset': new AMap.Pixel(10, 20), // 定位按钮距离对应角落的距离
        'showMarker': true, // 是否显示定位点
        'showCircle': true, // 是否显示定位精度圈
        'circleOptions': {// 定位精度圈的样式
          'strokeColor': '#0093FF',
          'noSelect': true,
          'strokeOpacity': 0.5,
          'strokeWeight': 1,
          'fillColor': '#02B0FF',
          'fillOpacity': 0.25
        },
        zoomToAccuracy: true // 定位成功后是否自动调整地图视野到定位点
      }
      AMap.plugin(['AMap.Geolocation'], function() {
        const geolocation = new AMap.Geolocation(options)
        map.addControl(geolocation)
        geolocation.getCurrentPosition()
      })
      //下面是点击地图时加入mark。注意:要在绑定事件前记录this,否则在绑定的回调方法中使用this将是该事件的this
      const _this = this
      AMap.event.addListener(map, 'click', function(e) {
        map.clearMap() // 清除地图上所有添加的覆盖物
        new AMap.Marker({
          position: e.lnglat,
          map: map
        })
        _this.handleMap(e.lnglat.getLng(), e.lnglat.getLat())
      })

3.关键字搜索功能
html部分代码(注意ref,id,class的名字要和官网保持一致,否则可能出不来想要的效果):

<template>
  <div class="map-chart">
    <div id="container" ref="container" />
    <div id="myPageTop">
      <table>
        <tr>
          <td>
            <label>请输入关键字:</label>
          </td>
        </tr>
        <tr>
          <td>
            <input id="tipinput">
          </td>
        </tr>
      </table>
    </div>
  </div>
</template>

script代码:

export default {
  name: 'Map',
  props: [],
  data() {
    return {
      placeSearch: null
    }
  },
  mounted() {
    this.mapInit()
  },
  methods: {
    mapInit() {
      const map = new AMap.Map(this.$refs.container, {
        resizeEnable: true
      }) // 创建Map实例
      const options = {
        'showButton': true, // 是否显示定位按钮
        'buttonPosition': 'LB', // 定位按钮的位置
        'buttonOffset': new AMap.Pixel(10, 20), // 定位按钮距离对应角落的距离
        'showMarker': true, // 是否显示定位点
        'showCircle': true, // 是否显示定位精度圈
        'circleOptions': {// 定位精度圈的样式
          'strokeColor': '#0093FF',
          'noSelect': true,
          'strokeOpacity': 0.5,
          'strokeWeight': 1,
          'fillColor': '#02B0FF',
          'fillOpacity': 0.25
        },
        zoomToAccuracy: true // 定位成功后是否自动调整地图视野到定位点
      }
      //注意:要在绑定事件前记录this,否则在绑定的回调方法中使用this将是该事件的this
      const _this = this
      // 输入提示
      const autoOptions = {
        input: 'tipinput'
      }
      const auto = new AMap.Autocomplete(autoOptions)
      this.placeSearch = new AMap.PlaceSearch({
        map: map
      }) // 构造地点查询类
      AMap.event.addListener(auto, 'select', this.select)// 注册监听,当选中某条记录时会触发
      //点击搜索出的mark点事件
      AMap.event.addListener(this.placeSearch, 'markerClick', function(e) {
        _this.$emit('bMapDate', e.data.location.lng, e.data.location.lat)
      })
    },
    select(e) {
      this.placeSearch.setCity(e.poi.adcode)
      this.placeSearch.search(e.poi.name) // 关键字查询查询
    },
    handleMap(o, a) {
      this.$emit('bMapDate', o, a)
    }
  }
}
</script>

整体完成代码:

<template>
  <div class="map-chart">
    <div id="container" ref="container" />
    <div id="myPageTop">
      <table>
        <tr>
          <td>
            <label>请输入关键字:</label>
          </td>
        </tr>
        <tr>
          <td>
            <input id="tipinput">
          </td>
        </tr>
      </table>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Map',
  props: [],
  data() {
    return {
      placeSearch: null
    }
  },
  mounted() {
    this.mapInit()
  },
  methods: {
    mapInit() {
      const map = new AMap.Map(this.$refs.container, {
        resizeEnable: true
      }) // 创建Map实例
      const options = {
        'showButton': true, // 是否显示定位按钮
        'buttonPosition': 'LB', // 定位按钮的位置
        'buttonOffset': new AMap.Pixel(10, 20), // 定位按钮距离对应角落的距离
        'showMarker': true, // 是否显示定位点
        'showCircle': true, // 是否显示定位精度圈
        'circleOptions': {// 定位精度圈的样式
          'strokeColor': '#0093FF',
          'noSelect': true,
          'strokeOpacity': 0.5,
          'strokeWeight': 1,
          'fillColor': '#02B0FF',
          'fillOpacity': 0.25
        },
        zoomToAccuracy: true // 定位成功后是否自动调整地图视野到定位点
      }
      AMap.plugin(['AMap.Geolocation'], function() {
        const geolocation = new AMap.Geolocation(options)
        map.addControl(geolocation)
        geolocation.getCurrentPosition()
      })
      const _this = this
      AMap.event.addListener(map, 'click', function(e) {
        map.clearMap() // 清除地图上所有添加的覆盖物
        new AMap.Marker({
          position: e.lnglat,
          map: map
        })
        _this.handleMap(e.lnglat.getLng(), e.lnglat.getLat())
      })

      // 输入提示
      const autoOptions = {
        input: 'tipinput'
      }
      const auto = new AMap.Autocomplete(autoOptions)
      this.placeSearch = new AMap.PlaceSearch({
        map: map
      }) // 构造地点查询类
      AMap.event.addListener(auto, 'select', this.select)// 注册监听,当选中某条记录时会触发
      AMap.event.addListener(this.placeSearch, 'markerClick', function(e) {
        _this.$emit('bMapDate', e.data.location.lng, e.data.location.lat)
      })
    },
    select(e) {
      this.placeSearch.setCity(e.poi.adcode)
      this.placeSearch.search(e.poi.name) // 关键字查询查询
    },
    handleMap(o, a) {
      this.$emit('bMapDate', o, a)
    }
  }
}
</script>

<style scoped>
    .map-chart{
        position: relative;
        margin-bottom:15px;
        width: 100%;
        height: 400px;
        border: 1px #dddddd solid;
    }
    /deep/ .amap-logo,/deep/ .amap-copyright {
        display: none!important;
    }

    #container {
        margin-bottom:15px;
        width: 100%;
        height: 400px;
        border: 1px #dddddd solid;
        z-index: 99999999;
    }

    .button-group {
        position: absolute;
        bottom: 20px;
        right: 20px;
        font-size: 12px;
        padding: 10px;
    }

    .button-group .button {
        height: 28px;
        line-height: 28px;
        background-color: #0D9BF2;
        color: #FFF;
        border: 0;
        outline: none;
        padding-left: 5px;
        padding-right: 5px;
        border-radius: 3px;
        margin-bottom: 4px;
        cursor: pointer;
    }
    .button-group .inputtext {
        height: 26px;
        line-height: 26px;
        border: 1px;
        outline: none;
        padding-left: 5px;
        padding-right: 5px;
        border-radius: 3px;
        margin-bottom: 4px;
        cursor: pointer;
    }
    #tip {
        background-color: #fff;
        padding-left: 10px;
        padding-right: 10px;
        position: absolute;
        font-size: 12px;
        right: 10px;
        top: 20px;
        border-radius: 3px;
        border: 1px solid #ccc;
        line-height: 30px;
    }
    .amap-info-content {
        font-size: 12px;
    }
    #myPageTop {
        position: absolute;
        top: 5px;
        right: 10px;
        background: #fff none repeat scroll 0 0;
        border: 1px solid #ccc;
        margin: 10px auto;
        padding:6px;
        font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";
        font-size: 14px;
        z-index: 99999999;
    }
    #myPageTop label {
        margin: 0 20px 0 0;
        color: #666666;
        font-weight: normal;
    }
    #myPageTop input {
        width: 170px;
    }
    #myPageTop .column2{
        padding-left: 25px;
    }
</style>

由于我在项目中使用了dialog,搜索出来的结果会在蒙版后面显示,去掉scope和加/deep/、>>>都没用,最后在index.html加样式。代码如下:

<style type="text/css">
    .amap-sug-result {
      z-index: 2999!important;
    }
  </style>

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

以上就是踩了无数坑总结出来的经验。。。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Vue项目使用高德地图,首先需要在main.js文件中引入vue-amap,并初始化vue-amap。具体的引入和初始化步骤如下: 1. 引入vue-amap插件: ```javascript import VueAMap from 'vue-amap'; ``` 2. 初始化vue-amap: ```javascript Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: '您申请的高德地图key', plugin: [ 'AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor' ], v: '1.4.4' }); ``` 接下来,在需要使用高德地图的组件中,可以通过初始化地图容器和设置地图属性来使用高德地图功能。具体步骤如下: 1. 初始化地图容器: ```javascript initMap() { this.myMap = new AMap.Map('myMap', { zoom: 10, layers: [new AMap.TileLayer()], viewMode: '3D' }); } ``` 2. 在组件的模板中添加地图容器的DOM元素: ```html <div id="myMap"></div> ``` 通过以上步骤,你就可以在Vue项目使用高德地图功能了。注意要替换掉代码中的'您申请的高德地图key'为你自己申请的高德地图API的key。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue之如何调用高德地图步骤详解](https://blog.csdn.net/wwyxjjz/article/details/125845814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [在vue项目使用高德地图](https://blog.csdn.net/qq_41585169/article/details/129969454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值