Карты Google: запомнить идентификатор маркера с открытым информационным окном - PullRequest
4 голосов
/ 04 февраля 2010

У меня есть карта 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);
    }
}); 

Мой вопрос прост. Если пользователь нажал на маркер, чтобы он показывал открытое информационное окно, в настоящее время, когда границы перерисовываются, информационное окно закрывается, потому что маркер добавляется снова с нуля. Как я могу предотвратить это?

Это не идеально, потому что часто границы перерисовываются, когда пользователь нажимает на маркер и карта перемещается, чтобы отобразить информационное окно - поэтому информационное окно появляется и затем снова исчезает:)

Я думаю, есть несколько возможных способов:

  • запомните, у какого маркера есть открытое информационное окно, и откройте его снова, когда маркеры будут перерисованы
  • на самом деле не добавляйте маркер с открытым информационным окном, просто оставьте его там

Однако оба требуют, чтобы маркер с открытым окном имел какой-то идентификационный номер, и я не знаю, что это на самом деле так в API Карт Google. Кто-нибудь? * * 1016

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

2 голосов
/ 04 февраля 2010

Вероятно, вам следует создать все свои маркеры на начальном этапе с помощью метода createMarker() и сохранить возвращенные объекты GMarker в массиве. Обязательно установите свойство hide: true в GMarkerOptions при создании маркеров, чтобы они по умолчанию создавались как скрытые.

Тогда вместо итерации по places_json.places вы можете итерировать по вашему новому массиву GMarker. Вы сможете получить координаты каждого маркера с помощью метода GMarker.getLatLng(), с помощью которого можно проверить, находится ли каждый маркер в пределах границ.

Наконец, просто вызовите GMarker.show() для маркеров, которые лежат в границах, или GMarker.hide(), чтобы скрыть их.

Вы бы исключали дорогостоящее уничтожение / создание маркеров на каждом движении карты. Как положительный побочный эффект, это также решит вашу проблему GInfoWindow.

1 голос
/ 22 апреля 2010

Если вы используете столько маркеров, убедитесь, что вы используете GMarkerManager. Он предназначен для множества маркеров, и только несколько видны одновременно.

http://mapki.com/wiki/Marker_Optimization_Tips

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...