В любом случае, чтобы ограничить обновление карты Google при панорамировании

#javascript #google-maps

#javascript #google-карты

Вопрос:

У меня установлены карты Google с указателями. Я настроил его так, что всякий раз, когда изменяется масштаб или видовой экран, он соответственно загружает новый набор указателей:

 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. Проблема в том, что мне нужно настроить его так, чтобы, если, скажем, указатель находился на дальних краях порта просмотра, он должен перемещаться к центру или в положение, в котором при открытии infowindow его можно было просматривать во всем порту.

Проблема возникает в том, что иногда информационное окно при его загрузке может быть слишком большим для порта просмотра и вызывает панорамирование карты, что, в свою очередь, запускает функцию обновления, повторно заполняющую указатели.

Каков наилучший способ справиться с этим.

Ответ №1:

Итак, что вы могли бы сделать, это иметь что-то вроде логического флага, чтобы указать, вызывать tm.update() или нет. В вашем обработчике событий для щелчков по маркерам (для открытия информационных окон) установите для него значение false. Затем в вашем обработчике событий bounds_changed вызывайте tm.update только в том случае, если это логическое значение равно true. Затем, возможно, в конце bounds_changed сбросьте его обратно в true.

Ответ №2:

Еще одно предположение — не удалять и не перезаписывать маркеры, которые уже видны (попадают в map.getBounds()). Когда вы получаете ответ с новыми маркерами для добавления — проверьте, если его еще нет.

ОБНОВЛЕНИЕ: после bounds_changed у вас появляются новые границы. Затем вы запрашиваете свой сервер и получаете координаты маркеров и другие необходимые вам связанные данные. При добавлении маркеров на карту сохраняйте ссылки на них, скажем, в хэше. Если у вас есть какой-то уникальный идентификатор — это идеально. В другом случае придумайте какой-нибудь идентификатор для маркера. Затем нам нужно добавить новые маркеры и, возможно, удалить некоторые из них, которые скрыты. Вот так:

 // 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];
  }
}
  

Комментарии:

1. Как я могу это сделать, тогда мне пришлось бы выполнять проверку каждого маркера, не так ли?