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 QueryString解析类代码
Jan 17 Javascript
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
js实现简单div拖拽功能实例
May 12 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 jQuery
Vue利用路由钩子token过期后跳转到登录页的实例
Oct 26 Javascript
微信小程序登录换取token的教程
May 31 Javascript
教你如何用node连接redis的示例代码
Jul 12 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 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 采集书并合成txt格式的实现代码
2009/03/01 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
小谈php正则提取图片地址
2014/03/27 PHP
PHP中的表达式简述
2016/05/29 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python输入多行字符串的方法总结
2019/07/02 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
公司庆典活动邀请函
2014/01/09 职场文书
护理专业优质毕业生自荐书
2014/01/31 职场文书
银行求职信范文
2014/05/26 职场文书
个人委托书范本汇总
2014/10/01 职场文书
学校师德师风整改措施
2014/10/27 职场文书
感恩的心主题班会
2015/08/12 职场文书
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL