vue+vue-baidu-map(百度地图)实现点击地图标注地理信息并获取经纬度坐标或拖拽图标获取地理坐标信息

本文主要是介绍vue+vue-baidu-map(百度地图)实现点击地图标注地理信息并获取经纬度坐标或拖拽图标获取地理坐标信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、实现需求

小程序中需要使用到地图导航定位,所以在客户端填写基础信息时需要填写详细地址,同时得到经纬度坐标,从而实现地图导航。
1.1 实现方式一
根据用户选择的省、市、县(区)以及输入的详细地址信息,通过百度官方提供的地址编码解析从而得到地址经纬度坐标。
先下载vue-jsonp: npm(cnpm) install --save vue-jsonp
在main中引入:import * as VueJsonp from 'vue-jsonp	(这里注意 加上” * as  “)Vue.prototype.$jsonp = VueJsonp
方法如下:
getLocation() {// addres 详细的地址信息let addres = '省' + '市' + '县(区)' + '详细地址';this.$jsonp.jsonp('https://api.map.baidu.com/geocoding/v3/', {address: addres,output: 'json',ak: 'ak密钥'}).then(res => {if (res.status == 0) {// status == 0 就是定位成功,lat\lng就是经纬度坐标let data = res.result.location;let Latitude = data.latlet Longitude = data.lng} else {this.$message.warning('未获取到地址定位信息请确认输入地址正确在提交')}}).catch(err => {console.log(err);})
},
在你以为可以的时候,事情往往没有这么简单。因为详细地址是输入的,这就在可控范围之外了,很多输入不是街道门牌号的,使用地址
接卸根本无法精确定位,但前头有省市区,它依旧能大致定位,在更具后面某些关键字,这就造成了定位不精准,导航地址会出错。于是
给出了第二种方法,让用户自己去点击地图给出定位坐标。
1.2 实现方法二
前头说到让用户自己去点击地图定位,那就得用到地图,所以下载了vue-baidu-map这个依赖
中文文档:[vue-baidui-map](https://dafrok.github.io/vue-baidu-map/#/zh/index)
同时为了方便多处使用,做成组件引用。
<template><div><!-- @moving、@moveend、@zoomend 缩放拖动地图更改地图显示层级 @dragend:拖动图标结束时执行getClickInfo获取经纬度坐标或点击地图获取点击地方的经纬度 --><baidu-map v-bind:style="mapStyle" class="bm-view" ak="密钥" :center="center" :zoom="zoom" :scroll-wheel-zoom="true" @click="getClickInfo" @moving="syncCenterAndZoom" @moveend="syncCenterAndZoom" @zoomend="syncCenterAndZoom"><bm-view style="width: 100%; height:600px;"></bm-view><!-- animation="BMAP_ANIMATION_BOUNCE" --> <bm-marker :position="{lng: center.lng, lat: center.lat}" :dragging="true" @dragend="getClickInfo"></bm-marker><bm-control :offset="{width: '10px', height: '10px'}"><bm-auto-complete v-model="keyword" :sugStyle="{zIndex: 999999}"><input type="text" placeholder="请输入搜索关键字" class="serachinput"></bm-auto-complete></bm-control><bm-local-search :keyword="keyword" :auto-viewport="true" style="width:0px;height:0px;overflow: hidden;"></bm-local-search></baidu-map><div slot="footer" style="margin-top: 20px;text-align:right;"><el-button @click="cancel">取消</el-button><el-button type="primary" @click="confirm">确定</el-button></div></div>
</template>
<script>import { BaiduMap, BmControl, BmView, BmAutoComplete, BmLocalSearch, BmMarker } from 'vue-baidu-map'export default {components: {BaiduMap,BmControl,BmView,BmAutoComplete,BmLocalSearch,BmMarker},data: function() {return {keyword: '', // 通过BmLocalSearch搜素地址,然后再进行定位mapStyle: {width: '100%',height: this.mapHeight + 'px'},center: { lng: 114.986373, lat: 27.111699 }, // 地图中心位置(也是标记点图标的位置)zoom: 17, // 地图层级addres: '', // 地址}},props: {mapHeight: { // 地图样式,默认高度(可随意)type: Number,default: 600},mapLat: Number, // 传入的经纬度,用于初始化显示地理中心位置mapLng: Number, },methods: {// 初始化地图,地图进入时默认显示的中心位置initCB() {this.center = {lat: (this.mapLat !== undefined && this.mapLat > 0) ? this.mapLat : 27.111183,lng: (this.mapLng !== undefined && this.mapLng > 0) ? this.mapLng : 115.027531}},/**** 地图点击事件、定位图标拖拽移动事件*/getClickInfo(e) {let that = this;this.center.lng = e.point.lngthis.center.lat = e.point.latvar geoc = new BMap.Geocoder();geoc.getLocation(e.point, function(rs) {var addComp = rs.addressComponents;let addr = addComp.province + addComp.city + addComp.district + addComp.street + addComp.streetNumberthat.addres = addr;console.log("当前所在位置信息" + addr);});},syncCenterAndZoom(e) {this.zoom = e.target.getZoom()},/**** 确认*/confirm: function() {let params = {center: this.center,addres: this.addres}this.$emit('mapConfirm', params)},/**** 取消*/cancel: function() {this.$emit('mapCancel', false)}}}
</script><style scoped>.serachinput {width: 300px;box-sizing: border-box;padding: 9px;border: 1px solid #dddee1;line-height: 20px;font-size: 16px;height: 38px;color: #333;position: relative;border-radius: 4px;-webkit-box-shadow: #666 0px 0px 10px;-moz-box-shadow: #666 0px 0px 10px;box-shadow: #666 0px 0px 10px;}</style>
<style>.anchorBL{display: none;}
</style>
<el-dialog title="标注详细地址" :visible.sync="showMap" top="60px" width="80%" height="800px" @opened="handlerMapOpened" :close-on-click-modal="false"><Mapset ref="mapset" title="地图标注" @mapConfirm="handlerMapClose" @mapCancel="handlerMapClose" :mapLat="CompanyBaseInfo.Latitude" :mapLng="CompanyBaseInfo.Longitude"></Mapset>
</el-dialog><!-- js部分 -->
handlerMapOpened() {// 打开弹窗时去加载地图 mapLat、mapLng传参this.$refs.mapset.initCB();
},
handlerMapClose(data) {console.log(data);if(data!=false){// 点击确认时执行}this.showMap = false;
},

最后实现效果,点击地图红色标注就会到点击的地方,也可以拖动红色标记点到指定地方
在这里插入图片描述
目前还存在的缺陷就是这个搜索,明明点击了某一个地址,但地图上还是标记了A、B、C、D…一大堆标记。
同时注意一个问题:小程序中一般默认都使用腾讯地图,而腾讯地图经纬度坐标和百度地图是不同的,所以在使用时需要转换!!!

这篇关于vue+vue-baidu-map(百度地图)实现点击地图标注地理信息并获取经纬度坐标或拖拽图标获取地理坐标信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/246213

相关文章

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方