2011-10-17 37 views
0

我有一个谷歌地图设置指针。我已经设定,所以每当变焦改变或视做它加载相应的一组新指针:无论如何限制在平移时更新谷歌地图

google.maps.event.addListener(xmap, 'zoom_changed', function(event){ 
    tm.update(); 
    }); 

    google.maps.event.addListener(xmap, 'bounds_changed', function(event){ 
    tm.update(); 
    }); 

    google.maps.event.addListenerOnce(xmap, 'tilesloaded', function(){ 
    tm.update(); 
    }); 

我还设置它,这样点击任何指针将打开一个信息框,将填充来自ajax查询的数据。问题是,我需要设置它这样,如果让我们说一个指针的视口的远边缘应平移到中心或在当信息窗口打开它可以在整个端口上观看的位置。

产生的问题是是,有时信息窗口时,它可以负载过大的视口,并导致地图平移而这又触发更新功能再次重新填充的指针。

是最好的方法来处理这个问题。

回答

1

所以你可能做的是有一个像布尔标志来指示是否调用tm.update()。在标记点击的事件处理程序中(打开infowindows),将其设置为false。然后在您的bounds_changed事件处理程序中,只有在该布尔值为true时才调用tm.update。然后可能在bounds_changed的末尾,将其重置为true。

1

另一种猜测 - 不删除和覆盖的标记,已经可见(落入map.getBounds())。当您使用新标记添加验证时,如果它尚未存在,则收到响应。

UPDATE: 的bounds_changed之后,你有新的发展。然后你查询你的服务器并获得你需要的标记坐标和其他相关数据。当您将标记添加到地图上时,请保存对它们的引用,例如,在散列中。如果你有一些独特的ID - 这是完美的。在其他情况下,为标记创造某种标识符。然后,我们需要增加新的标记,并可能删除其中的一些,这是隐藏的。就像这样:

// somewhere initially 
var markersOnMap = {} 

// when got data and adding new markers 
markersData = array of markers you've received from request 

for (var i=0; i < markersData.length; i++) 
{ 
    var datum = markersData[i]; 
    if (typeof(markersOnMap[datum.id]) == 'undefined') 
    { 
    // add marker to map 
    var marker = new google.maps.Marker({ 
     position: ..., 
     etc. 
    }); 
    marker.setMap(mymap); 
    markersOnMap[datum.id] = marker; 
    } 
} 

// you may clean up hidden markers or 
// leave it for future or what you want. 
// suppose we delete out of view markers 
for (var id in markersOnMap) 
{ 
    if (!mymap.getBounds().contains(markersOnMap[id].getPosition())) 
    { 
    // get rid of it 
    markersOnMap[id].setMap(null); 
    delete markersOnMap[id]; 
    } 
} 
+0

我如何能做到这一点,我将被要求运行对每个标志物的检查,现在就不行吗? – Ali

+0

我已经更新了答案 – dmitry