当前位置:   article > 正文

vue-使用Baidu(百度地图)实现输入位置获取定位经纬度_vue获取当前定位坐标

vue获取当前定位坐标

前言

  • 开发中我们需要地图定位,就是用户输入位置,自动定位获取经纬度,传递给后端存在数据库

  • 找了一圈发现千篇一律,最后也是使用element的搜索输入款配合原生百度地图实现这个功能

  • 点击地图需要逆地址解析,输入地址时调用百度地图渲染在下拉框,选择传输地址,经纬度

  • 一般是在添加时加载地图,可能会因为网络原因加载地图实例失败,所以需要一直加载到实例

  • 在项目中工具文件形式引入,相当于创建了一个<script>标签引入地图资源,挂在在全局上

效果图

获取经纬度

代码实现-直接复制需要申请AK-主页文章有

1.在工具文件下建立utils/loadBMap.js-内容如下

  1. export default function loadBMap (ak) {
  2. return new Promise(function (resolve, reject) {
  3.   if (typeof window.BMap !== 'undefined') {
  4.     resolve(window.BMap)
  5.     return true
  6.   }
  7.   window.onBMapCallback = function () {
  8.     resolve(window.BMap)
  9.   }
  10.   const script = document.createElement('script')
  11.   script.type = 'text/javascript'
  12.   script.src =
  13.     'https://api.map.baidu.com/api?v=3.0&ak=' +
  14.     ak +
  15.     '&callback=onBMapCallback'
  16.   script.onerror = reject
  17.   document.head.appendChild(script)
  18. })
  19. }

