Tüm görünür İşaretçileri kapsayacak şekilde Haritanın Merkezini Merkezle / Ayarla?


352

Haritama birden çok işaretçi ayarlıyorum ve statik olarak yakınlaştırma düzeylerini ve merkezini ayarlayabiliyorum, ancak istediğim, tüm işaretleyicileri kapsamak ve tüm pazarların görünür olmasını mümkün olduğunca yakınlaştırmak.

Mevcut yöntemler aşağıdaki gibidir

setZoom(zoom:number)

ve

setCenter(latlng:LatLng)

Ne setCenterçoklu konum veya Konum dizisi girişini desteklemez ne setZoomde bu tür bir işleve sahip değildir

resim açıklamasını buraya girin



her işaretçi eklediğinizde ve haritanızı son sınırlara uyacak şekilde ayarladığınızda latlngbir boundsnesneye eklemeniz gerekir . Cevabı buradan görebilirsiniz: stackoverflow.com/questions/1556921/…
Suvi Vignarajah

Yanıtlar:


678

fitBounds()Yöntemi kullanmanız gerekir .

var markers = [];//some array
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < markers.length; i++) {
 bounds.extend(markers[i]);
}

map.fitBounds(bounds);

Belgeler gelen developers.google.com/maps/documentation/javascript :

fitBounds(bounds[, padding])

Parametreler:

`bounds`:  [`LatLngBounds`][1]|[`LatLngBoundsLiteral`][1]
`padding` (optional):  number|[`Padding`][1]

Dönüş Değeri: Yok

Görünüm penceresini verilen sınırları içerecek şekilde ayarlar.
Not : Harita olarak ayarlandığında display: none, fitBoundsfonksiyon haritanın boyutunu olarak okur 0x0ve bu nedenle hiçbir şey yapmaz. Harita gizliyken görünüm penceresini değiştirmek için haritayı olarak ayarlayın visibility: hidden, böylece harita bölmesinin gerçek bir boyutu olduğundan emin olun.


3
Gönderen kadar nerede getPositionyöntem geldi?
Pratheep

6
@Pratheep - google.maps.Marker sınıfının bir parçasıdır; developers.google.com/maps/documentation/javascript/…
Adam

Bir cazibe gibi çalıştı! Teşekkürler
Joseph N.

9
Yeni başlayanlar için bir kenara olduğu gibi, Pratheep ile aynı soru ile ... Haritalar API'sı ile deneyimliyorsanız bunu biliyorsunuz, ancak her zaman LatLngLiteralbir Marker örneği yerine geçmek zorunda kalabilirsiniz . ör bounds.extend({lat: 123, lng: 456}).
Kyle Baker

1
İlgilenen herkes için ekstra bir ipucu. fitBounds(bounds, int)İşaretçileri ve harita kenarları arasında biraz boşluk bırakmanızı (veya gerekirse daha az boşluğu) sağlayacak bir dolgu kullanarak tanımlayabilirsiniz . Belgeleri Gör
MickelsonMichael

178

Verilen cevabı birkaç faydalı numarayla genişletmek için:

var markers = //some array;
var bounds = new google.maps.LatLngBounds();
for(i=0;i<markers.length;i++) {
   bounds.extend(markers[i].getPosition());
}

//center the map to a specific spot (city)
map.setCenter(center); 

//center the map to the geometric center of all markers
map.setCenter(bounds.getCenter());

map.fitBounds(bounds);

//remove one zoom level to ensure no marker is on the edge.
map.setZoom(map.getZoom()-1); 

// set a minimum zoom 
// if you got only 1 marker or all markers are on the same address map will be zoomed too much.
if(map.getZoom()> 15){
  map.setZoom(15);
}

//Alternatively this code can be used to set the zoom for just 1 marker and to skip redrawing.
//Note that this will not cover the case if you have 2 markers on the same address.
if(count(markers) == 1){
    map.setMaxZoom(15);
    map.fitBounds(bounds);
    map.setMaxZoom(Null)
}

GÜNCELLEME:
Konuyla ilgili daha fazla araştırma, fitBounds () yönteminin bir asenkronik olduğunu ve Fit Bounds çağırmadan önce tanımlanmış bir dinleyici ile Zoom manipülasyonu yapmak en iyisidir.
Thanks @Tim, @ xr280xr, konuyla ilgili daha fazla örnek: SO: fitzoom-fit-fitbounds

google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
  this.setZoom(map.getZoom()-1);

  if (this.getZoom() > 15) {
    this.setZoom(15);
  }
});
map.fitBounds(bounds);

4
İyi eklemeler. Teşekkürler!
paneer_tikka

1
Undefined .getZoom () tarafından döndürülüyordu. Bu cevap , değeri başlatıldıktan sonra yakınlaştırmayı ayarlamak için addListenerOnceaçık tuşunu kullanarak çözmeme yardımcı oldu zoom_changed.
xr280xr

1
Teşekkürler @ d.raev, ancak sınırlar önceden ayarlanmışken maksimum zum ayarı yapmak işe yaramaz. Haritanızı başlatırken yapmanız gereken "maxZoom" seçeneğini belirlemektir. developers.google.com/maps/documentation/javascript/…
Tim

1
Zoom manipülasyonu ( UPDATE ) ile ilgili bölümde , birkaç çeşit ve kapsamı karıştırıyorsunuz. Sen kullanmak yourMap, mapve this. Belki daha tutarlı hale getirmek iyi bir fikirdir.
Gustavo Straube

11

Dizi boyutu sıfırdan büyük olmalıdır. Aksi takdirde beklenmedik sonuçlarınız olacaktır.

function zoomeExtends(){
  var bounds = new google.maps.LatLngBounds();
  if (markers.length>0) { 
      for (var i = 0; i < markers.length; i++) {
         bounds.extend(markers[i].getPosition());
        }    
        myMap.fitBounds(bounds);
    }
}

8

Google Harita geliştirici Makaleleri'ndeMarkerClusterer burada belirtildiği gibi google Map için bu istemci tarafı yardımcı programı var, kullanımının ne olduğu hakkında kısa bilgi:

İstediğinizi yapmak için birçok yaklaşım var:

  • Şebekeye dayalı kümeleme
  • Mesafeye dayalı kümeleme
  • Viewport Marker Yönetimi
  • Füzyon Tabloları
  • İşaret Kümesi
  • MarkerManager

Bunları yukarıdaki sağlanan bağlantıdan okuyabilirsiniz.

Marker Clustererızgara isteyen tüm işaretleyicileri kümelemek için Izgara Tabanlı Kümeleme kullanır . Izgara tabanlı kümeleme, haritayı belirli bir boyuttaki karelere bölerek (her zumda boyut değişir) ve daha sonra işaretleri her ızgara karesinde gruplayarak çalışır.

Kümeleme Öncesi Kümeleme Öncesi

Kümeleme Sonrası Kümeleme Sonrası

Umarım aradığınız şey budur ve bu sorununuzu çözecektir :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.