vue element ui web端引入百度地图,并获取经纬度

news2024/11/17 11:41:36

最近接到一个新需要,要求如下:
当我点击选择地址时,弹出百度地图,
在这里插入图片描述
效果如下图:
在这里插入图片描述
实现方法:
1、首先要在百度地图开放平台去申请一个账号和key
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、申请好之后,在项目的index.html中引入
在这里插入图片描述
3、我写了一个组件,方便项目中任何地方可以调用:
在这里插入图片描述
这里一定要设置一个宽高,容器才能更好的适应,不然显示出来达不到想要的效果,如果没有设置高度还可能显示不出来
在这里插入图片描述
4、接下来就是开始初始化地图设置了,我的是在弹窗里面用,所有我写在watch里面的,当监测到弹窗打开时即开始初始化地图页面
在这里插入图片描述
5、具体方法如下:
在这里插入图片描述

在这里插入图片描述
直接附上源码:

<template lang="html">
  <el-dialog v-dialogDrag title="选择地点" append-to-body width="800px" :visible.sync="mvisible" :close-on-click-modal="false"
             @close="cancel"
  >
    <div id="amap-container">
      <el-row>
        <el-col :span="14">
          <formatForm ref="basicInfoForm" class="basicForm" :form-list="basicInfoList" :form-validate="basicFormValidate" />
        </el-col>
        <el-col :span="10">
          <el-input
            id="search-input"
            v-model="searchValue"
            class="input-with"
            placeholder="请输入详细地址"
            clearable
            @clear="handelclearInput"
            @keyup.native.enter="onhandelSearch"
          >
            <el-button
              slot="append"
              size="small"
              type="primary"
              icon="el-icon-search"
              @click="onhandelSearch"
            >搜索
            </el-button>
          </el-input>
        </el-col>
      </el-row>
      <el-row class="margin-top-10 address">
        当前地址是: {{ addressName }}{{ searchValue }}
      </el-row>
      <div id="mapBox" />
    </div>
    <div slot="footer" class="dialog-footer">
      <el-button type="primary" @click="handelSave">保 存</el-button>
      <el-button @click="cancel">取 消</el-button>
    </div>
  </el-dialog>
</template>

