zoukankan      html  css  js  c++  java
  • VUE组件 之 高德地图地址选择

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

    一、效果图

    二、组件要实现的功能

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

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

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

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

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

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

    三、 组件实现具体代码

    <template>
      <div class="map-box" :style="{  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: {
         { 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>
  • 相关阅读:
    对C# .Net4.5异步机制测试
    权限系统设计
    C#基础知识
    eclipse+pyDev
    Ubuntu下使用sublime text进行py开发
    110_02 补充模块:BeatifulSoup模块
    034 如何判断一个对象是否是可调用对象
    037 简单计算器实现
    036 re模块的小练习
    035 用Python实现的二分查找算法(基于递归函数)
  • 原文地址:https://www.cnblogs.com/similar/p/11064033.html
Copyright © 2011-2022 走看看