参照百度地图官方例子,实现更改默认图标,创建多个图标、标签、信息窗口,添加鼠标悬停事件、图标跳动效果,全部代码如下(重点标记部分见最后的注解):
HTML:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
body, html {
width: 100%;
height: 100%;
margin: 0;
font-family: "微软雅黑";
}
#allmap {
width: 100%;
height: 780px;
}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<title>给多个点添加信息窗口</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
JavaScript:
<script type="text/javascript">
// 百度地图API功能
map = new BMap.Map("allmap");
map.centerAndZoom(new BMap.Point(116.417854, 39.921988), 15); //设置地图显示中心点【1】
/*存储信息集合【2】*/
var data_info = [
[116.417854, 39.921988, "地址:北京市东城区王府井大街88号乐天银泰百货八层"],
[116.406605, 39.921585, "地址:北京市东城区东华门大街"],
[116.412222, 39.912345, "地址:北京市东城区正义路甲5号"]
];
/*创建信息窗口*/
var opts = {
width: 250, // 信息窗口宽度
height: 80, // 信息窗口高度
title: "信息窗口", // 信息窗口标题
enableMessage: true //设置允许信息窗发送短息
};
/*遍历信息集合*/
for (var i = 0; i < data_info.length; i++) {
//创建坐标点
var point = new BMap.Point(data_info[i][0], data_info[i][1]);
//更改图标
var myIcon = new BMap.Icon("https://i-blog.csdnimg.cn/blog_migrate/8c2e23ea14d9c887ecd443493ee12cfe.png", new BMap.Size(23, 25), {
offset: new BMap.Size(10, 25), // 指定定位位置
imageOffset: new BMap.Size(0, 0 - 12 * 25) //设置图片偏移(这里选中的第13个,从上往下)【3】
});
//创建标注
var marker = new BMap.Marker(point, { icon: myIcon });
//创建标签
var label = new BMap.Label("我是标签" + i, { offset: new BMap.Size(20, -10) });
label.setStyle({
'max-width': 'none' // bootstrap给label默认了一个max-width:100%;这句会影响地图label的样式【4】
});
map.addOverlay(marker); // 将标注添加到地图中
marker.setLabel(label); // 把label设置到maker上
//设置信息窗口内容
var content = data_info[i][2];
map.addOverlay(marker); // 将标注添加到地图中
addEventHandler(content, marker); // 添加事件
marker.setAnimation(BMAP_ANIMATION_BOUNCE); // 跳动的动画
}
/*添加marker的事件*/
function addEventHandler(content, marker) {
//鼠标悬停事件
marker.addEventListener("mouseover", function (e) {
openInfo(content, e)
});
}
/*打开信息窗口*/
function openInfo(content, e) {
var p = e.target;
var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat);
var infoWindow = new BMap.InfoWindow(content, opts); // 创建信息窗口对象
map.openInfoWindow(infoWindow, point); //开启信息窗口
}
</script>
最终效果图:
下面开始讲述容易出现的部分问题:
【1】地图未显示自定义坐标点?
开始时候,犯了一个特别low的错误,从后台数据库获取坐标点,运行后一直纳闷没显示图标,最后请教别人才知道是自己没有选好中心点,后台数据是广东的位置,中心点却定在北京,当然是找不到的。如果不知道坐标,可以用百度地图的拾取坐标系统http://api.map.baidu.com/lbsapi/getpoint/index.html拾取到想要的中心点坐标。
【2】后台数据集合问题
注意是二维数组,我用ajax从后台获取数据是这样写的:
//二维数组
var data_info = new Array();
for (var i = 0; i < data.Data.length; i++) {
data_info[i] = new Array();
data_info[i][0] = data.Data[i].LocaltionX; //经度
data_info[i][1] = data.Data[i].LocaltionY; //维度
data_info[i][2] = data.Data[i].content; //信息窗口内容
}
【3】更改icon图标问题
引用百度自己的标注,如果没深入学过前端CSS,可能还不太明白,这里可以参考CSS的background-position。
如果是想用自定样式的话可以自己制作并切图,具体操作可以百度下“百度地图icon自定义”等关键字。
【4】label标签问题
如果不写【4】,效果(“我是标签0”)如下:
百度后才知道是套用了bookstracp,默认label max-width:100%,所以要改为none
小白一只,记录下学习中遇到的困难,如若有什么错误或问题还望多多指教~