Как повлиять на «грациозный запас» map.fitBounds () - PullRequest
18 голосов
/ 23 марта 2012

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

map.getBoundsZoomLevel(<bounds of our country>)

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

Это означает, что map.fitBounds() считается с некоторым «грациозным запасом» или чем-то еще.

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

Ответы [ 2 ]

2 голосов
/ 30 июня 2014

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

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

Просто замените существующие звонки на 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));
}
0 голосов
/ 30 ноября 2017

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

Map.map.fitBounds(bounds, 0);


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