Видимые маркеры MarkerManager

Я использую MarkerManager v3 и карты Google для отображения большого количества маркеров. Теперь все работает идеально, но я не могу найти способ показать только те маркеры, которые показывает менеджер маркеров. Мне известен метод getMarkerCount, который возвращает количество видимых маркеров в масштабе, но мне нужна информация от маркеров, таких как идентификатор, заголовок и т. д., для обновления таблицы, содержащей точки на dragend-событии.

Я старался

    google.maps.event.addListener(map, "dragend", function() {
        for(var i = gMarkers.length, bounds = map.getBounds(); i--;) {
            if( bounds.contains(gMarkers[i].getPosition()) ){
                console.log(gMarkers[i].getVisible());
            }
        }
    });

Этот метод возвращает все маркеры, даже если они не видны при текущем уровне масштабирования? Любая идея о том, как я могу достичь этого?

Чтобы быть более точным, см. мой тестовый сайт http://frankmyhre.dk/mapping/test.php, где таблица должна отражать маркеры, видимые (красный значок) на карте в пределах границ


person frankmyhre    schedule 02.07.2015    source источник
comment
Каждый маркер, который вы видите в таблице, вы хотите видеть маркером на карте. Это твой вопрос?   -  person Emmanuel Delay    schedule 02.07.2015
comment
Наоборот, маркеры, которые я вижу на карте (красные значки), я хочу видеть в своей таблице   -  person frankmyhre    schedule 02.07.2015
comment
Я не понимаю MarkerManager; Я только что смотрел на это. У него должен быть простой mgr.getVisibleMarkers() или что-то в этом роде. Мне кажется, было бы проще обойти MarkerManager и самому разобраться, что он показывает, а что нет.   -  person Emmanuel Delay    schedule 02.07.2015


Ответы (1)


Я считаю свое решение «быстрым и грязным». Я думаю, что это должно быть выполнимо с помощью плагина.

Во всяком случае, результат, который вам нужен, я думаю. Код, который я показываю, находится внутри initialize; 1 дополнительная функция и замена zoom_changed и dragend

google.maps.event.addListener(map, "zoom_changed",function() {
  var zoom = map.getZoom();
  $('#zoom').text(zoom);
  $('#marker_count').text(mgr.getMarkerCount(zoom));
  timer = setTimeout(visibleMarkersInTable, 400);
});
google.maps.event.addListener(map, "dragend", function() {
  timer = setTimeout(visibleMarkersInTable, 400);
});
var timer; 
function visibleMarkersInTable () {
  clearTimeout(timer);  // make sure you don't check, while the user is panning or zooming.; so this blocks a lot of temporary checks
  $('table tbody').empty();
  for (i in gMarkers) {
    var markerVisible = gMarkers[i].map ? true : false;
    if(markerVisible) {
      // mind you, the marker might be on the map, but just outside of the boundaries.
      // so let's check those
      if (map.getBounds().contains(gMarkers[i].getPosition()) ) {
        $('table tbody').append('<tr id="' + gMarkers[i].id + '"><td>' + gMarkers[i].title + '</td><td>' + gMarkers[i].getPosition().lat() + '</td><td>' + gMarkers[i].getPosition().lng() + '</td></tr>');
      }
    }
  }
}

Не стесняйтесь вмешиваться в эту задержку в 400 мс в setTimeout; установите его на то, что вам подходит. Особенно когда у тебя сотни маркеров. Понятия не имею, насколько медленным это будет.

person Emmanuel Delay    schedule 02.07.2015