vue项目接入高德地图点击地图获取经纬度以及省市区功能

 更新时间:2023年08月05日 09:43:31   作者:陌人笙  
这篇文章主要给大家介绍了关于vue项目接入高德地图点击地图获取经纬度以及省市区功能的相关资料,开发中我们需要地图定位,就是用户输入位置,自动定位获取经纬度,需要的朋友可以参考下

1、准备工作

可以先看官方的介绍,JSAPI结合Vue使用,这个不需要在main.js中引入

2、index.html中

//如果只需要获取经纬度可以跳过这步,经纬度逆解析为详细地址时需要配置这个
<script type="text/javascript">
   window._AMapSecurityConfig = {
   		securityJsCode: 'XXX', //所申请的安全密钥 注意这是安全密钥而不是key
   }
</script>

3、index.vue的html部分

//我是封装在antd的弹窗组件中
<template>
  <a-modal title="选择区域" :visible="visible" @ok="handleOk" @cancel="handleCancel" okText="提交" cancelText="取消">
    <div id="container"></div>
    <div class="toolbar">
      当前坐标: {{ point[0] }}, {{ point[1] }}
      <br />
      地址: {{ address }}
    </div>
  </a-modal>
</template>

4、index.vue的script部分

<script>
import AMapLoader from '@amap/amap-jsapi-loader'
export default {
  name: 'MapDialog',
  data() {
    return {
      visible: false, //弹窗显隐
      center: [115.97539, 28.715532], //地图中心点
      point: [], //经纬度-lng lat
      map: null, //地图实例
      marker: null, //地图icon
      geocoder: null, //逆解析实例
      address: null //地址
    }
  },
  methods: {
    // 打开弹窗
    open({ point, address }) {
      // 如果父组件携带了参数 赋值做回显
      if (point && address) {
        this.address = address
        this.point = point
        this.center = point
      }
      // 打开弹窗
      this.visible = true
      //地图初始化
      this.initMap()
    },
    //DOM初始化完成进行地图初始化
    initMap() {
      AMapLoader.load({
        key: 'XXX', // 申请好的Web端开发者Key,首次调用 load 时必填
        version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: [
          'AMap.Geocoder', // 逆向地理解码插件
          'AMap.Marker' // 点标记插件
        ] // 需要使用的的插件列表
      })
        .then(AMap => {
          this.map = new AMap.Map('container', {
            //设置地图容器id
            zoom: 12, //初始化地图级别
            center: this.center //初始化地图中心点位置
          })
          // 如果父组件传入了有效值 回显一个icon
          if (this.point.length > 0) {
            this.addMarker()
          }
          //监听用户的点击事件
          this.map.on('click', e => {
            let lng = e.lnglat.lng
            let lat = e.lnglat.lat
            this.point = [lng, lat]
            // 增加点标记
            this.addMarker()
            // 获取地址
            this.getAddress()
          })
        })
        .catch(e => {
          console.log(e)
        })
    },
    // 增加点标记
    addMarker() {
      // 清除其他icon
      if (this.marker) {
        this.marker.setMap(null)
        this.marker = null
      }
      // 重新渲染icon
      this.marker = new AMap.Marker({
        icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
        position: this.point, //icon经纬度
        offset: new AMap.Pixel(-13, -30) //icon中心点的偏移量
      })
      this.marker.setMap(this.map) //设置icon
    },
    // 将经纬度转换为地址
    getAddress() {
      const self = this
      // 这里通过高德 SDK 完成。
      this.geocoder = new AMap.Geocoder({
        city: '全国', //地理编码时,设置地址描述所在城市; 默认全国; 可选值:城市名(中文或中文全拼)、citycode、adcode
        radius: 1000, //逆地理编码时,以给定坐标为中心点; 默认1000; 取值范围(0-3000)
        extensions: 'all' //逆地理编码时,返回信息的详略; 默认值:base,返回基本地址信息; 默认值:base,返回基本地址信息
      })
      //调用逆解析方法 个人开发者调用量上限5000(次/日)
      this.geocoder.getAddress(this.point, function(status, result) {
        if (status === 'complete' && result.info === 'OK') {
          if (result && result.regeocode) {
            // this指向改变
            self.address = result.regeocode.formattedAddress
          }
        }
      })
    },
    // 提交回调
    handleOk() {
      this.$emit('callback', { point: this.point, address: this.address })
      this.map = null
      this.marker = null
      this.visible = false
    },
    // 取消回调
    handleCancel() {
      this.map = null
      this.marker = null
      this.visible = false
    }
  }
}
</script>

