Во всяком случае ограничить обновление карты Google при панорамировании - PullRequest
0 голосов
/ 17 октября 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 17 октября 2011

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

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

// 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 голос
/ 17 октября 2011

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

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