前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >地图开发添加标注物

地图开发添加标注物

作者头像
xiangzhihong
发布2018-01-29 15:06:07
9840
发布2018-01-29 15:06:07
举报
文章被收录于专栏:向治洪向治洪向治洪

最近几年在搞地图方面的开发,主要是循环为坐标添加标注并为标注添加弹出信息窗口,起初我的代码如下:

var map = new BMap.Map("Mapcontainer");  
 var JsonObj = eval(JsonStr);  
 if (JsonObj != null) {  
 for (var i = 0; i < JsonObj.length; i++) {  
 var point = new BMap.Point(JsonObj[i].Visit_GPS_Longitude, JsonObj[i].Visit_GPS_Latitude);    // 创建点坐标 
                         map.centerAndZoom(point, 13);  
 var marker = new BMap.Marker(point);  
 var opts = {  
                             width: 250,     // 信息窗口宽度 
                             height: 100,     // 信息窗口高度 
                             title: '<span style="font-size:15px;color:#0A8021">' + JsonObj[i].CustomerName + '</span>' // 信息窗口标题 
                         }  
 //marker.setAnimation(BMAP_ANIMATION_BOUNCE); 
 var content = "进店时间 " + JsonObj[i].VisitBeginTime + "<br/>离店时间 " + JsonObj[i].VisitEndTime;  
 var info_Window = new BMap.InfoWindow(content, opts);  // 创建信息窗口对象 
                         marker.addEventListener("click", function () {  
 this.openInfoWindow(info_Window);  
                         });  
                         map.addOverlay(marker);   
                  }   
                  map.addControl(new BMap.NavigationControl());   

这样子确实能添加标注,也弹出信息窗口,但是问题来了!弹出 的信息窗口没有变化,也就是说本来不同的标注上弹出 的信息窗口应该是不一样的,可以不知道怎么回事

弹出的信息窗口一直是最后的那个信息窗口!折腾了好久,最后终于解决了,具体的代码如下:

var map = new BMap.Map("Mapcontainer");  
 var JsonObj = eval(JsonStr);  
 if (JsonObj != null) {  
 for (var i = 0; i < JsonObj.length; i++) {  
                     (function (x) {  
 var point = new BMap.Point(JsonObj[x].Visit_GPS_Longitude, JsonObj[x].Visit_GPS_Latitude);    // 创建点坐标 
                         map.centerAndZoom(point, 13);  
 var marker = new BMap.Marker(point);  
 var opts = {  
                             width: 250,     // 信息窗口宽度 
                             height: 100,     // 信息窗口高度 
                             title: '<span style="font-size:15px;color:#0A8021">' + JsonObj[x].CustomerName + '</span>' // 信息窗口标题 
                         }  
 //marker.setAnimation(BMAP_ANIMATION_BOUNCE); 
 var content = "进店时间 " + JsonObj[x].VisitBeginTime + "<br/>离店时间 " + JsonObj[x].VisitEndTime;  
 var info_Window = new BMap.InfoWindow(content, opts);  // 创建信息窗口对象 
                         marker.addEventListener("click", function () {  
 this.openInfoWindow(info_Window);  
                         });  
                         map.addOverlay(marker);  
                     })(i);  
                  }   
                  map.addControl(new BMap.NavigationControl());    

同样是一个循环,但是在循环中使用了一个匿名函数,从而造成一个闭包将 i 的值锁定在里面,这样外部的值已经变化,

但是传到闭包里面的值已经被保留,也就可以顺利拿到应该取到的address[i]的内容了。

这样虽然解决了问题,但是每添加一个点都会创建一个匿名函数,内存泄漏可能会是潜在隐患。

接下去, 我们就可以自由的在地图上标注点并显示对应的信息了!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档