2.在页面中使用-注意没有写AK-需要换

  1. <template>
  2. <div class="conter">
  3.   <el-button type="primary" size="small" @click="addbaidu"
  4.     >添加信息</el-button
  5.   >
  6.   <el-dialog title="地图定位" :visible.sync="dialogVisible" @close="close" width="30%">
  7.     <el-form ref="form" :model="form" label-width="100px">
  8.       <el-form-item label="归属地址:" prop="building">
  9.         <el-autocomplete
  10.           style="width: 100%"
  11.           v-model="form.building"
  12.           :fetch-suggestions="querySearchAsync"
  13.           :trigger-on-focus="false"
  14.           placeholder="请先搜索地址"
  15.           clearable
  16.           @select="handleSelect"
  17.         >
  18.           <template slot-scope="{ item }">
  19.             <i class="el-icon-search fl mgr10" />
  20.             <div style="overflow: hidden">
  21.               <div class="title">{{ item.title }}</div>
  22.               <span class="address ellipsis">{{ item.address }}</span>
  23.             </div>
  24.           </template>
  25.         </el-autocomplete>
  26.       </el-form-item>
  27.       <el-form-item label="地图定位:">
  28.         <div id="map-container" style="width: 100%; height: 300px" />
  29.       </el-form-item>
  30.       <el-form-item label="经度:">
  31.         <el-input v-model="form.longitude" autocomplete="off"></el-input>
  32.       </el-form-item>
  33.       <el-form-item label="维度:">
  34.         <el-input v-model="form.latitude" autocomplete="off"></el-input>
  35.       </el-form-item>
  36.     </el-form>
  37.     <span slot="footer" class="dialog-footer">
  38.       <el-button @click="dialogVisible = false">取 消</el-button>
  39.       <el-button type="primary" @click="dialogVisible = false"
  40.         >确 定</el-button
  41.       >
  42.     </span>
  43.   </el-dialog>
  44. </div>
  45. </template>
  46. <script>
  47. // 引入第三方工具包
  48. import loadBMap from '@/utils/loadBMap.js'
  49. export default {
  50. name: 'Baidu',
  51. data() {
  52.   return {
  53.     // 地图实例
  54.     map: null,
  55.     // Marker实例
  56.     mk: null,
  57.     // 定时器
  58.     initMapeq: null,
  59.     // 表单开关
  60.     dialogVisible: false,
  61.     // 表单
  62.     form: {}
  63.   }
  64. },
  65. created() {},
  66. mounted() {
  67.   // 页面加载完之后,加载百度地图
  68.   // 加载引入BMap
  69.   loadBMap('你的AK')-需要申请主页文章有
  70. },
  71. methods: {
  72.   close(){
  73.     this.form = {}
  74.   },
  75.   // 添加开关
  76.   addbaidu() {
  77.     // 打开表单
  78.     this.dialogVisible = true
  79.     // 加载地图
  80.     this.getbaidu()
  81.   },
  82.   // 加载地图方法
  83.   getbaidu() {
  84.     this.showDialog = true
  85.     this.initMapeq = setInterval(() => {
  86.       if (this.initMap()) {
  87.         clearInterval(this.initMapeq)
  88.       }
  89.     })
  90.   },
  91.   // 百度地图封装方法
  92.   // 初始化地图
  93.   initMap() {
  94.     try {
  95.       var that = this
  96.       // 1、挂载地图
  97.       // 创建地图实例
  98.       this.map = new BMap.Map('map-container')
  99.       // 设置中心经纬度 这里我们使用BMapGL命名空间下的Point类来创建一个坐标点。Point类描述了一个地理坐标点,其中120.872845表示经度,32.021089表示纬度。(为南通濠河风景区坐标) 作者:星银色飞行船
  100.       var point = new BMap.Point(
  101.         this.form.longitude || 116.41338729034514,
  102.         this.form.latitude || 39.910923647957596
  103.       )
  104.       // 3.在创建地图实例后,我们需要对其进行初始化,BMapGL.Map.centerAndZoom()方法要求设置中心点坐标和地图级别。 地图必须经过初始化才可以执行其他操作
  105.       this.map.centerAndZoom(point, 14)
  106.       // 滚轮缩放
  107.       this.map.enableScrollWheelZoom()
  108.       // 3、设置图像标注并绑定拖拽标注结束后事件
  109.       this.mk = new BMap.Marker(point, { enableDragging: true })
  110.       this.map.addOverlay(this.mk)
  111.     } catch (err) {
  112.       return false
  113.     }
  114.     // 4、添加(右上角)平移缩放控件
  115.     this.map.addControl(
  116.       new BMap.NavigationControl({
  117.         anchor: BMAP_ANCHOR_TOP_RIGHT,
  118.         type: BMAP_NAVIGATION_CONTROL_SMALL
  119.       })
  120.     )
  121.     // 7、绑定点击地图任意点事件
  122.     this.map.addEventListener('click', function (e) {
  123.       console.log('点击了', e)
  124.       that.getAddrByPoint(e.point)
  125.     })
  126.     return true
  127.   },
  128.   // 2、逆地址解析函数 根据坐标点获取详细地址 point   百度地图坐标点,必传
  129.   getAddrByPoint(point) {
  130.     var that = this
  131.     var geco = new BMap.Geocoder()
  132.     geco.getLocation(point, function (res) {
  133.       // console.log(res);
  134.       that.mk.setPosition(point)
  135.       that.map.panTo(point)
  136.       that.form.building = res.address
  137.       that.form.longitude = res.point.lng
  138.       that.form.latitude = res.point.lat
  139.     })
  140.   },
  141.   // 8-1、地址搜索
  142.   querySearchAsync(str, cb) {
  143.     // 根据状态码
  144.     var options = {
  145.       onSearchComplete: function (res) {
  146.         var s = []
  147.         if (local.getStatus() == BMAP_STATUS_SUCCESS) {
  148.           for (var i = 0; i < res.getCurrentNumPois(); i++) {
  149.             s.push(res.getPoi(i))
  150.           }
  151.           cb(s)
  152.         } else {
  153.           cb(s)
  154.         }
  155.       }
  156.     }
  157.     var local = new BMap.LocalSearch(this.map, options)
  158.     local.search(str)
  159.   },
  160.   // 8-2、选择地址
  161.   handleSelect(item) {
  162.     this.form.building = item.address + item.title
  163.     console.log(item);
  164.     this.form.longitude = item.point.lng
  165.     this.form.latitude = item.point.lat
  166.     console.log('lng', item.point.lng)
  167.     console.log('lat', item.point.lat)
  168.     this.map.clearOverlays()
  169.     this.mk = new BMap.Marker(item.point)
  170.     this.map.addOverlay(this.mk)
  171.     this.map.panTo(item.point)
  172.   }
  173. }
  174. }
  175. </script>
  176. <style lang="scss" scoped>
  177. .conter {
  178. // 去除百度地图的图标
  179. ::v-deep .anchorBL {
  180.   display: none !important;
  181. }
  182. }
  183. </style>

总结:

经过这一趟流程下来相信你也对 vue-使用Baidu(百度地图)实现输入位置获取定位经纬度 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/109805
推荐阅读
相关标签
  

闽ICP备14008679号