2012-03-23 67 views
18

在谷歌地圖API V2,我國的地圖是很好的擬合700x400px地圖「寬限期保證金」以下內容:如何影響map.fitBounds()的

map.getBoundsZoomLevel(<bounds of our country>) 

但在API v3中, map.fitBounds()方法不適合它在縮放級別700x400 - 它縮小一個級別。

這意味着map.fitBounds()計算一些「寬限餘量」或什麼。

如何影響此邊距的大小?

+0

「寬限」可以是你想要的邊界的百分比?如果這個邊界是固定的,你可以輸入一個更小的,測量的邊界到fitBounds(),以便寬限邊界的結尾符合你最初的期望邊界。希望這是有道理的。 – 2012-03-23 18:05:31

+0

@HeitorChang,這將是一個真正的hacky和笨拙的解決方案,但無論如何,如果不知道fitBounds()計算的「寬限值」究竟如何確切,那麼您無法這樣做。 – TMS 2012-03-23 18:31:38

+7

在黑客入侵之後,我得出結論,只有在長焦度上,在縮放級別至少有45像素填充(對於由邊界定義的矩形的兩側),v3 fitBounds()纔會放大。假設這是一個關閉的呼叫,地圖將保持縮小狀態,留下大量空間。我希望這對你有用。 – 2012-03-23 19:47:42

回答

2

這裏有一個解決方案,儘可能地放大地圖而沒有自定義邊距。如果你願意,你應該能夠適應它來考慮一些保證金。

我的解決方案基於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)); 
} 
+0

這對我很好,但是當'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

0

現在,方法fitBounds有表示填充的大小第二個參數。對於那些想要刪除它,你只需要通過0.

Map.map.fitBounds(bounds, 0); 


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