<script>
import { cleanChildrenEmpty } from '@/utils/filterArrayData'
import { getAddressName } from '@/utils/getAddressName'
import { selectRequired } from '@/utils/formRules'
// import AMapLoader from '@amap/amap-jsapi-loader'
import region from '@/static/json/region.json'
import formatForm from '@/components/formatForm/index'
// import { BMap } from 'vue-baidu-map/types'
// const BMapGL = require('vue-baidu-map/types/map')
let BMapGL = {}
let map = {}
const addressOption = cleanChildrenEmpty(region, 'children')
export default {
  name: 'AMap',
  components: { formatForm },
  props: {
    businessProvinceId: {
      type: Array,
      default: () => []
    },
    defaultValue: {
      type: String,
      default: ''
    },
    visible: {
      type: Boolean,
      default: false
    }
  },
  data() {
    const that = this
    return {
      mvisible: false,
      defaultCity: '',
      // 地址对应的经纬度信息
      lat: '',
      lng: '',
      // 检索关键字
      searchValue: '',
      // 地址名称
      adcode: '',
      basicInfoList: {
        span: 24,
        title: '',
        labelWidth: '70px',
        isColon: true,
        list: [
          {
            type: 'cascader',
            exist: true,
            fieldName: '省市区',
            fieldEName: 'businessProvinceId',
            expandTrigger: 'hover',
            label: 'name',
            value: 'id',
            placeholder: '请选择省市区',
            options: addressOption,
            rules: [selectRequired],
            change: res => {
              this.addressName = res.length ? getAddressName(res, addressOption).name : ''
              this.onhandelSearch()
            }
          }
        ]
      },
      basicFormValidate: {
        businessProvinceId: []
      },
      addressName: '',
      district: '',
      newDistrict: ''
    }
  },
  watch: {
    defaultValue() {
      this.searchValue = this.defaultValue
    },
    visible() {
      this.mvisible = this.visible
      this.searchValue = this.defaultValue
      console.log(this.businessProvinceId.length, this.defaultValue)
      this.basicFormValidate.businessProvinceId = this.businessProvinceId || []
      this.addressName = this.businessProvinceId.length && !this.defaultValue ? getAddressName(this.businessProvinceId, addressOption).name : ''
      const oldDistrict = this.businessProvinceId.length && !this.defaultValue ? (getAddressName(this.businessProvinceId, addressOption).name2).split('-') : []
      this.district = oldDistrict.length ? oldDistrict[oldDistrict.length - 1] : ''
      this.$nextTick(() => {
        // 初始化地图页面
        this.initMap()
      })
    }
  },
  beforeDestroy() {
    // 销毁地图
    // this.map.destroy()
  },
  methods: {
    initMap() {
      BMapGL = window.BMapGL
      map = new BMapGL.Map('mapBox') // 创建Map实例
      map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 12) // 初始化地图,设置中心点坐标和地图级别
      map.enableScrollWheelZoom(true) // 开启鼠标滚轮缩放
      console.log('this.addressName', this.addressName)
      const center = this.addressName
      map.setCenter(center)
      this.getPoint()
      this.getClickMapIp()
      // // 添加maker
      // this.setMaker()
      // // 添加鼠标点选地图选择地址
      // this.addAmapGeocoder()
      // this.onhandelSearch()
    },
    getPoint() {
      const center = this.addressName || this.searchValue
      const myGeo = new BMapGL.Geocoder()
      myGeo.getPoint(center, (point) => {
        if (point) {
          map.centerAndZoom(point, 12)
          map.addOverlay(new BMapGL.Marker(point, { title: center }))
        } else {
          alert('您选择的地址没有解析到结果!')
        }
      }, this.addressName)
    },
    getClickMapIp() {
      map.addEventListener('click', (e) => {
        console.log('e----', e)
        this.lat = e.latlng.lat
        this.lng = e.latlng.lng
        const point = new BMapGL.Point(this.lng, this.lat)
        map.centerAndZoom(point, 12) // 初始化地图,设置中心点坐标和地图级别
        this.setMarker(point)
        // 指定经纬度获取地址
        this.getLocation(point)
      })
    },
    // 添加marker
    setMarker(new_point) {
      map.clearOverlays()
      const marker = new BMapGL.Marker(new_point)
      map.addOverlay(marker) // 将标注添加到地图中
      map.panTo(new_point)
    },
    // 获取地址
    getLocation(pt) {
      // 创建地理编码实例
      const myGeo = new BMapGL.Geocoder()
      console.log('myGeo', myGeo)
      myGeo.getLocation(pt, (re) => {
        const { province, city, district, street, streetNumber } = re.addressComponents || {}
        this.newDistrict = district
        this.addressName = `${province || ''}${city || ''}${district || ''}`
        this.searchValue = `${street || ''}${streetNumber || ''}`
        console.log('getLocation', re)
        // this.getCityCode(district)
      })
    },
    getCityCode(city) {
      console.log('city', city)
      const myCity = new BMapGL.Geolocation()

      console.log('myCity', myCity)
      myCity.getCityCode(city, res => {
        console.log('getCurrentPosition======', res)
      })
    },
    // 按钮触发检索
    onhandelSearch() {
      const local = new BMapGL.LocalSearch(map, {
        renderOptions: { map: map }
      })
      const address = this.addressName + this.searchValue
      local.search(address)
    },
    handelclearInput() {
      this.searchValue = ''
    },
    // 保存当前选择的地址,分发事件
    handelSave() {
      const { newDistrict, district, lat, lng } = this
      const { businessProvinceId } = this.basicFormValidate
      console.log('businessProvinceId', businessProvinceId)
      const s = district ? district === newDistrict : true
      if (businessProvinceId.length === 3 && lat && lng && s) {
        const x_pi = 3.14159265358979324 * 3000.0 / 180.0
        const x = lng - 0.0065
        const y = lat - 0.006
        const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi)
        const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi)
        const lngs = z * Math.cos(theta)
        const lats = z * Math.sin(theta)
        const data = {
          name: this.name,
          businessProvinceId,
          // 地址名称
          address: this.formattedAddress,
          // 纬度lat
          lat: lats,
          // 经度lng
          lng: lngs
        }
        this.$emit('getPosition', true, data)
      } else {
        this.$message.error('当前地址不在省市区范围内,请重新选择')
      }
    },
    cancel() {
      this.$emit('getPosition', false)
    }
  }
}
</script>

