vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)

作者:MrsTing 时间:2024-05-09 15:21:01 

1.首先在index.html引入高德地图的秘钥。如图:

vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)

注意:如果使用关键字搜索功能要加上 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>

效果:

vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)

来源:https://blog.csdn.net/qq_40364610/article/details/104693010

标签:vue,高德地图,定位,搜索
0
投稿

猜你喜欢

  • python 字典操作提取key,value的方法

    2021-06-01 04:40:39
  • mysql 重要日志文件汇总

    2024-01-28 20:34:55
  • Python可变参数用法实例分析

    2022-01-20 04:24:55
  • golang 数组去重,利用map的实现

    2024-04-27 15:37:49
  • pandas取出重复数据的方法

    2021-03-23 09:12:52
  • 使用Keras构造简单的CNN网络实例

    2023-08-23 04:38:21
  • 动态给表添加删除字段并同时修改它的插入更新存储过程

    2011-12-01 10:18:28
  • Go语言文件读写操作案例详解

    2024-02-03 16:46:33
  • 用自定义html标签让IE支持html5新增元素

    2011-03-17 16:10:00
  • 数据库访问性能优化

    2024-01-21 18:24:47
  • Python 编程操作连载之字符串,列表,字典和集合处理

    2021-08-16 11:27:54
  • 使用vue打包时gzip压缩的两种方案

    2024-05-21 10:29:45
  • 教你一步步利用python实现贪吃蛇游戏

    2023-09-21 13:23:27
  • Python入门教程(三十三)Python的字符串格式化

    2023-04-03 11:58:17
  • python函数与方法的区别总结

    2021-08-21 00:07:51
  • Vue状态管理库Pinia详细介绍

    2024-05-09 15:11:43
  • Go Grpc Gateway兼容HTTP协议文档自动生成网关

    2024-05-21 10:27:16
  • numpy工程实践之np.savetxt()存储数据

    2023-06-19 07:33:11
  • JS异步宏队列微队列原理详解

    2024-04-22 13:26:43
  • Java实现数据库连接池简易教程

    2024-01-20 01:30:29
  • asp之家 网络编程 m.aspxhome.com