閱讀228 返回首頁    go 京東網上商城


地圖開發添加標注物

最近幾年在搞地圖方麵的開發,主要是循環為坐標添加標注並為標注添加彈出信息窗口,起初我的代碼如下:

[javascript] view plaincopy
  1. var map = new BMap.Map("Mapcontainer");  
  2.               var JsonObj = eval(JsonStr);  
  3.               if (JsonObj != null) {  
  4.                   for (var i = 0; i < JsonObj.length; i++) {  
  5.                          var point = new BMap.Point(JsonObj[i].Visit_GPS_Longitude, JsonObj[i].Visit_GPS_Latitude);    // 創建點坐標  
  6.                          map.centerAndZoom(point, 13);  
  7.                          var marker = new BMap.Marker(point);  
  8.                          var opts = {  
  9.                              width: 250,     // 信息窗口寬度  
  10.                              height: 100,     // 信息窗口高度  
  11.                              title: '<span >' + JsonObj[i].CustomerName + '</span>'   // 信息窗口標題  
  12.                          }  
  13.                          //marker.setAnimation(BMAP_ANIMATION_BOUNCE);  
  14.                          var content = "進店時間 " + JsonObj[i].VisitBeginTime + "<br/>離店時間 " + JsonObj[i].VisitEndTime;  
  15.                          var info_Window = new BMap.InfoWindow(content, opts);  // 創建信息窗口對象  
  16.                          marker.addEventListener("click"function () {  
  17.                              this.openInfoWindow(info_Window);  
  18.                          });  
  19.                          map.addOverlay(marker);   
  20.                   }   
  21.                   map.addControl(new BMap.NavigationControl());   

這樣子確實能添加標注,也彈出信息窗口,但是問題來了!彈出 的信息窗口沒有變化,也就是說本來不同的標注上彈出 的信息窗口應該是不一樣的,可以不知道怎麼回事

彈出的信息窗口一直是最後的那個信息窗口!折騰了好久,最後終於解決了,具體的代碼如下:

[javascript] view plaincopy
  1. var map = new BMap.Map("Mapcontainer");  
  2.               var JsonObj = eval(JsonStr);  
  3.               if (JsonObj != null) {  
  4.                   for (var i = 0; i < JsonObj.length; i++) {  
  5.                      (function (x) {  
  6.                          var point = new BMap.Point(JsonObj[x].Visit_GPS_Longitude, JsonObj[x].Visit_GPS_Latitude);    // 創建點坐標  
  7.                          map.centerAndZoom(point, 13);  
  8.                          var marker = new BMap.Marker(point);  
  9.                          var opts = {  
  10.                              width: 250,     // 信息窗口寬度  
  11.                              height: 100,     // 信息窗口高度  
  12.                              title: '<span >' + JsonObj[x].CustomerName + '</span>'   // 信息窗口標題  
  13.                          }  
  14.                          //marker.setAnimation(BMAP_ANIMATION_BOUNCE);  
  15.                          var content = "進店時間 " + JsonObj[x].VisitBeginTime + "<br/>離店時間 " + JsonObj[x].VisitEndTime;  
  16.                          var info_Window = new BMap.InfoWindow(content, opts);  // 創建信息窗口對象  
  17.                          marker.addEventListener("click"function () {  
  18.                              this.openInfoWindow(info_Window);  
  19.                          });  
  20.                          map.addOverlay(marker);  
  21.                      })(i);  
  22.                   }   
  23.                   map.addControl(new BMap.NavigationControl());    

同樣是一個循環,但是在循環中使用了一個匿名函數,從而造成一個閉包將 i 的值鎖定在裏麵,這樣外部的值已經變化,

但是傳到閉包裏麵的值已經被保留,也就可以順利拿到應該取到的address[i]的內容了。
這樣雖然解決了問題,但是每添加一個點都會創建一個匿名函數,內存泄漏可能會是潛在隱患。
接下去, 我們就可以自由的在地圖上標注點並顯示對應的信息了!

最後更新:2017-04-04 07:33:13

  上一篇:go 未能正確加載“VSTS for Database Professionals Sql Server Data-tier Application”包。
  下一篇:go hi3531 SDK 編譯 kernel, 修改 參數