Google Map автоматически обновляет местоположение, но не устанавливает масштаб пользователя

Я автоматически обновляю карты Google каждые x секунд в jquery/javascript.

При изменении местоположения карта изменяет уровень масштабирования (ожидаемый).

Но я хочу добиться этого:

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

Код выглядит примерно так:

  function calcRoute(user) {
     if(user)
     {
        start = document.getElementById("start_location").value;
     }
     end = document.getElementById("end_location").value;
     var request = {
        origin:start, 
        destination:end,
        travelMode: google.maps.DirectionsTravelMode.WALKING
    };

    directionsService.route(request, function(response, status) {
      if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(response);
        $('#txt_dur').text(response.routes[0].legs[0].duration.text);
        $('#txt_dist').text(response.routes[0].legs[0].distance.text);      

      }
    });
    //if(userZoom==true)
    //    map.setZoom(current_zoom);

  }

      function autoUpdate() {
         navigator.geolocation.getCurrentPosition(function(position) {
         var newPoint = new google.maps.LatLng(position.coords.latitude,
                                          position.coords.longitude);

         start = newPoint.toString();
         calcRoute(false);
      });

    setTimeout(autoUpdate, 5000);
   }

    autoUpdate();

Я предпочитаю стандартные события карты Google, такие как zoom_changed, вместо создания пользовательских событий для пользовательского масштабирования.

Любые указания по этому вопросу?


person hitesh israni    schedule 04.07.2012    source источник


Ответы (1)


Попробуйте так:

if (status == google.maps.DirectionsStatus.OK) {
    var tmpZoom = map.getZoom();   //added line
    directionsDisplay.setDirections(response);
    map.setZoom( tmpZoom );        //added line

    $('#txt_dur').text(response.routes[0].legs[0].duration.text);
    $('#txt_dist').text(response.routes[0].legs[0].distance.text);
}

где map — ваш объект google.maps.Map.

PS: чтобы предотвратить изменение center и zoom методом setDirections, вы можете указать preserveViewport=true из google.maps.DirectionsRendererOptions.

person Engineer    schedule 04.07.2012
comment
saveViewport=true не поможет. потому что я хочу изменить центр карты - person hitesh israni; 05.07.2012
comment
@mashit Да, я сомневался в этом, поэтому я поместил это предложение в раздел PS. - person Engineer; 05.07.2012
comment
Да. Есть ли способ определить, был ли масштаб изменен пользователем или он был изменен из-за автоматического обновления карты? - person hitesh israni; 05.07.2012
comment
@mashit Нет. Вам нужно обрабатывать все такие взаимодействия, совершаемые пользователем. - person Engineer; 05.07.2012
comment
для автоматического обновления/обновления карты я меняю начальное местоположение на текущее каждые x секунд. есть ли лучший подход для этого? - person hitesh israni; 05.07.2012
comment
и как обрабатывать такие взаимодействия. Любые направления, которые вы можете предоставить? - person hitesh israni; 05.07.2012
comment
@mashit Насчет взаимодействий, это будет не так просто. Вам нужно прослушать все события mousedown и mousewheel в div карты. Затем проверьте положение мыши по осям x и y относительно панели управления масштабированием. Также zoom_change,dblclick события на google.maps.Map объекте, чтобы выполнить некоторые проверки. Я думаю, это сложная задача. - person Engineer; 05.07.2012
comment
да. Я так и думал. нельзя ли этого добиться с помощью события zoom_changed карты как такового? - person hitesh israni; 05.07.2012
comment
Я не думаю, что это охватит все случаи. Может какие-то трюки от setTimeout,setInterval что-то и могут, но это было бы слишком далеко от полноты. - person Engineer; 05.07.2012
comment
@mashit Вы можете задать такой вопрос в StackOverlow. Может быть, могут быть и другие мысли, чем мои. - person Engineer; 05.07.2012