Google Maps v3: принудительное применение мин. уровень масштабирования при использовании fitBounds - PullRequest
69 голосов
/ 07 июня 2010

Я рисую серию маркеров на карте (используя v3 карты API).

В v2 у меня был следующий код:

  bounds = new GLatLngBounds();

  ... loop thru and put markers on map ...
  bounds.extend(point);
  ... end looping

  map.setCenter(bounds.getCenter());
  var level = map.getBoundsZoomLevel(bounds);
  if ( level == 1 ) 
    level = 5;
  map.setZoom(level > 6 ? 6 : level);

И это прекрасно работает, чтобы на карте всегда отображался соответствующий уровень детализации.

Я пытаюсь продублировать эту функциональность в v3, но setZoom и fitBounds, похоже, не взаимодействуют:

... loop thru and put markers on the map
  var ll = new google.maps.LatLng(p.lat,p.lng);
  bounds.extend(ll);
... end loop

var zoom = map.getZoom();
map.setZoom(zoom > 6 ? 6 : zoom);
map.fitBounds(bounds);

Я пробовал другую перестановку (например, перемещая fitBounds перед setZoom), но ничего, что я делаю с setZoom, похоже, не влияет на карту. Я что-то пропустил? Есть ли способ сделать это?

Ответы [ 7 ]

125 голосов
/ 07 июня 2010

На этом обсуждении в группах Google Я обнаружил, что в основном, когда вы делаете fitBounds, масштабирование происходит асинхронно, поэтому вам нужно захватить событие изменения масштаба и изменения границ.Код в последнем посте работал для меня с небольшой модификацией ... в таком виде он останавливает полное масштабирование больше 15, поэтому использовал идею из четвертого поста, чтобы флаг был установлен только для первого раза.

// Do other stuff to set up map
var map = new google.maps.Map(mapElement, myOptions);
// This is needed to set the zoom after fitbounds, 
google.maps.event.addListener(map, 'zoom_changed', function() {
    zoomChangeBoundsListener = 
        google.maps.event.addListener(map, 'bounds_changed', function(event) {
            if (this.getZoom() > 15 && this.initialZoom == true) {
                // Change max/min zoom here
                this.setZoom(15);
                this.initialZoom = false;
            }
        google.maps.event.removeListener(zoomChangeBoundsListener);
    });
});
map.initialZoom = true;
map.fitBounds(bounds);

Надеюсь, это поможет,

Энтони.

56 голосов
/ 18 мая 2011

Не пытаясь сделать это, я бы сказал, что вы сможете сделать это, просто набрав fitBounds(), прежде чем получите уровень масштабирования, т.е.

map.fitBounds(bounds);
var zoom = map.getZoom();
map.setZoom(zoom > 6 ? 6 : zoom);

.t, вы можете настроить карту с помощью minZoom в MapOptions (API-ссылка) следующим образом:

var map = new google.maps.Map(document.getElementById("map"), { minZoom: 6 });

Это позволиткарта от дальнейшего уменьшения при использовании fitBounds().

16 голосов
/ 30 ноября 2011

Решение Энтони очень приятно. Мне нужно было только исправить масштаб для начальной загрузки страницы (чтобы убедиться, что вы не слишком сильно увеличили масштаб для начала), и это помогло мне:

var zoomChangeBoundsListener =
    google.maps.event.addListener(map, 'bounds_changed', function(event) {
        google.maps.event.removeListener(zoomChangeBoundsListener);
        map.setZoom( Math.min( 15, map.getZoom() ) );
    });


map.fitBounds( zoomBounds );
14 голосов
/ 01 июля 2014

Вы также можете установить параметр maxZoom непосредственно перед вызовом fitBounds () и затем сбросить значение:

if(!bounds.isEmpty()) {
    var originalMaxZoom = map.maxZoom;
    map.setOptions({maxZoom: 18});
    map.fitBounds(bounds);
    map.setOptions({maxZoom: originalMaxZoom});
}
11 голосов
/ 25 апреля 2013

Когда вы вызываете map.fitBounds () для одного элемента - карта может увеличиваться слишком близко. Чтобы это исправить, просто добавьте 'maxZoom' к mapOptions ...

var mapOptions = {
  maxZoom: 15
};
7 голосов
/ 21 сентября 2012

В моем случае я просто хотел установить уровень масштабирования на единицу меньше, чем то, что карты Google выбрали для меня во время fitBounds. Цель состояла в том, чтобы использовать fitBounds, но также убедиться, что под инструментами карты не было никаких маркеров и т. Д.

Моя карта создается рано, и затем ряд других динамических компонентов страницы имеют возможность добавлять маркеры, вызывая fitBounds после каждого добавления.

Это начальный блок, в котором изначально был создан объект карты ...

var mapZoom = null;

Затем это добавляется к каждому блоку, в который добавляется маркер, непосредственно перед вызовом map.fitBounds ...

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

При использовании «bounds_changed» без установленной проверки карта масштабируется один раз для каждого маркера независимо от того, нужен он ему или нет. И наоборот, когда я использовал «zoom_changed», у меня иногда были маркеры под инструментами карты, потому что масштаб на самом деле не менялся. Теперь он всегда срабатывает, но проверка гарантирует, что он уменьшается только один раз и только при необходимости.

Надеюсь, это поможет.

3 голосов
/ 20 октября 2013

Поскольку Google Maps V3 управляется событиями, вы можете указать API-интерфейсу, чтобы он уменьшил масштаб до нужного значения при срабатывании события zoom_changed :

var initial = true
google.maps.event.addListener(map, "zoom_changed", function() {
    if (initial == true){
       if (map.getZoom() > 11) {
         map.setZoom(11);
         initial = false;
       }
    }
}); 

Я использовал initial , чтобы карта не слишком сильно увеличивала масштаб, когда конечная область fitBounds была изменена, но чтобы позволить пользователю изменять масштаб настолько, насколько он / она хочет. Без условия любое событие масштабирования свыше 11 было бы возможным для пользователя.

...