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

最近接到一个新需要,要求如下:
当我点击选择地址时,弹出百度地图,
在这里插入图片描述
效果如下图:
在这里插入图片描述
实现方法:
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>

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Error: Please select Android SDK解决方案(仅供参考)

一、问题描述 今天开始正式接触项目的工作内容&#xff0c;然后从组里的代码仓库里git clone了一份Android Studio项目下来。下好了以后我使用Android Studio打开这个项目&#xff0c;但在尝试编译运行的时候遇到了很多错误。例如&#xff0c;开发环境界面上边用于编译的小锤子…

五,Eureka 第五章

5.3.2 修改pom添加依赖 <dependencies><!--公共部门--><dependency><groupId>cn.bdqn</groupId><artifactId>springcloud-api-commons</artifactId><version>${project.version}</version></dependency><!--e…

Python电商爬虫保姆级入门教程(纯新手向)

图灵Python课堂 长沙图灵教育于2001年开始进入教育行业&#xff0c;立足泛IT类职业教育&#xff0c;以打造高新技术人才为宗旨&#xff0c;专注于提供多层次、个性化的职业技能培训课程&#xff0c;为各行业培养技术开发、应用和管理等岗位的中高端人才&#xff0c;致力于成为…

Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

一、Django框架简介 Django框架是Python的常用web框架&#xff0c;遵循 MVC 设计模式的框架&#xff0c;采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&…

双虚拟机实现数据库自动备份

FTP的使用&#xff1a; 1.安装FTP 1、检测系统有没有安装ftp&#xff0c;执行命令&#xff1a; rpm -qa | grep ftp若存在用rpm命令移除后再行安装&#xff0c;执行命令&#xff1a; rpm -e vsftpd-3.0.2-9.e17.x86_642、如果没有安装&#xff0c;则在线安装ftp&#xff0c…

Vue2基础八、插槽

零、文章目录 Vue2基础八、插槽 1、插槽 &#xff08;1&#xff09;默认插槽 作用&#xff1a;让组件内部的一些 结构 支持 自定义需求: 将需要多次显示的对话框, 封装成一个组件问题&#xff1a;组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。…

关于anki的一些思考

文章目录 通常情况下选择什么模板制卡&#xff1f;一张填空卡片的填空数量到底要多少才合适&#xff1f; 通常情况下选择什么模板制卡&#xff1f; 通常情况是指知识是以一段文字的形式呈现&#xff0c;而不是这些&#xff1a;单词、选择题、成语等&#xff08;这些都可以定制…

openlayers根据下拉框选项在地图上显示图标

这里是关于一个根据下拉框的选项在地图上显示图标的需求&#xff0c;用的是vueopenlayers 显示效果大概是这样&#xff1a; 选中选项之后会跳转到所点击的城市&#xff0c;并且在地图上显示图标温度&#xff0c;这一块UI没设计我就大概先弄了一下&#xff0c;比较丑。。 首先…

【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 在【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值一文中介绍了如何利用…

Java使用FFmpeg实现mp4转m3u8

Java使用FFmpeg实现mp4转m3u8 前言FFmpegM3U8 一、需求及思路分析二、安装FFmpeg1.windows下安装FFmpeg2.linux下安装FFmpegUbuntuCentOS 三、代码实现1.引入依赖2.修改配置文件3.工具类4.Controlle调用5.Url转换MultipartFile的工具类 四、播放测试1.html2.nginx配置3.效果展示…

uniapp实现带参数二维码

view <view class"canvas"><!-- 二维码插件 width height设置宽高 --><canvas canvas-id"qrcode" :style"{width: ${qrcodeSize}px, height: ${qrcodeSize}px}" /></view> script import uQRCode from /utils/uqrcod…

LeetCode.189(轮转数组)

对于轮转数组这个题&#xff0c;文章一共提供三种思路&#xff0c;对于每种思路均提供其对应代码的时间、空间复杂度。 目录 1. 创建变量来保存最后一个数&#xff0c;并将其余数组向前挪动一位 &#xff1a; 1.1 原理解析&#xff1a; 1.2 代码实现&#xff1a; 2.创建一个…

Ftp和UDP的区别之如何加速文件传输

FTP&#xff08;文件传输协议&#xff09;是一种传输大文件的老方法&#xff0c;它的速度慢&#xff0c;而且容易受到网络环境的影响。在当今这个文件越来越大&#xff0c;项目交付时间越来越紧&#xff0c;工作分布在全球各地的时代&#xff0c;有没有办法让 FTP 加速呢&#…

重学C++系列之const与static关键字分析

前言 本篇幅讲解关键字const与static&#xff0c;主要围绕在类的范围内叙述&#xff0c;包括作用和使用场景等。 一、const与static的作用 1、const修饰的成员变量&#xff0c;成员变量初始化后不能再修改。 2、const修饰的成员函数&#xff0c;成员函数不可以修改成员变量&am…

数值线性代数:知识框架

记录数值线性代数研究的知识框架。 软件包线性方程组直接法Guass消元法/LU分解、Cholesky分解 LAPACK oneAPI MKL ARPACK Octave 迭代法Jacobi迭代、SOR迭代、共轭梯度法最小二乘特征值/特征向量非对称幂法、QR、Arnoldi分解对称QR、Jacobi、二分法、分治法、SVD 参考资料 G…

PDF添加水印以及防止被删除、防止编辑与打印

方法记录如下&#xff1a; 1、添加水印&#xff1b; 2、打印输出成一个新的pdf&#xff1b; 3、将pdf页面输出成一张张的图片&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09; 4、将图片组装成一个新的pdf&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09;…

多线程面试题--使用场景

线程池使用场景&#xff08;CountDownLatch、Future&#xff09; 在使用的时候&#xff0c;首先会给一个初始值&#xff0c;比如图中是3&#xff0c;然后在其他线程中调用countdown&#xff08;&#xff09;方法&#xff0c;当count0则继续执行 多线程使用场景一&#xff08; e…

【Spring Boot】Web开发 — 数据验证

Web开发 — 数据验证 对于应用系统而言&#xff0c;任何客户端传入的数据都不是绝对安全有效的&#xff0c;这就要求我们在服务端接收到数据时也对数据的有效性进行验证&#xff0c;以确保传入的数据安全正确。接下来介绍Spring Boot是如何实现数据验证的。 1.Hibernate Vali…

Python爬虫实战(基础篇)—4获取古诗词给孩子学习(附完整代码)

今天我们来获取古诗词网站的一些古诗词来提供给孩子们学习 PS前面几节课的内容在专栏这里&#xff0c;欢迎大家考古&#xff1a;点我 首先我们看一下网站&#xff1a;点我&#xff0c;今天我们来获取一下【唐诗三百首】 第 1 步&#xff1a;网页分析 在网页中我们发现有许多以…

mysql -速成

目录 1.概述 1.3SQL的优点 1.4 SQL 语言的分类 2. 软件的安装与启动 2.1 安装 2.2 MySQL服务的启动和停止 2.3 MySQL服务的登录和退出 ​编辑 2.4 mysql常用命令 2.5 图形化用户结构Sqlyong 3.DQL 语言 3.1 基础查询 3.1.1、语法 3.1.2 特点 3.2 条件查询 3.2.1 …