Vue组件之高德地图地址选择功能的实例代码


Posted in Javascript onJune 21, 2019

注:本文基于上一篇文章【Vue-Cli 3.0 中配置高德地图 】 ,采用直接引入高德 SDK 的方式来使用高德地图api

一、效果图

Vue组件之高德地图地址选择功能的实例代码

二、组件要实现的功能

1. 如果有传入坐标点,则定位到坐标点

2. 如果没有传入坐标点,则定位到当前所在位置

3. 定位成功要在右侧显示经纬度和地址

4. 可以通过拖动 标记 来调整定位点

5. 标记 拖动后,右侧要显示拖动后的经纬度和地址

6. 点击确定按钮,返回最后的坐标点和地名给父组件

三、 组件实现具体代码

<template>
 <div class="map-box" :style="{ width: width, height: height }">
 <div id="amap" class="amap"></div>
 <div class="detail">
  <p>经度:{{point ? point[0] : '-'}}</p>
  <p>纬度:{{point ? point[1] : '-'}}</p>
  <p>地址:{{address}}</p>
  <button size="mini" class="btnmap" @click="commit">确定</button>
 </div>
 </div> 
</template>
<script>
import AMap from 'AMap'
export default {
 props: {
 width: { type: String, default: '100%' },
 height: { type: String, default: '400px' },
 lnglat: {
  type: Array,
  validator: (value) => {
  return value.length === 2
  }
 }
 },
 data () {
 return { address: '', point: this.lnglat }
 },
 mounted () {
 this.init(this.point)
 },
 methods: {

 // 初始化
 init (lnglat) {

  // 地图实例对象 (amap 为容器的id)
  let amap = new AMap.Map('amap', {
  resizeEnable: true,
  zoom: 15
  })

  // 注入插件(定位插件,地理编码插件)
  amap.plugin(['AMap.Geolocation', 'AMap.Geocoder'])

  // 定位
  this.currentPosition(amap, lnglat)
 },

 currentPosition (map, lnglat) {
  if (lnglat) {
  // 有传入坐标点,直接定位到坐标点
  map.setCenter(lnglat)
  this.addMark(map, lnglat)

  // 获取地址
  this.getAddress(lnglat)
  } else {
  // 没有传入坐标点,则定位到当前所在位置
  let geolocation = new AMap.Geolocation({
   enableHighAccuracy: true,
   timeout: 10000,
   zoomToAccuracy: true,  
   buttonPosition: 'RB'
  })
  geolocation.getCurrentPosition((status, result) => {
   if (status === 'complete') {
   let points = [result.position.lng, result.position.lat]
   map.setCenter(points) // 设置中心点
   this.addMark(map, points) // 添加标记

   // 存下坐标与地址
   this.point = points
   this.getAddress(points)
   } else {
   console.log('定位失败', result)
   }
  })
  }
 },

 // 添加标记
 addMark (map, points) {
  let marker = new AMap.Marker({
  map: map,
  position: points,
  draggable: true, // 允许拖动
  cursor: 'move',
  raiseOnDrag: true
  })
  marker.on('dragend', (e) => {
  let position = marker.getPosition()

  // 存下坐标与地址
  this.point = [position.lng, position.lat]
  this.getAddress([position.lng, position.lat])
  })
 },

 // 根据坐标返回地址(逆地理编码)
 getAddress (points) {
  let geocoder = new AMap.Geocoder({ radius: 1000 })
  geocoder.getAddress(points, (status, result) => {
  if (status === 'complete' && result.regeocode) {
   this.address = result.regeocode.formattedAddress
  }
  })
 },

 commit () {
  this.$emit('location', this.point, this.address)
 }
 }
}
</script>

<style lang="scss" scoped>
.map-box {
 box-sizing: border-box;
 background-color: #ddd;
 padding: 15px;
 &:after {
 content: '';
 display: block;
 clear: both;
 }
 .amap, .detail {
 float: left;
 height: 100%;
 }
 .amap {
 width: 75%; 
 }
 .detail {
 width: 25%;
 background-color: #fff;
 padding: 0 15px; 
 border-left: 1px solid #eee;
 box-sizing: border-box;
 word-wrap: break-word;
 }
 .btnmap {
 width: 100%;
 margin: 30px 0 0 0;
 padding: 5px 0;
 color: #fff;
 cursor: pointer;
 background-color: #409eff;
 border: none; 
 border-radius: 3px;
 &:hover {
  background-color: #66b1ff;
 }
 }
}
</style>

四、调用组件

<template>
 <div class="box">
 <xmap width="700px" height="500px" :lnglat="[114.433703, 30.446243]" @location="location"></xmap>
 </div>
</template>
<script>
import xmap from '@/components/map'
export default {
 components: { xmap }, 
 methods: {
 location(point, address) {
  alert(`坐标:${point[0]},${point[1]} - 地址:${address}`)
 }
 }
}
</script>

总结

以上所述是小编给大家介绍的Vue组件之高德地图地址选择功能的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JavaScript 全角转半角部分
Oct 28 Javascript
教您去掉ie网页加载进度条的方法
Dec 09 Javascript
基于jquery的15款幻灯片插件
Apr 10 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
javascript浏览器兼容教程之事件处理
Jun 09 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
JS中setTimeout的巧妙用法前端函数节流
Mar 24 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
Aug 29 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
js+canvas实现纸牌游戏
Mar 16 Javascript
如何提升vue.js中大型数据的性能
Jun 21 #Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
Jun 21 #Javascript
微信小程序实现点击效果
Jun 21 #Javascript
JS利用prototype给类添加方法操作详解
Jun 21 #Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 #Javascript
微信小程序实现弹出菜单动画
Jun 21 #Javascript
js类的继承定义与用法分析
Jun 21 #Javascript
You might like
Oracle Faq(Oracle的版本)
2006/10/09 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
python使用cPickle模块序列化实例
2014/09/25 Python
python保存字符串到文件的方法
2015/07/01 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
python批量修改ssh密码的实现
2019/08/08 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
项目计划书范文
2014/01/09 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
业务员岗位职责范本
2015/04/03 职场文书
小学运动会入场词
2015/07/18 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
Pandas 稀疏数据结构的实现
2021/07/25 Python