在谷歌地圖API V2,我國的地圖是很好的擬合700x400px地圖「寬限期保證金」以下內容:如何影響map.fitBounds()的
map.getBoundsZoomLevel(<bounds of our country>)
但在API v3中, map.fitBounds()
方法不適合它在縮放級別700x400 - 它縮小一個級別。
這意味着map.fitBounds()
計算一些「寬限餘量」或什麼。
如何影響此邊距的大小?
在谷歌地圖API V2,我國的地圖是很好的擬合700x400px地圖「寬限期保證金」以下內容:如何影響map.fitBounds()的
map.getBoundsZoomLevel(<bounds of our country>)
但在API v3中, map.fitBounds()
方法不適合它在縮放級別700x400 - 它縮小一個級別。
這意味着map.fitBounds()
計算一些「寬限餘量」或什麼。
如何影響此邊距的大小?
這裏有一個解決方案,儘可能地放大地圖而沒有自定義邊距。如果你願意,你應該能夠適應它來考慮一些保證金。
我的解決方案基於this comment in a Google Groups thread。不幸的是,呼叫helper.getProjection()
總是返回undefined,所以我適應了上述答案,並提出了這個工作代碼。
只是myFitBounds(map, bounds)
替換現有呼叫map.fitBounds(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'恰好是double'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 );' – 2014-12-05 21:06:31
現在,方法fitBounds有表示填充的大小第二個參數。對於那些想要刪除它,你只需要通過0.
Map.map.fitBounds(bounds, 0);
New method signature: fitBounds(bounds:LatLngBounds|LatLngBoundsLiteral, padding?:number)
「寬限」可以是你想要的邊界的百分比?如果這個邊界是固定的,你可以輸入一個更小的,測量的邊界到fitBounds(),以便寬限邊界的結尾符合你最初的期望邊界。希望這是有道理的。 – 2012-03-23 18:05:31
@HeitorChang,這將是一個真正的hacky和笨拙的解決方案,但無論如何,如果不知道fitBounds()計算的「寬限值」究竟如何確切,那麼您無法這樣做。 – TMS 2012-03-23 18:31:38
在黑客入侵之後,我得出結論,只有在長焦度上,在縮放級別至少有45像素填充(對於由邊界定義的矩形的兩側),v3 fitBounds()纔會放大。假設這是一個關閉的呼叫,地圖將保持縮小狀態,留下大量空間。我希望這對你有用。 – 2012-03-23 19:47:42