Google Maps: remember id of marker with open info window

Posted by AP257 on Stack Overflow See other posts from Stack Overflow or by AP257
Published on 2010-02-04T17:32:34Z Indexed on 2010/04/21 20:43 UTC
Read the original article Hit count: 428

Filed under:

I have a Google map that is showing a number of markers. When the user moves the map, the markers are redrawn for the new boundaries, using the code below:

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);
    }
}); 

My question is simple. If the user has clicked on a marker so that it is showing an open info window, currently when the boundaries are redrawn the info window is closed, because the marker is added again from scratch. How can I prevent this?

It is not ideal, because often the boundaries are redrawn when the user clicks on a marker and the map moves to display the info window - so the info window appears and then disappears again :)

I guess there are a couple of possible ways:

  • remember which marker has an open info window, and open it again when the markers are redrawn
  • don't actually re-add the marker with an open info window, just leave it there

However, both require the marker with an open window to have some kind of ID number, and I don't know that this is actually the case in the Google Maps API. Anyone?

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

I've tried doing it by loading the markers into an initial array, as suggested. This loads OK, but the page crashes after the map is dragged.

<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>

© Stack Overflow or respective owner

Related posts about google-maps