Google Maps JavaScript API - подходит вместе с setCenter

Я искал решение этой проблемы, но я не могу найти то, что решает это. Ближе всего я получаю эту тему. Но это не работает.

То, что я пытаюсь сделать, - это запускать fitbounds на основе набора маркеров, который работает нормально. Но я также хотел бы центрировать карту в зависимости от местоположения пользователя (подпрыгивающий маркер в планке) и по-прежнему сохранять все маркеры в представлении карты. Если я пытаюсь установить Center после fitBounds, некоторые маркеры находятся за пределами вида карты. Есть ли какой-нибудь изящный способ объединить эти две функции? Вот план, иллюстрирующий проблему.

function initialize() {
  var userCenter = new google.maps.LatLng(51.508742, -0.120850);

  var userCenterMarker = new google.maps.Marker({
  position: userCenter
});

 userCenterMarker.setAnimation(google.maps.Animation.BOUNCE);

var mapProp = {
  center: userCenter,
  zoom: 12,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("googleMap"),   mapProp);

var bounds = new google.maps.LatLngBounds();
var markers = getMarkers();

$(markers).each(function() {
  bounds.extend(this.position);
  this.setMap(map);
});

userCenterMarker.setMap(map);

map.fitBounds(bounds);

setTimeout(function() {
  map.setCenter(userCenter);
}, 1500);
}

Спасибо!

3 ответа

Простое решение: добавьте свой "маркер пользователя" к границам, сделайте fitBounds, затем уменьшите полученный масштаб на 1 и отцентрируйте его на маркере.

  bounds.extend(userCenterMarker.getPosition());
  map.fitBounds(bounds);

  google.maps.event.addListenerOnce(map,'bounds_changed', function() {
        map.setZoom(map.getZoom()-1);
  });

рабочая скрипка

Более сложное решение: отцентрируйте "маркер пользователя", проверьте, полностью ли включены границы маркера в текущие границы карты (map.getBounds().contains(markerBounds)), если нет, уменьшите масштаб на 1.

Приведенный выше ответ не работает для меня. Вот что сделал:

contained = true;
map.fitBounds(bounds);
map.setCenter(center);
newbounds = map.getBounds();
for (i = 0; i < l; i ++) {
  if (!newbounds.contains(markers[i].getPosition())) {
    contained = false;
  }
}
if (!contained) map.setZoom(map.getZoom() - 1);

Если у вас есть границы и центр, вы можете сделать это, проверив, что текущая граница карты содержит центр и углы границ маркеров, и увеличив масштаб, если нет:

      function fitBoundsAroundCenter( center, bounds, map ) {
    map.fitBounds( bounds );
    map.setCenter( center );
    let zoomPoints = []
    zoomPoints.push( center );
    zoomPoints.push( bounds.getNorthEast() );
    zoomPoints.push( bounds.getSouthWest() );
    
    let allInView = false;
    while ( false === allInView ) {
        map.setZoom( map.getZoom() - 1 );
        allInView = zoomPoints.every( point => {
            if ( map.getBounds().contains( point ) ) {
                return true;
            }
            return false;
        });
    }
}
Другие вопросы по тегам