Google Maps v3 API — автоматическое плавное увеличение до маркера

Я использую Google Maps v3 внутри модального окна на своем веб-сайте и искал следующую функцию: если посетитель нажимает кнопку, появляется модальное окно. Внутри модала есть карты Google с маркером. Все идет нормально. Как только появится модальное окно, карты Google должны начать плавное автоматическое масштабирование, например, от уровня масштабирования 2 до уровня масштабирования 15.

Я не уверен, что все понимают, что я имею в виду, поэтому я нашел ссылку, где вы можете увидеть эффект анимации, которого я пытаюсь добиться. Обратите внимание, что на сайте есть Google Earth. Я хочу сделать этот эффект с помощью карт Google:

https://earthengine.google.com/timelapse/?location=саудовская аравия

Я нашел много сообщений здесь, в StackOverflow, а также в Google, но в большинстве тем описывается, как достичь моей цели с помощью Google Maps v2.

Вот что я пробовал. Модальное окно открывается, и маркер виден на карте Google Maps, но это все. Не виден эффект автоматического масштабирования, поэтому мое решение не работает.

<script>
    function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
            center: {lat: 48.2092762, lng: 16.3737249},
            zoom: 15
        });

        // example marker:
        var marker = new google.maps.Marker({
            map: map,
            targetZoom: 22,
            position: new google.maps.LatLng(48.2092762,16.3737249)
        });

        // example marker:
        var marker = new google.maps.Marker({
            map: map,
            position: new google.maps.LatLng(48.2092762,16.3737249)
        });

        // the smooth zoom function
        function animateMapZoomTo(map, targetZoom) {
            var currentZoom = arguments[2] || map.getZoom();
            if (currentZoom != targetZoom) {
                google.maps.event.addListenerOnce(map, 'zoom_changed', function (event) {
                    animateMapZoomTo(map, targetZoom, currentZoom + (targetZoom > currentZoom ? 1 : -1));
                });
                setTimeout(function(){ map.setZoom(currentZoom) }, 80);
            }
        }

    }
</script>


<script async defer src = "https://maps.googleapis.com/maps/api/js?key=MYAPIKEY&callback=initMap"></script>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
490
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вам не хватает третьего аргумента в методе animateMapZoomTo:

// the smooth zoom function
function animateMapZoomTo(map, targetZoom, commandedZoom) {
  var currentZoom = commandedZoom || map.getZoom();
  if (currentZoom != targetZoom) {
    google.maps.event.addListenerOnce(map, 'zoom_changed', function(event) {
      animateMapZoomTo(map, targetZoom, currentZoom + (targetZoom > currentZoom ? 1 : -1));
    });
    setTimeout(function() {
      map.setZoom(currentZoom + (targetZoom > currentZoom ? 1 : -1))
    }, 250);
  }
}

доказательство концепции скрипки

фрагмент кода:

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: 48.2092762,
      lng: 16.3737249
    },
    zoom: 2
  });

  // example marker:
  var marker = new google.maps.Marker({
    map: map,
    targetZoom: 22,
    position: new google.maps.LatLng(48.2092762, 16.3737249)
  });

  // the smooth zoom function
  function animateMapZoomTo(map, targetZoom, commandedZoom) {
    var currentZoom = commandedZoom || map.getZoom();
    if (currentZoom != targetZoom) {
      google.maps.event.addListenerOnce(map, 'zoom_changed', function(event) {
        animateMapZoomTo(map, targetZoom, currentZoom + (targetZoom > currentZoom ? 1 : -1));
      });
      setTimeout(function() {
        map.setZoom(currentZoom + (targetZoom > currentZoom ? 1 : -1))
      }, 250);
    }
  }
  google.maps.event.addDomListener(document.getElementById('btn'), 'click', function() {
    console.info(map.getZoom());
    if (map.getZoom() < 3)
      animateMapZoomTo(map, 15);
    else if (map.getZoom() > 13)
      animateMapZoomTo(map, 2);
  })

}
#map {
  height: 80%;
}

html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}
<input id = "btn" value = "click" type = "button" />
<div id = "map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script src = "https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=geometry&callback=initMap" async defer></script>

Другие вопросы по теме