Google Map API v3 - tetapkan batas dan tengah

303

Saya baru saja beralih ke Google Maps API V3. Saya sedang mengerjakan contoh sederhana yang memplot penanda dari array, namun saya tidak tahu cara memusatkan dan memperbesar secara otomatis sehubungan dengan marker.

Saya telah mencari bersih tinggi dan rendah, termasuk dokumentasi Google sendiri, tetapi belum menemukan jawaban yang jelas. Saya tahu saya bisa mengambil rata-rata koordinat, tetapi bagaimana cara mengatur zoom?

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]
    });
  }
}
Michael Bradley
sumber

Jawaban:

423

Ya, Anda dapat mendeklarasikan objek batas baru Anda.

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

Kemudian untuk setiap marker, perpanjang objek batas Anda:

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

API: google.maps.LatLngBounds

spencercooly
sumber
42
Anda juga dapat menambahkan map.setCenter ini (bounds.getCenter ());
Raman Ghai
Baik jawaban maupun komentar Raman membantu mengurangi fokus saya pada apa yang saya butuhkan.
JustJohn
@ Sam152: Anda mungkin tertarik pada hadiah 500 rep untuk pertanyaan terkait .
Dan Dascalescu
185

Dapatkan semuanya diurutkan - lihat beberapa baris terakhir untuk kode - ( 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);
}
Michael Bradley
sumber
7
Terima kasih! 3.0 dokumen secara mengejutkan tidak jelas tentang ke mana fungsi ini pergi.
Bill
12
3.0 dokumen secara mengejutkan tidak jelas tentang ke mana BANYAK hal pergi. :(
Scott
5
Maaf ini di tempat yang salah. Ini dimaksudkan sebagai komentar untuk jawaban yang dipilih. Tapi bukankah fungsi extended harus ada di dalam for loop Anda?
kidbrax
1
Halo, kode yang bagus tetapi dapatkah kode ini ditingkatkan untuk menghindari "tidak ada gambar yang tersedia pada tingkat zoom ini". karena kode ini tidak menangani tingkat zoom, tentu kode ini menunjukkan semua penanda, tetapi secara pribadi saya lebih suka melihat zoom yang lebih rendah untuk menghindari pesan "tidak ada gambar ...". Ada ide?
slah
Apakah ini "bounds.extend (myLatLng); peta.fitBounds (batas);" tersedia untuk Android juga?
lionfly
5

Saran saya untuk google maps api v3 adalah (jangan berpikir itu bisa dilakukan dengan lebih efisien):

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);
    }
}

Sebagai hasilnya, Anda akan cocok dengan semua titik dalam batas di jendela peta Anda.

Contoh berfungsi dengan baik dan Anda bebas dapat memeriksanya di sini www.zemelapis.lt

waktu lokal
sumber
Alih-alih kembali falsejika boundsada null, Anda bisa maps[ mapId ].getBounds().
kaiser
@localtime sebenarnya, situs web Anda membutuhkan kunci Google Maps API untuk berfungsi
1

Jawabannya sempurna untuk menyesuaikan batas peta untuk marker tetapi jika Anda ingin memperluas batas Google Maps untuk bentuk seperti poligon dan lingkaran, Anda dapat menggunakan kode berikut:

Untuk Lingkaran

bounds.union(circle.getBounds());

Untuk Poligon

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

Untuk Rectangles

bounds.union(overlay.getBounds());

Untuk Polylines

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));
Hossein
sumber
-1

Metode setCenter () masih berlaku untuk versi terbaru dari Maps API for Flash di mana fitBounds () tidak ada.

Sebastien
sumber
-15

Gunakan di bawah satu,

map.setCenter (bounds.getCenter (), map.getBoundsZoomLevel (batas));

Khayer
sumber
12
Ini untuk Google Maps API v2
dave1010
Anda perlu memberikan solusi yang lebih matang. Dan saya percaya ini untuk Google Maps v2.
AllJs