Vue+百度地图api_vue 百度地图api-程序员宅基地

技术标签: 街景地图  vue  js  


一、百度地图开放平台是什么?

    百度地图开放平台是面向广大政府、企业、互联网等开发者开放地图服务的平台。百度地图开放平台。若想使用高德地图,请查看文章Vue+高德地图api

二、创建百度地图

1.创建vue项目

推荐使用vue-element-admin作为模板,这一步骤就不多阐述。

2.引入百度地图API文件

在index.html中引入。在这里插入图片描述
要注意版本,不同版本的方法会有所不同,这里使用v3.0。

<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的秘钥"></script>

config.js配置webpack,此操作是为了优化打包,减少体积。在externals中添加百度地图即可
在这里插入图片描述

3.创建容器

创建一个新的组件

<template>
  <div>
  	<!-- 必须要设置div的高度 -->
    <div id="map" style="height: 810px;" />
  </div>
</template>
<script>
// 引入百度地图
import BMap from 'BMap'
export default {
      
  name: '',
  data() {
      
    return {
      
      map: '',
      mapZoom: 14
    }
  },
  created() {
      
    this.$nextTick(() => {
      
      this.initMap()
    })
  },
  methods: {
      
  	// 初始化
  	initMap() {
      
      // 创建Map实例
      this.map = new BMap.Map('map')
      // 初始化地图,设置中心点坐标和地图级别
      this.map.centerAndZoom(new BMap.Point(104.072242, 30.663711), this.mapZoom)
      // 设置地图显示的城市 此项是必须设置的
      this.map.setCurrentCity('成都')
      // 启用滚轮放大缩小,默认禁用
      this.map.enableScrollWheelZoom(true)
      // 启用地图惯性拖拽,默认禁用
      this.map.enableContinuousZoom(true)
    }
  }
</script>
<style>
// 这个样式可以去除地图底部logo
.anchorBL{
      
  display:none;
}
</style>

这样简单的百度地图示例已经完成。

三、使用百度地图

1、基础操作

按照上述步骤已经对百度地图进行初始化,并把实例赋值给map,然后就可以使用this.map来调用百度地图的方法。

(1)事件

①点击事件

在初始化的方法中,加入事件即可。

this.map.addEventListener('click', (data) => {
    
	// point包含了经纬度
	console.log(data.point)
})
②地图缩放结束事件
this.map.addEventListener("zoomend", (type) => {
    })

(2)创建覆盖物(点、线、面)

// 创建一个自定义图片的点覆盖物
addMarker() {
    
	// 添加图片
	var myIcon = new BMap.Icon("图片地址", new BMap.Size(50, 50))
	// 创建点
	var ponit = new BMap.Point(104.072242, 30.663711)
	// 创建标记
	var marker = new BMap.Marker(ponit, {
    icon: myIcon})
	// 在地图上添加点标记
	this.map.addOverlay(marker)
}
// 创建线覆盖物
addPolygon() {
    
	const point = [
		new BMap.Point(116.387112, 39.920977),
        new BMap.Point(116.385243, 39.913063),
        new BMap.Point(116.394226, 39.917988),
        new BMap.Point(116.401772, 39.921364),
        new BMap.Point(116.41248, 39.927893)
	]
	var polyline = new BMap.Polyline(point, {
    
		// 颜色
		strokeColor: "blue",
		// 宽度
		strokeWeight: 2,
		// 透明度
		strokeOpacity: 0.5,
	});
}

效果图
在这里插入图片描述

(3)添加信息窗口

添加完点标记后,可以再设置一个信息窗口

// 接着上面代码
marker.addEventListener('click', () => {
    
  var opts = {
    
    width: 200,
    height: 150,
    title: '基本信息'
  }
  var html = `<div>
                <p>单位名称:${
      item.name}</p>
                <p>联系电话${
      item.contactInformation}</p>
                <p>单位地址:${
      item.enterpriseAddressDetails}</p>
              </div>`
  var infoWindow = new BMap.InfoWindow(html, opts)
  this.map.openInfoWindow(infoWindow, ponit)
})

(4)清除覆盖物

①清除所有
removeOverlay() {
    
	this.map.clearOverlays()
}
②清除指定

1.创建一个点,然后清除。removeOverlay方法的参数是一个覆盖物对象,想要清除多个时,需要用把覆盖物放在数组里,然后循环清除。注意new BMap.Marker()方法相当于每次创建了一个新的对象,所以并不能通过同一个坐标新建一个marker来删除之前的。

// 创建一个标记
var ponit = new BMap.Point(104.072242, 30.663711)
var marker = new BMap.Marker(ponit)
this.map.addOverlay(marker)
// 清除一个标记
this.map.removeOverlay(marker)

其他覆盖物同理,比如创建一个圆,然后清除

var circle = new BMap.Circle(point, 2000, {
    
	fillColor: "blue",
	strokeWeight: 1,
  	fillOpacity: 0.2,
  	strokeOpacity: 0.3,
})
this.map.addOverlay(circle)
this.map.removeOverlay(circle)

2.发现有一些覆盖物用上述方法并不能删除,如路书中的icon。

const moveMarker = new BMap.Icon(
	img,
	{
     widht: 30, height: 36 },
	{
     anchor: new BMap.Size(15, 36) }
);
// 创建路书
const lushu = new BMapLib.LuShu(this.centerMap, point, {
    
	defaultContent: "标题",
	icon: moveMarker,
	// 米/秒
	speed: 300,
	// 是否自动调整视野
	autoView: false,
	// 是否开启走路旋转
	enableRotation: false,
	landmarkPois: [],
});

使用this.map.addOverlay(moveMarker)发现没有删除。我们可以通过自己加一些自定义属性来删除。

const moveMarker = new BMap.Icon(
	img,
	{
     widht: 30, height: 36 },
	{
     anchor: new BMap.Size(15, 36) }
);
// 加入一个自定id并赋值
moveMarker.id = "123456";
// 创建路书
const lushu = new BMapLib.LuShu(this.centerMap, point, {
    
	defaultContent: "标题",
	icon: moveMarker,
	// 米/秒
	speed: 300,
	// 是否自动调整视野
	autoView: false,
	// 是否开启走路旋转
	enableRotation: false,
	landmarkPois: [],
});
// 获取当前地图上所有的覆盖物
const overlays = this.map.getOverlays();
overlays.forEach((item) => {
    
	// 循环寻找上面添加的指定id(属性较多,而且可能不一定是K这个变量,需要仔细找一下)
	if (item.K && item.K.Be && item.K.Be.id === "123456") {
    
		this.map.removeOverlay(item);
	}
});

(5)地址逆解析

const geoc = new BMap.Geocoder()
const ponit = new BMap.Point(104.072242, 30.663711)
geoc.getLocation(ponit, (res) => {
    
  console.log(res.address)
})

2、控件

(1)城市控件

通过搜索城市名称,然后定位所选城市

// 创建城市选择控件
const cityControl = new BMap.CityListControl({
    
  /* 
  	控件的停靠位置(可选,默认左上角)
  	BMAP_ANCHOR_TOP_RIGHT 右上角
  	BMAP_ANCHOR_BOTTOM_LEFT 左下角
  	BMAP_ANCHOR_BOTTOM_RIGHT 右下角
  */
  anchor: BMAP_ANCHOR_TOP_LEFT,
  // 控件基于停靠位置的偏移量(可选)
  offset: new BMap.Size(10, 5)
})
// 将控件添加到地图上
this.map.addControl(cityControl)

效果如图
效果展示

(2)地址检索

在地图初始化的时候添加一个地址检索

<!-- 地图容器 -->
<div id="caseMap" style="width: 100%; height: 370px" />
<!-- 检索地址容器 -->
<div id="r-result" style="float: left; margin-top: -370px">
	<el-input
		style="width: 350px"
		size="mini"
		type="text"
		id="suggestId"
		v-model="city"
	>
		<template slot="prepend">请输入:</template>
	</el-input>
</div>
initMap() {
    
	const self = this
	// 创建Map实例
	this.map = new BMap.Map('map')
	// 初始化地图,设置中心点坐标和地图级别
	this.map.centerAndZoom(new BMap.Point(104.072242, 30.663711), this.mapZoom)
	// 设置地图显示的城市 此项是必须设置的
	this.map.setCurrentCity('成都')
	// 启用滚轮放大缩小,默认禁用
	this.map.enableScrollWheelZoom(true)
	// 启用地图惯性拖拽,默认禁用
	this.map.enableContinuousZoom(true)
	//建立一个自动完成的对象
	var ac = new BMap.Autocomplete({
    
      // 输入框的id
      input: "suggestId",
      location: this.map,
    })
    ac.addEventListener("onhighlight", function (e) {
    
      //鼠标放在下拉列表上的事件
    })
    ac.addEventListener("onconfirm", function (e) {
    
      //鼠标点击下拉列表后的事件
      var _value = e.item.value;
      // 拼装的地址信息
      var myValue =
        _value.province +
        _value.city +
        _value.district +
        _value.street +
        _value.business;
      self.setPlace(myValue);
    })
}
setPlace(e) {
    
	const self = this;
	this.map.clearOverlays(); //清除地图上所有覆盖物
	// 创建一个检索对象
	var local = new BMap.LocalSearch(self.map, {
    
		//智能搜索
		onSearchComplete: function () {
    
			var pp = local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
			// 获取的经纬度根据自己业务赋值
			// self.dataForm.address = e;
			// self.dataForm.longitude = pp.lng;
			// self.dataForm.latitude = pp.lat;
			self.map.centerAndZoom(pp, 18);
			self.map.addOverlay(new BMap.Marker(pp)); //添加标注
		},
	});
	local.search(e);
},

效果图
在这里插入图片描述
Tip如果是在<el-dialog />组件中使用搜索时,需要注意搜索提示会没有,这是因为被挡住了。我们通过F12是可以看到的。这时候就需要把提示框的z-index设置大一些就行了。
在这里插入图片描述

.tangram-suggestion-main {
    
  z-index: 9999;
}

3、线路规划

(1)步行线路规划

<!-- 放搜索结果 -->
<div id="r-result" style="position: fixed; top: 100px; right: 5px"></div>
var walking = new BMap.WalkingRoute(this.centerMap, {
     
    renderOptions: {
     
        map: this.centerMap,
        /* 
         * 这里是百度地图的检索路线结果面板,在html中写一个div用于展示,panel的值为div的id。
         * 有些时候我们可能不需要过多的信息,这时可以用onSearchComplete方法自定义一个面板。
         */
        panel: "r-result",
        // 是否选择第一个检索结果
        selectFirstResult: true,
        // 检索结束后是否自动调整地图视野
        autoViewport: true 
    },
    // 检索完成后回调
    onSearchComplete: function(results){
    
      if (walking.getStatus() != BMAP_STATUS_SUCCESS){
    
          return
      }
      // 获取第一个路线
      var plan = results.getPlan(0)
      // 获取时间
      plan.getDuration(true)
      // 获取距离
      plan.getDistance(true)
    }
})
var start = new BMap.Point(116.310791, 40.003419)
var end = new BMap.Point(116.326419, 40.003519)
walking.search(start, end)

效果图
在这里插入图片描述

(2)驾车路线规划

代码跟步行类似,只需把new BMap.WalkingRoute()换成new BMap.DrivingRoute()即可。
在这里插入图片描述

4、覆盖物

(1)轨迹运动——路书

1.首先在index.html页面引入路书js文件

<script type="text/javascript" src="https://api.map.baidu.com/library/LuShu/1.2/src/LuShu_min.js"></script>

2.创建路书

// 假设points是从后端请求的经纬度数据
const points = [
	{
    lng: 116.387112, lat: 39.920977},
	{
    lng: 116.385243, lat: 39.913063},
	.....
]
const point = []
points.forEach(item => {
    
	point.push(new BMap.Point(item.lng, item.lat))
}
// 添加线覆盖物当做路线
var polyline = new BMap.Polyline(point, {
    
	strokeColor: "blue",
	strokeWeight: 2,
	strokeOpacity: 0.5,
});
this.centerMap.addOverlay(polyline);
// this.centerMap 创建的地图实例
// point 坐标数组,必须是用new BMap.Point()创建的坐标数组
// opts 自定义设置
var lushu = new BMapLib.LuShu(this.centerMap, point, {
    
	// 标题
	defaultContent: "运动轨迹",
	// 图标
	icon: "",
	// 速度,单位米/秒
	speed: 300,
	// 是否自动调整视野
	autoView: true,
	// 是否开启走路旋转
	enableRotation: true,
	// 特殊点信息。如果没有特殊点直接放个空数组也可以,不设置参数貌似会报错
	landmarkPois: [],
});
lushu.start();

3.方法

// 启动运动
lushu.start();
// 暂停运动
lushu.pause();
// 结束运动
lushu.stop();

效果图
在这里插入图片描述

5、工具库

(1)点聚合

①添加

当点的数量过多时,会造成浏览器卡顿,使用点聚合可以有效解决该问题。点聚合的使用也很简单,首先在index页面引入点聚合工具开源库的文件

<script type="text/javascript" src="http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>

使用

// 模拟一些点
const markers = [
	new BMap.Marker(new BMap.Point(116.387112, 39.920977)),
	new BMap.Marker(new BMap.Point(116.385243, 39.913063)),
	new BMap.Marker(new BMap.Point(116.394226, 39.917988)),
	new BMap.Marker(new BMap.Point(116.401772, 39.921364)),
	new BMap.Marker(new BMap.Point(116.41248, 39.927893)),
]
// markerClusterer是点聚合工具的对象,全局使用。this.map是地图对象
this.markerClusterer = new BMapLib.MarkerClusterer(this.map, {
    
	markers: markers,
});

效果
在这里插入图片描述
放大后可展示具体点位
在这里插入图片描述

②清除
// 清除所有
this.markerClusterer.clearMarkers()
// 清除一个marker
this.markerClusterer.removeMarker(marker)
// 清除多个,这时候参数为marker数组
this.markerClusterer.removeMarkers(markers)

(2)热力图

①引入js
<script type="text/javascript" src="//api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
②使用
this.heatmapOverlay = new BMapLib.HeatmapOverlay({
    
  radius: 20,
});
this.map.addOverlay(this.heatmapOverlay);
// point数据格式,lat纬度,lng经度,count热力值,就算为1好像页面上也会自动显示热力层级
// 假设从后端取回数据result
result.forEach(item => {
    
	point.push({
    
		lat: item.latitude,
		lng: item.longitude,
		count: 1,
	});
})
this.heatmapOverlay.setDataSet({
    
  // 热力值的最大值
  max: 5,
  // 热力图的详细数据
  data: point,
});
this.heatmapOverlay.show();
// 隐藏
this.heatmapOverlay.hiden();
// 删除
this.map.removeOverlay.(this.heatmapOverlay);

四、其他

(1)坐标转换

(1)使用百度地图自带的方法进行转换坐标转换文档

var x = 116.32715863448607
var y = 39.990912172420714
var convertor = new BMap.Convertor()
var pointArr = []
var ggPoint = new BMap.Point(x,y)
pointArr.push(ggPoint)
convertor.translate(pointArr, 3, 5, function(data) {
    
	if(data.status === 0) {
    
    	// 业务代码
    }
})

translate方法的第一个参数为Point类型的数组,第二个参数是源坐标类型,第三个参数是目标坐标类型,第四个是回调函数(坐标类型在文档中有详细说明)。
在这里插入图片描述

需要注意的是方法在批量转换坐标时是有上限的,这里推荐使用coordtransform模块,用法很简单。
先用npm安装npm install coordtransform,创建一个js工具类,引入coordtransform就可以使用了。

import coordtransform from 'coordtransform'

// 火星坐标转百度经纬度坐标
export function gcj02tobd09(x, y) {
    
  return coordtransform.gcj02tobd09(x, y)
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42155347/article/details/108425134

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue