Google Harita API v3 - sınırları ve merkezi ayarlama


303

Kısa süre önce Google Maps API V3'e geçtim. Ben bir diziden işaretçileri çizen basit bir örnek üzerinde çalışıyorum, ancak nasıl işaretlemek için otomatik olarak merkezleme ve yakınlaştırma bilmiyorum.

Google'ın kendi belgeleri dahil olmak üzere net yüksek ve düşük aradım, ancak net bir cevap bulamadım. Koordinatların ortalamasını alabileceğimi biliyorum, ama yakınlaştırmayı buna göre nasıl ayarlayabilirim?

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),


    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);

  setMarkers(map, beaches);
}


var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.423036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 121.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.450198, 151.259302, 1]
];

function setMarkers(map, locations) {

  var image = new google.maps.MarkerImage('images/beachflag.png',
      new google.maps.Size(20, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
    var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',

      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));


      var lat = map.getCenter().lat(); 
      var lng = map.getCenter().lng();      


  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}

Yanıtlar:


423

Evet, yeni sınırlar nesnenizi bildirebilirsiniz.

 var bounds = new google.maps.LatLngBounds();

Sonra her bir işaretçi için sınırlar nesnenizi genişletin:

bounds.extend(myLatLng);
map.fitBounds(bounds);

API: google.maps.LatLngBounds


42
bu map.setCenter'ı (bounds.getCenter ()) da ekleyebilirsiniz;
Raman Ghai

Hem cevap hem de Raman'ın yorumu, neye ihtiyacım olduğuna odaklanmamı yavaşlattı.
JustJohn


185

Her şeyi sıraladık - kod için son birkaç satıra bakın - ( bounds.extend(myLatLng); map.fitBounds(bounds);)

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(0, 0),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(
    document.getElementById("map_canvas"),
    myOptions);
  setMarkers(map, beaches);
}

var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 161.259052, 5],
  ['Cronulla Beach', -36.028249, 153.157507, 3],
  ['Manly Beach', -31.80010128657071, 151.38747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.159302, 1]
];

function setMarkers(map, locations) {
  var image = new google.maps.MarkerImage('images/beachflag.png',
    new google.maps.Size(20, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
    new google.maps.Size(37, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32));
  var shape = {
    coord: [1, 1, 1, 20, 18, 20, 18 , 1],
    type: 'poly'
  };
  var bounds = new google.maps.LatLngBounds();
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      shadow: shadow,
      icon: image,
      shape: shape,
      title: beach[0],
      zIndex: beach[3]
    });
    bounds.extend(myLatLng);
  }
  map.fitBounds(bounds);
}

7
Teşekkürler! 3.0 belgeleri şaşırtıcı bir şekilde bu işlevin nereye gittiğine dair belirsiz.
Bill

12
3.0 belge şaşırtıcı bir şekilde bir sürü şeyin nereye gittiğine dair belirsiz. :(
Scott

5
Maalesef bu yanlış yerde. Seçilen cevap için bir yorum olması gerekiyordu. Ancak, genişletme işlevinin for döngüsü içinde olması gerekmez mi?
kidbrax

1
Merhaba, harika bir kod, ancak "bu yakınlaştırma düzeyinde resim yok" u önlemek için bu kod geliştirilebilir. çünkü bu kod yakınlaştırma seviyesi ile ilgilenmez, emin olun tüm belirteçleri gösterir, ama ben şahsen daha düşük yakınlaştırmayı görmek istiyorum tercih "görüntü yok ..." mesajları. Herhangi bir fikir lütfen?
Slah

Bunlar "bounds.extend (myLatLng); map.fitBounds (bounds);" Android için de kullanılabilir mi?
lionfly

5

Google Maps API v3 için önerim (daha verimli bir şekilde yapılabileceğini düşünmeyin):

gmap : {
    fitBounds: function(bounds, mapId)
    {
        //incoming: bounds - bounds object/array; mapid - map id if it was initialized in global variable before "var maps = [];"
        if (bounds==null) return false;
        maps[mapId].fitBounds(bounds);
    }
}

Sonuç olarak u, harita pencerenizdeki tüm noktaları sınırlara sığdırır.

Örnek mükemmel çalışıyor ve burada özgürce kontrol edebilirsiniz www.zemelapis.lt


Yerine dönen falseeğer boundsvardır null, ilgilenir misin maps[ mapId ].getBounds().
kaiser

@localtime aslında, web sitenizin çalışması için Google Maps API anahtarlarına ihtiyacı var

1

Yanıtlar işaretçiler için harita sınırlarını ayarlamak için mükemmeldir, ancak çokgenler ve daireler gibi şekiller için Google Haritalar sınırlarını genişletmek isterseniz, aşağıdaki kodları kullanabilirsiniz:

Çevreler için

bounds.union(circle.getBounds());

Çokgenler için

polygon.getPaths().forEach(function(path, index)
{
    var points = path.getArray();
    for(var p in points) bounds.extend(points[p]);
});

Dikdörtgenler için

bounds.union(overlay.getBounds());

Çoklu Hatlar için

var path = polyline.getPath();

var slat, blat = path.getAt(0).lat();
var slng, blng = path.getAt(0).lng();

for(var i = 1; i < path.getLength(); i++)
{
    var e = path.getAt(i);
    slat = ((slat < e.lat()) ? slat : e.lat());
    blat = ((blat > e.lat()) ? blat : e.lat());
    slng = ((slng < e.lng()) ? slng : e.lng());
    blng = ((blng > e.lng()) ? blng : e.lng());
}

bounds.extend(new google.maps.LatLng(slat, slng));
bounds.extend(new google.maps.LatLng(blat, blng));

-1

SetCenter () yöntemi, fitBounds () öğesinin mevcut olmadığı Flash için Google Haritalar API'sının en son sürümü için hala geçerlidir.


-15

Birinin altında kullanın,

map.setCenter (bounds.getCenter (), map.getBoundsZoomLevel (sınırlar));


12
Bu, Google Maps API v2 için
dave1010

Daha düşünülmüş bir çözüm sağlamanız gerekiyor. Ve bunun Google Maps v2 için olduğuna inanıyorum.
AllJs
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.