简介
为了更加熟练的使用百度地图
api
,最简单的方式就是实现一个个
DEMO
。当然
DEMO
也是一个个慢慢实现的,在这里我们先讲解一个简单的扇区绘制功能。
引入地图
-
通过
script
标签加载地图
api
,然后通过
BMapGL.Map('bmap')
实例化地图。一个简单的地图就实现了。
<script src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=你的ak"></script>
<div id="bmap" class="bmap"></div>
<script>
// 创建Map实例
var map = new BMapGL.Map('bmap')
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(new BMapGL.Point(121.480509, 31.23592), 10)
// 启用 鼠标滚轮事件
map.enableScrollWheelZoom()
</script>
辅助函数
-
在地图中绘制扇形是通过,
Polygon()
函数来绘制的。根据扇形弧度的总长度,来计算扇形边界点个数,然后根据圆点坐标和半径计算每个边界点的坐标,把计算好的点通过
Polygon()
函数在地图上绘制出来。 - 实现获取扇形点坐标的函数。
/**
* @param point 原点
* @param radius 半径 米
* @param SRadian 开始弧度
* @param ERadian 结束弧度
* */
function sector(point, radius, SRadian, ERadian) {
//
var points = [] // 创建构成多边形的点数组
points.push(point) // 起点
// 根据弧度 计算扇形点 分布
var step = (ERadian - SRadian) / 15 || 15
for (var i = SRadian; i < ERadian + 0.001; i += step) {
// 循环 获取 圆弧上点的坐标
points.push(EOffsetBearing(point, radius, i))
}
// 连接起点
points.push(point)
return points
}
- 使用数学的方法计算需要画扇形的圆弧上的点坐标。
/**
* @param point 原点
* @param dist 半径
* @param bearing 计数
* */
function EOffsetBearing(point, dist, bearing) {
// 计算1经度与原点的距离
var lngConv = map.getDistance(point, new BMapGL.Point(point.lng + 0.1, point.lat)) * 10
// 计算1纬度与原点的距离
var latConv = map.getDistance(point, new BMapGL.Point(point.lng, point.lat + 0.1)) * 10
// 正弦计算待获取的点的纬度与原点纬度差
var lat = (dist * Math.sin((bearing * Math.PI) / 180)) / latConv
// 余弦计算待获取的点的经度与原点经度差
var lng = (dist * Math.cos((bearing * Math.PI) / 180)) / lngConv
return new BMapGL.Point(point.lng + lng, point.lat + lat)
}
根据规定的数据格式,绘制扇形。
- 数据格式是自己规定好的,方便后面获取数据。
-
这里需要注意的是,
半径是以米为单位的
。
var mapDate = {
上海: [121.480509, 31.23592, 0, 90, '上海'],
上海2: [121.480509, 31.23592, 100, 130, '上海2']
}
function makesectors(mapDate) {
for (var key in mapDate) {
var temPoi = mapDate[key]
// 圆点
var point = new BMapGL.Point(temPoi[0], temPoi[1])
// 弧度
SRadian = temPoi[2]
ERadian = temPoi[3]
// 30000 半径 单位米
var oval = new BMapGL.Polygon(sector(point, 30000, SRadian, ERadian), {
strokeColor: '#ADFF2F', // 边线颜色
strokeWeight: 1, // 边线的宽度,以像素为单位
strokeOpacity: 0.5, // 边线透明度,取值范围0 - 1
fillColor: '#ADFF2F', // 填充颜色
fillOpacity: 0.5
})
map.addOverlay(oval)
// // 文本内容
// var text = temPoi[4]
// onClick(text, oval) // 调鼠标用点击事件
// onMouseover(oval)
// onMouseout(oval)
}
}
makesectors(mapDate)
-
一个简单的扇区绘制就出现了
添加交互
-
在开发中不可能只是单纯的画图,也需要一些事件交互。很幸运的是在
地图api
实现的一套和原生
DOM
基本一样的事件模型,可以对覆盖物直接使用。
点击事件
-
通过覆盖物内部函数
addEventListener
,来设置监听事件。 -
通过给覆盖物设置
click
事件监听,实现点击回调。
// 点击事件
function onClick(text, marker) {
marker.addEventListener('click', function (e) {
openWin(text, marker.getBounds().getCenter())
})
}
// 定义信息窗口样式
var opts = {
width: 250, // 信息窗口宽度
height: 80, // 信息窗口高度
title: '信息窗口' // 信息窗口标题
}
var infoWindow = null
// 打开信息窗口
function openWin(text, centerPoint) {
// 创建信息窗口对象
infoWindow = new BMapGL.InfoWindow(text, opts)
// 关闭 点击地图时关闭信息窗口
infoWindow.disableCloseOnClick()
// 开启信息窗口
map.openInfoWindow(infoWindow, centerPoint)
}
-
这里使用了,信息窗口覆盖物
InfoWindow
,根据文档编写默认参数设置窗口样式和内容。通过地图实例的
openInfoWindow()
把信息窗口加入地图中。
InfoWindow
也提供了一些函数用于控制它自己。
鼠标移入
function onMouseover(oval) {
oval.addEventListener('mouseover', function () {
oval.setStrokeWeight(2) //边界变宽
oval.setStrokeOpacity(1) //边界颜色变深
oval.setFillOpacity(1) //填充颜色变深
})
}
- 在回调函数中,通过覆盖物提供的函数,修改覆盖物样式。实现鼠标移入的交互效果。
鼠标移开
function onMouseout(oval) {
oval.addEventListener('mouseout', function () {
oval.setStrokeWeight(1) //边界恢复
oval.setStrokeOpacity(0.5) //边界透明度变化
oval.setFillOpacity(0.5) //填充颜色变化
})
}
-
在回调函数中,通过同样的函数恢复参数。实现鼠标移开的交互效果。要注意恢复参数不要有错误,不然会影响用户体验。
-
最后效果
版权声明:本文为yy729851376原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。