不定期记录开发工程遇到的各种坑,小记采用问(Q)/答(A)的形式,以此提醒后来人。
在此感谢很多前赴后继踩坑填坑的人,感谢你们的努力为我们提供了解决思路和方法!
0.Q:百度官方API示例靠谱不?
A:千万不要完全相信百度地图API示例代码!!!重要!!!你根本不知道那些代码存在多少深坑!!!
1.:百度地图API之标注点
function ShowPosition(x, y, content)
{
var point = new BMap.Point(x, y);
var marker = new BMap.Marker(point); // 创建标注
var label = new BMap.Label(content, {
offset: new BMap.Size(5, 4)
});
label.setStyle({
background: 'none', color: '#fff', border: 'none'//只要对label样式进行设置就可达到在标注图标上显示数字的效果
});
marker.setLabel(label);//将标签和标注绑定
map.addOverlay(marker); // 将标注添加到地图中
}
Q:标注点后滚轮失灵。
A:滚轮失灵的原因在于WebBrowser对象失去焦点,在添加完所有点后运行如下代码:
webBrowser.Document.Focus();即可。
补充:经一段时间测试后发现,每当涉及按住鼠标拖动地图之后,鼠标滚轮就会失灵,然后想利用委托事件真正彻底解决这个问题
代码如下:
webBrowser.Document.MouseDown += new HtmlElementEventHandler(mouseclik);
private void mouseclik(object sender, HtmlElementEventArgs e)
{
webBrowser.Document.Focus();
}
2.百度地图API之删除点——此处官方示例大坑
function DeletePoint(content)//根据标签删除点
{
var allOverlay = map.getOverlays();
for (var i = 0; i < allOverlay.length - 1; i++) {
if (allOverlay[i].toString() == "[object Marker]") {
if (allOverlay[i].getLabel()!=null && allOverlay[i].getLabel().content == content) {
map.removeOverlay(allOverlay[i]);
//console.log(allOverlay[i])
return false;
}
}
}
}
Q1:label属性为null或未定义。
A1:在生成地图最初的时候创建了一个marker标注点,该点是没有添加label标签的,所以会出现此错误
Q2:对象不存在getLabel()方法
A2:map.getOverlays();方法获取的东西不光只是标注点,还包括其他的东西,因此在调用getLabel方法时先调用
if (allOverlay[i].toString() == "[object Marker]"),判断是marker后再进行后续操作
Q3:重复调用该方法删除标签相同的一个点时报错。
A3:注意map.removeOverlay(allOverlay[i]);该方法并不是将 allOverlay[i]对象完全移除,下次通过map.getOverlays();方法调用时还是能调用到这个对象的,不同的是,此时的这个对象没有label了,所以重复删除会出现getLabel()为null错误。 if (allOverlay[i].getLabel()!=null && allOverlay[i].getLabel().content == content)
采用这行代码,获取label前先判断label是否存在。
3. 通过代码调用Marker的click事件
下面拿我写的点击标注点显示信息窗口的代码举例
var markers=[];//这是我定义的用来存储marker点的对象数组,想要调用成功marker 必须是之前添加到地图上时的那个对象
//为当前的标点绑定信息窗口
function AddInfoWindow(w, h, t, m) {
var opts = {
width: w, // 信息窗口宽度
height: h, // 信息窗口高度
title: t, // 信息窗口标题
}
var infoWindow = new BMap.InfoWindow(m, opts);// 创建信息窗口对象
infoWindow.addEventListener("");
marker.addEventListener("click", function (e) {
map.openInfoWindow(infoWindow, e.point); //开启信息窗口
});
}
调用方法
首先引用jsAPI文档
<script type="text/javascript" src="http://api.map.baidu.com/library/EventWrapper/1.2/src/EventWrapper.js"></script>
// 代码调用显示信息窗
function ShowInfoWindow(index) {
markers[index].dispatchEvent("click",marker[index]);//此处的参数marker[index]对应click事件里定义的参数e
}