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实现读取txt文档的脚本
Jul 20 Javascript
jQuery之$(document).ready()使用介绍
Apr 05 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
Aug 09 Javascript
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
Express下采用bcryptjs进行密码加密的方法
Feb 07 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
es6 filter() 数组过滤方法总结
Apr 03 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
Sep 25 Javascript
Swiper实现导航栏滚动效果
Oct 16 Javascript
聊聊JS ES6中的解构
Apr 29 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/12/21 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
javascript 写类方式之三
2009/07/05 Javascript
js获取form的方法
2015/05/06 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
基python实现多线程网页爬虫
2015/09/06 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
外贸英语毕业生自荐信
2013/11/14 职场文书
如何写你的创业计划书
2014/01/07 职场文书
大学生暑期实践感言
2014/02/26 职场文书
数学系毕业生求职信
2014/05/29 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
2016年端午节寄语
2015/12/04 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
golang 实用库gotable的具体使用
2021/07/01 Golang
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电