<style scoped lang="scss">
#amap-container {
  margin: 20px;

  .el-input__clear {
    line-height: 34px;
    /*top: 20px;*/
  }

  #mapBox {
    height: 35vh;
    width: 100%;
    margin-top: 10px;
    border: 1px solid #ccc;
  }

  .input-with {
    /*position: fixed;*/
    /*top: 40px;*/
    z-index: 1;
    width: 580px;
  }

  .address {
    color: #373737;
  }

}

.amap-sug-result {
  z-index: 99999;
}

.baseForm.format_form {
  margin: 0 !important;
}
</style>

根据项目需求做调整即可。
好了就这样吧,助人达已,爱分享爱学习,做一个快乐的前端小姐姐
如有更好的方法,欢迎交流!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows安装npm, 命令简介

安装步骤 要在Windows上安装npm&#xff0c;按照以下步骤操作&#xff1a; 首先&#xff0c;确保您已经在计算机上安装了Node.js。可以从Node.js官方网站&#xff08;Node.js&#xff09;下载并安装Node.js。完成Node.js的安装后&#xff0c;打开命令提示符&#xff08;Command…

springboot第32集:redis系统-android系统-Nacos Server

Error parsing HTTP request header HTTP method names must be tokens 检查发送HTTP请求的客户端代码&#xff0c;确保方法名中不包含非法字符。通常情况下&#xff0c;HTTP请求的方法名应该是简单的标识符&#xff0c;例如"GET"、"POST"、"PUT"…

java语法基础--基本数据类型

一、数据类型概括 1、整数类型 2、浮点型 3、布尔类型 4、字符类型 二、数据类型的使用 1、整数类型的使用 超出类型范围 //1.1 定义一个byte类型的变量&#xff0c;并且设置它超过byte类型范围// 如果定义的数值在byte类型范围内&#xff0c;那么就能正常使用&#xff0c;//…

flask中的cookies介绍

flask中的cookies介绍 “Cookie” 在 web 开发中是一种非常重要的技术&#xff0c;用于在客户端&#xff08;即用户的浏览器&#xff09;存储信息&#xff0c;以便在多个页面和多个访问会话之间保持状态。Cookies 通常用于记住用户的登录信息&#xff0c;跟踪用户在站点上的浏…

自动化测试测试框架封装改造

PO模式自动化测试用例 PO设计模式是自动化测试中最佳的设计模式&#xff0c;主要体现在对界面交互细节的封装&#xff0c;在实际测试中只关注业务流程就可以了。 相较于传统的设计&#xff0c;在新增测试用例后PO模式有如下优点&#xff1a; 1、易读性强 2、可扩展性好 3、…

【数据库原理】三级项目——数据库基本操作

一、项目名称 数据库基本操作 二、项目内容 了解一种DBMS的功能和界面。使用图形化界面创建数据库。使用图形化界面创建课本70页习题6中的关系表。使用图形化界面向所建的关系表中插入数据。完成70页习题6第3-5小题的各项查询。查询每个城市供应的零件总数。查询使用零件数量…

安卓:视图绑定——ButterKnife

目录 一、ButterKnife介绍 二、ButterKnife优点&#xff1a; 三、ButterKnife的使用 build.gradle添加 ButterKnife 依赖&#xff1a; 1、视图绑定&#xff1a; 2、点击事件绑定&#xff1a; 3、资源绑定&#xff1a; 4.绑定多个视图元素&#xff1a; 5.绑定视图容器&…

内核链表在用户程序中的移植和使用

