Google Maps v3: принуждение мин. уровень масштабирования при использовании fitBounds



Я рисую серию маркеров на карте (используя 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, кажется, влияет на карту. Я что-то упустил? Есть ли способ сделать это?

236   7  

7 ответов:

я случайно искал то же самое :)

в этом обсуждении на Группы 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);

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

Энтони.

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

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

если вы попробовали это, и это не сработало, вы можете настроить свою карту с помощью minZoom на MapOptions(api-ссылка) такой:

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

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

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

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 );

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

if(!bounds.isEmpty()) {
    var originalMaxZoom = map.maxZoom;
    map.setOptions({maxZoom: 18});
    map.fitBounds(bounds);
    map.setOptions({maxZoom: originalMaxZoom});
}

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

var mapOptions = {
  maxZoom: 15
};

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

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

это в начальном блоке, где изначально находится объект карты создан...

var mapZoom = null;

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

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

при использовании 'bounds_changed' без проверки на месте, карта увеличена один раз для каждого маркера независимо от того, нужно ли это или нет. И наоборот, когда я использовал "zoom_changed", у меня иногда были маркеры под инструментами карты, потому что масштаб фактически не изменился. Теперь он всегда срабатывает, но проверка гарантирует, что это только сигналит один раз и только при необходимости.

надеюсь, что это помогает.

Так как 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;
       }
    }
}); 

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

    Ничего не найдено.

Добавить ответ:
Отменить.