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 相关文章推荐
Prototype使用指南之hash.js
Jan 10 Javascript
JSON 客户端和服务器端的格式转换
Aug 27 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
javascript父子页面通讯实例详解
Jul 17 Javascript
JS经典正则表达式笔试题汇总
Dec 15 Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 Javascript
谈谈JS中的!!
Dec 07 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
Vue 事件处理操作实例详解
Mar 05 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 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
PHP中的正规表达式(二)
2006/10/09 PHP
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
js实现小星星游戏
2020/03/23 Javascript
python批量提交沙箱问题实例
2014/10/08 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
详解python中docx库的安装过程
2019/11/08 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
python制作抽奖程序代码详解
2021/01/15 Python
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
工作会议方案
2014/05/21 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
同学聚会感言一句话
2015/07/30 职场文书
Python中异常处理用法
2021/11/27 Python