如何影响 map.fitBounds() 的“优雅边界”?

18

在Google地图API v2中,我们国家的地图可以通过以下方式完美适配到700x400像素的地图中:

map.getBoundsZoomLevel(<bounds of our country>)

但在API v3中,map.fitBounds()方法不会将其适合于700x400的缩放级别 - 它会缩小一个级别。

这意味着map.fitBounds()考虑到一些“优雅边距”或其他因素。

我该如何影响此边距的大小?


7
在试验过程中,我得出结论:只有在长方向的边界框两侧至少有45像素的填充时,v3 fitBounds()函数才会进行缩放操作。如果这是一个接近的情况,地图将维持缩小状态,留下大的空白边距。希望这对你有用。 - Heitor Chang
4
阅读了这篇文章:https://dev59.com/8W025IYBdhLWcg3wW0yx 后,我担心除了编写自己的“fitBounds”之外,没有其他解决方案。糟糕的v3 API,又是另一个缺陷! - Tomas
你知道获取“优雅边距”边界的解决方法吗? - Murat Çorlu
不,我不知道答案。如果我知道的话,我会在这里发布的。 - Tomas
2
在许多情况下,您可以通过引用地图的中心坐标和缩放级别来替换地图边界。 - MrUpsidown
显示剩余5条评论
2个回答

2
这里有一个解决方案,它将地图缩放到最大,而不需要自定义边距。如果您想要考虑一些边距,您应该能够对其进行调整。
我的解决方案基于此Google Groups线程中的评论。不幸的是,对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));
}

这对我很有效,但是当expectedSize恰好是actualSize的两倍时,我必须修改一行以处理浮点舍入误差。将getSizeInPixels的返回语句更改为: `return new google.maps.Point( Math.round(10000 * Math.abs(sw.y - ne.y)) / 10000, Math.round(10000 * Math.abs(sw.x - ne.x)) / 10000 );` - Eric Freese

0

现在,fitBounds方法有第二个参数,表示填充大小。对于那些想要删除它的人,只需要传递0即可。

Map.map.fitBounds(bounds, 0);


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接