基础知识 struct list_head {struct list_head *next, *prev; }; 初始化&#xff1a; #define LIST_HEAD_INIT(name) { (name)->next (name); (name)->prev (name);} 相比于下面这样初始化&#xff0c;前面初始化的好处是&#xff0c;处理链表的时候&#xff0c;不…

Python中运行取消Python console模式

在Python里run的时候突然会发现&#xff0c;进入的不是run模式&#xff0c;而是console模式&#xff0c;这种运行模式能保留你每次的运行历史&#xff0c;因为会重开一个运行小页面&#xff0c;关闭操作如下&#xff1a;

GAMES104里渲染等一些剩下的问题

渲染的一些剩下的问题 1. 如何理解渲染中的AO(环境光遮蔽) 环境光遮蔽 我们先从一个简单的效果开始—环境光遮蔽(Ambient Occlusion,以下简称AO)。大家可以看到&#xff0c;下图中的场景没有任何渲染效果&#xff0c;也没有任何着色效果&#xff0c;但场景呈现出了非常清晰的…

大数据学习教程:Linux 基础教程(上)

1 操作系统概述 1.1 计算机原理 现代计算机大部分都是基于冯.诺依曼结构&#xff0c;该结构的核心思想是将程序和数据都存放在计算机中&#xff0c;按存储器的存储程序首地址执行程序的第一条指令&#xff0c;然后进行数据的处理计算。 计算机应包括运算器、控制器、储存器、…

PLC学习的步骤与重点:

熟悉基础元器件的原理和使用方法&#xff1a;了解按钮、断路器、继电器、接触器、24V开关电源等基础元器件的原理和使用方法&#xff0c;并能够应用它们来实现简单的逻辑电路&#xff0c;例如电机的正反转和单按钮的启停控制。 掌握PLC的接线方法&#xff1a;了解PLC的输入输出…

【C++进阶:map和set】

本节涉及到的所有代码见以下链接&#xff0c;欢迎参考指正&#xff01; ​​​​​​​ practice: 课程代码练习 - Gitee.comhttps://gitee.com/ace-zhe/practice/tree/master/map%E5%92%8Cset ​​​​​​​ 关联式容器 在C初阶阶段&#xff0c;已经学习并总了STL中的部分…

麒麟信安携手先进数通发布“多云协同,加速推进服务器虚拟化国产平滑迁移”信创联合解决方案

金融行业是现代经济的核心&#xff0c;金融行业信息技术应用创新是关系“国家安全”和“科技强国”战略的重要工程。为满足银行等金融机构数字化转型和信创发展的双重需求&#xff0c;麒麟信安与北京先进数通信息技术股份公司携手推出“多云协同&#xff0c;加速推进服务器虚拟…

Elisp之message为内容增加颜色(二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

驱动 CAN总线

Controller Area Network&#xff08;控制器局部网络&#xff09;是一种有效支持分布式控制或实时控制的串行异步半双工的现场总线&#xff0c;支持多主机多从机&#xff0c;需要 CAN控制器 和 CAN收发器 的硬件支持 标准内容ISO 11898-1:2015定义数据链路层&#xff08;包括逻…

「二叉树与递归的一些框架思维」

文章目录 0 二叉树1 思路2 刷题2.1 二叉树的最大深度题解Code结果 2.2 二叉树的直径题解Code结果 2.3 在每个树行中找最大值题解Code结果 2.4 翻转二叉树题解Code结果 2.5 二叉树展开为链表题解Code结果 2.6 每日一题&#xff1a;数组中两元素的最大乘积题解Code结果 0 二叉树 …

华为开源自研AI框架昇思MindSpore应用案例:Vision Transformer图像分类

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年&#xff0c;随着基于自注意&…

Spring——Spring是什么?IoC容器是什么?

文章目录 前言一、Spring是什么1.IoC 容器 —— 容器2.IoC 容器 —— IoC传统程序开发控制反转式程序开发 3.Spring IoC 二、DI是什么总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话&#xff0c;互关一下…

Vue2基础四、生命周期

零、文章目录 Vue2基础四、生命周期 1、生命周期 Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 创建阶段&#xff1a;创建响应式数据挂载阶段&#xff1a;渲染模板更新阶段&#xff1a;修改…