2012-03-23 31 views
18

, ülkemizin haritası güzel ile 700x400px haritaya takıldı map.fitBounds() ait "ödemesiz marjı" etkiler nasıl aşağıdadır:Google Haritalar API v2 olarak

map.getBoundsZoomLevel(<bounds of our country>) 

Ama API v3, map.fitBounds() metodu, bu zoom seviyesinde 700x400'e sığmaz - bir seviye uzaklaştırır. Bu, map.fitBounds()'un bazı "zarafet marjı" veya benzeri bir şey ile sayılacağı anlamına gelir.

Bu kenar boşluğunun boyutunu nasıl etkilerim?

+0

"Ödül marjı" istenen sınırların yüzdesi olabilir mi? Bu kenar boşluğu düzeltilmişse, daha az, ölçülmüş, sığ bir şekilde fitBounds() öğesine girebilirsiniz. Böylece, teminat marjının sonu, istediğiniz başlangıç ​​sınırlarıyla eşleşecektir. Umarım bu mantıklıdır. –

+0

@HeitorChang, bu gerçekten hacky ve beceriksiz bir çözüm olurdu, ama yine de "lütuf marjı" nın fitBounds() tarafından nasıl hesaplandığını bilmeden, bunu yapamazsınız. – TMS

+7

Bilgisayar korsanlığı yaptıktan sonra, v3 fitBounds() öğesinin, yalnızca yakınlaştırma düzeyinde en az 45 piksel dolgu (dikdörtgenin her iki tarafına sınırlarınızla tanımlanmış) olması durumunda yakınlaştırılacağını düşündüm. Yakın bir çağrı olduğunu farz edersek, harita büyük bir boşluk bırakarak uzaklaştırılır. Umarım bu sizin için yararlı olabilir. –

cevap

2

Özel bir kenar boşluğu olmadan, haritayı olabildiğince yakınlaştıracak bir çözüm. İsterseniz bir miktar marjı hesaba katmanız gerekir.

Benim çözümüm this comment in a Google Groups thread dayanmaktadır. Ne yazık ki, helper.getProjection() numaralı çağrı her zaman tanımsız olarak geri döndü, bu yüzden yukarıdaki cevabı biraz uyarladım ve bu çalışma koduyla geldim.

Sadece myFitBounds(map, bounds) ile map.fitBounds(bounds) için mevcut aramaları değiştirin:

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

Bu benim için iyi çalıştı, ancak 'beklenenSize' tam olarak 'actualSize' olduğunda bir kayan nokta yuvarlama hatasıyla uğraşmak için bir satırı değiştirmek zorunda kaldım. GetSizeInPixels ifadesinin dönüş ifadesi: 'dönüş yeni google.maps.Point ( Math.round (10000 * Math.abs (sw.y - ne.y))/10000, Math.round (10000) olarak değiştirildi. * Math.abs (sw.x - ne.x))/10000 ); ' –

0

Şimdi, yöntem fitBounds dolgu boyutunu temsil eden bir ikinci parametresi vardır. Bunu kaldırmak isteyenler için sadece 0

Map.map.fitBounds(bounds, 0); 


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