Google Maps v3: обеспечение соблюдения мин. Уровень увеличения при использовании FITBOUNDS

StackOverflow https://stackoverflow.com/questions/2989858

Вопрос

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

Это было полезно?

Решение

В Это обсуждение групп Google Я обнаружил, что, в основном, когда вы делаете приспособления, увеличение происходит асинхронно, поэтому вам нужно захватить событие увеличения увеличения и границ. Код в последнем посте сработал для меня с небольшой модификацией ... как он останавливается, он останавливает вас, увеличиваясь более 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 (Апи-ссылка) как это:

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

Это не позволяло бы карте еще дальше масштабировать при использовании fitBounds().

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

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;

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

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 основан на события 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;
       }
    }
}); 

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

Я нашел следующее работать довольно хорошо. Это вариант на Райана отвечать к https: //stackoverflow.com/questions/3334729/.... Анкет Он гарантирует показать область, по крайней мере, в два раза больше значения offset в градусах.

const center = bounds.getCenter()
const offset = 0.01
const northEast = new google.maps.LatLng(
    center.lat() + offset,
    center.lng() + offset
)
const southWest = new google.maps.LatLng(
    center.lat() - offset,
    center.lng() - offset
)
const minBounds = new google.maps.LatLngBounds(southWest, northEast)
map.fitBounds(bounds.union(minBounds))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top