谷歌地图:记住打开信息窗口的标记ID

时间:2010-02-04 17:32:34

标签: javascript google-maps

我有一张显示多个标记的Google地图。当用户移动地图时,使用以下代码重新绘制新边界的标记:

GEvent.addListener(map, "moveend", function() { 
    var newBounds = map.getBounds();
    for(var i = 0; i < places_json.places.length ; i++) {
       // if marker is within the new bounds then do...
       var latlng = new GLatLng(places_json.places[i].lat, places_json.places[i].lon);
       var html = "blah";
       var marker = createMarker(latlng, html);
       map.addOverlay(marker);
    }
}); 

我的问题很简单。如果用户单击标记以显示打开的信息窗口,则当前重新绘制边界时,将关闭信息窗口,因为标记将从头开始再次添加。我该如何防止这种情况?

这并不理想,因为当用户点击标记并且地图移动以显示信息窗口时,通常会重新绘制边界 - 因此信息窗口会出现,然后再次消失:)

我想有几种可能的方法:

  • 记住哪个标记具有打开的信息窗口,并在重新绘制标记时再次打开
  • 实际上不会使用打开的信息窗口重新添加标记,只需将其留在那里

但是,两者都要求带有打开窗口的标记具有某种ID号,我不知道Google Maps API实际上就是这种情况。任何人吗?

---------- UPDATE ------------------

我已经尝试过将标记加载到初始数组中,如建议的那样。加载正常,但拖动地图后页面崩溃。

<script type="text/javascript" src="{{ MEDIA_URL }}js/markerclusterer.js"></script>
<script type='text/javascript'>

function createMarker(point,html, hideMarker) {
  //alert('createMarker');
  var icon = new GIcon(G_DEFAULT_ICON);
  icon.image = "http://chart.apis.google.com/chart?cht=mm&chs=24x32&chco=FFFFFF,008CFF,000000&ext=.png";
  var tmpMarker = new GMarker(point, {icon: icon, hide: hideMarker});
  GEvent.addListener(tmpMarker, "click", function() {
    tmpMarker.openInfoWindowHtml(html);
  });
  return tmpMarker;
}

var map = new GMap2(document.getElementById("map_canvas"));
map.addControl(new GSmallMapControl());
var mapLatLng = new GLatLng({{ place.lat }}, {{ place.lon }});
map.setCenter(mapLatLng, 12);
map.addOverlay(new GMarker(mapLatLng));

// load initial markers from json array

var markers = [];
var initialBounds = map.getBounds();

for(var i = 0; i < places_json.places.length ; i++) {
      var latlng = new GLatLng(places_json.places[i].lat, places_json.places[i].lon);
      var html = "<strong><a href='/place/" + places_json.places[i].placesidx + "/" + places_json.places[i].area + "'>" + places_json.places[i].area + "</a></strong><br/>" + places_json.places[i].county;
      var hideMarker = true;
      if((initialBounds.getSouthWest().lat() < places_json.places[i].lat) && (places_json.places[i].lat < initialBounds.getNorthEast().lat()) && (initialBounds.getSouthWest().lng() < places_json.places[i].lon) && (places_json.places[i].lon < initialBounds.getNorthEast().lng()) && (places_json.places[i].placesidx != {{ place.placesidx  }})) {
          hideMarker = false;
      }
      var marker = createMarker(latlng, html, hideMarker);
      markers.push(marker);
}

var markerCluster = new MarkerClusterer(map, markers, {maxZoom: 11});

</script>

2 个答案:

答案 0 :(得分:2)

您可能应该在初始阶段使用createMarker()方法创建所有标记,并将返回的GMarker对象存储在数组中。确保在创建标记时在GMarkerOptions中设置hide: true属性,以便默认情况下将其创建为隐藏。

然后,您可以遍历新的places_json.places数组,而不是遍历GMarker。您可以使用GMarker.getLatLng()方法获取每个标记的坐标,以检查每个标记是否位于边界内。

最后,只需针对位于边界内的标记调用GMarker.show(),或者GMarker.hide()隐藏它们。

您可以消除每次地图移动中标记的昂贵破坏/创建。作为积极的一面,这也将解决您的GInfoWindow问题。

答案 1 :(得分:1)

如果您使用那么多标记,请确保使用GMarkerManager。它专为许多标记设计,一次只能看到少数标记。

http://mapki.com/wiki/Marker_Optimization_Tips

相关问题