如何影响map.fitBounds()的"宽限度"

TMS*_*TMS 18 google-maps google-maps-api-3 google-maps-api-2

在Google maps API v2中,我们国家的地图非常适合700x400px地图,其中包含以下内容:

map.getBoundsZoomLevel(<bounds of our country>)
Run Code Online (Sandbox Code Playgroud)

但是在API v3中,该map.fitBounds()方法不适合在700x400的缩放级别 - 它缩小了一个级别.

这意味着map.fitBounds()计算带有一些"优雅边际"或其他东西.

我该如何影响这个保证金的大小?

Oli*_*ver 2

这是一个在没有自定义边距的情况下尽可能放大地图的解决方案。如果您愿意,您应该能够调整它以考虑一些裕度。

我的解决方案基于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));
}
Run Code Online (Sandbox Code Playgroud)