5、index.vue的css部分

<style lang="less" scoped>
/deep/ .ant-modal {
  width: 100vw !important;
  max-width: 100vw !important;
  top: 0;
  padding-bottom: 0;
  .ant-modal-body {
    height: calc(100vh - 55px - 53px);
    overflow-y: auto;
    padding: 0;
    .search-box {
      width: 100%;
      height: 150px;
    }
    #container {
      padding: 0px;
      margin: 0px;
      width: 100%;
      height: 100%;
      .amap-icon img,
      .amap-marker-content img {
        width: 25px;
        height: 34px;
      }
    }
    .toolbar {
      position: absolute;
      bottom: 50px;
      left: 0;
      width: 100%;
      height: 100px;
      background-color: #fff;
      font-size: 20px;
      text-align: center;
      line-height: 50px;
    }
  }
}
</style>

6、页面效果

逆解析经纬度得到的详细地址

Alt

总结 

到此这篇关于vue项目接入高德地图点击地图获取经纬度以及省市区功能的文章就介绍到这了,更多相关vue点击地图获取经纬度省市区内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue登录注册组件源码详解(注释)

    vue登录注册组件源码详解(注释)

    用户自行开发了一个Vue登录注册组件,采用Bootstrap表单样式,简单实现防短信轰炸功能,但因接口存在bug仅模拟了登录注册流程
    2025-07-07
  • Vue子组件调用父组件方法案例详解

    Vue子组件调用父组件方法案例详解

    这篇文章主要介绍了Vue子组件调用父组件方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Vite+TS+Vue开启eslint和prettier规范及校验方式

    Vite+TS+Vue开启eslint和prettier规范及校验方式

    这篇文章主要介绍了Vite+TS+Vue开启eslint和prettier规范及校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Vue3实现优雅加载图片的动画效果

    Vue3实现优雅加载图片的动画效果

    这篇文章主要为大家详细介绍了Vue3如何实现加载图片时添加一些动画效果,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2023-10-10
  • vue如何根据条件判断按钮是否可以点击

    vue如何根据条件判断按钮是否可以点击

    这篇文章主要介绍了vue如何根据条件判断按钮是否可以点击,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 在UniApp中使用WebView实现双向通信完整代码

    在UniApp中使用WebView实现双向通信完整代码

    这篇文章主要介绍了在UniApp中使用WebView实现双向通信的相关资料,适用于需调用不支持的API(如文件上传)的场景,包含Vue与HTML间的数据交互及调试技巧,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06
  • Vue实现双向滑动输入条

    Vue实现双向滑动输入条

    这篇文章主要为大家详细介绍了Vue实现双向滑动输入条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vuex的热更替如何实现

    Vuex的热更替如何实现

    这篇文章主要介绍了Vuex的热更替如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • vue3 + antv/x6实现流程图的全过程

    vue3 + antv/x6实现流程图的全过程

    随着互联网的发展,越来越多的应用需要实现流程图的制作,如工作流程图、电路图等,文中通过代码以及图文将实现的过程介绍的非常详细,对大家学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-06-06
  • Vue 通过this.$emit()方法子组件向父组件传值(步骤分享)

    Vue 通过this.$emit()方法子组件向父组件传值(步骤分享)

    这篇文章主要介绍了Vue this.$emit()方法通过子组件向父组件传值,第一步在父组件中引入子组件,第二步子组件向父组件传值,本文通过需要的朋友可以参考下
    2022-11-11

最新评论