Как повлиять на "льготный запас" map.fitBounds()

В Google maps API v2 карта нашей страны была хорошо приспособлена к карте 700x400px со следующим:

map.getBoundsZoomLevel(<bounds of our country>)

Но в API v3 метод map.fitBounds() не подходит для этого уровня масштабирования до 700x400 - он масштабирует один уровень.

Это означает, что map.fitBounds() подсчитывается с некоторой "границей льгот" или чем-то еще.

Как я могу повлиять на размер этого поля?

Ответ 1

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

Мое решение основано на этом комментарии в потоке групп Google. К сожалению, вызов helper.getProjection() всегда возвращал undefined, поэтому я немного адаптировал приведенный выше ответ и придумал этот рабочий код.

Просто замените существующие вызовы на map.fitBounds(bounds) на myFitBounds(map, bounds):

function myFitBounds(myMap, bounds) {
    myMap.fitBounds(bounds);

    var overlayHelper = new google.maps.OverlayView();
    overlayHelper.draw = function () {
        if (!this.ready) {
            var projection = this.getProjection(),
                zoom = getExtraZoom(projection, bounds, myMap.getBounds());
            if (zoom > 0) {
                myMap.setZoom(myMap.getZoom() + zoom);
            }
            this.ready = true;
            google.maps.event.trigger(this, 'ready');
        }
    };
    overlayHelper.setMap(myMap);
}

// LatLngBounds b1, b2 -> zoom increment
function getExtraZoom(projection, expectedBounds, actualBounds) {
    var expectedSize = getSizeInPixels(projection, expectedBounds),
        actualSize = getSizeInPixels(projection, actualBounds);

    if (Math.floor(expectedSize.x) == 0 || Math.floor(expectedSize.y) == 0) {
        return 0;
    }

    var qx = actualSize.x / expectedSize.x;
    var qy = actualSize.y / expectedSize.y;
    var min = Math.min(qx, qy);

    if (min < 1) {
        return 0;
    }

    return Math.floor(Math.log(min) / Math.log(2) /* = log2(min) */);
}

// LatLngBounds bnds -> height and width as a Point
function getSizeInPixels(projection, bounds) {
    var sw = projection.fromLatLngToContainerPixel(bounds.getSouthWest());
    var ne = projection.fromLatLngToContainerPixel(bounds.getNorthEast());
    return new google.maps.Point(Math.abs(sw.y - ne.y), Math.abs(sw.x - ne.x));
}

Ответ 2

Теперь метод fitBounds имеет второй параметр, который представляет размер заполнения. Для тех, кто хочет удалить его, вам просто нужно пройти 0.

Map.map.fitBounds(bounds, 0);


New method signature: fitBounds(bounds:LatLngBounds|LatLngBoundsLiteral, padding?:number)