C#百度地图API开发小记(1)

不定期记录开发工程遇到的各种坑,小记采用问(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文档

 

    // 代码调用显示信息窗
    function ShowInfoWindow(index) {
      markers[index].dispatchEvent("click",marker[index]);//此处的参数marker[index]对应click事件里定义的参数e
    }

你可能感兴趣的:(C#百度地图API开发小记(1))