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

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


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

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


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

-1

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


-15

Gunakan di bawah satu,

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


12
Ini untuk Google Maps API v2
dave1010

Anda perlu memberikan solusi yang lebih matang. Dan saya percaya ini untuk Google Maps v2.
AllJs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.