Google Map API v3 - Grenzen und Zentrum festlegen

303

Ich habe kürzlich zu Google Maps API V3 gewechselt. Ich arbeite an einem einfachen Beispiel, in dem Markierungen aus einem Array gezeichnet werden. Ich weiß jedoch nicht, wie ich die Markierungen automatisch zentrieren und zoomen soll.

Ich habe das Internet hoch und niedrig durchsucht, einschließlich Googles eigener Dokumentation, aber keine klare Antwort gefunden. Ich weiß, ich könnte einfach einen Durchschnitt der Koordinaten nehmen, aber wie würde ich den Zoom entsprechend einstellen?

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
quelle

Antworten:

423

Ja, Sie können Ihr neues Grenzobjekt deklarieren.

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

Erweitern Sie dann für jeden Marker Ihr Begrenzungsobjekt:

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

API: google.maps.LatLngBounds

spencercooly
quelle
42
Sie können auch diese map.setCenter (bounds.getCenter ()) hinzufügen.
Raman Ghai
Sowohl die Antwort als auch der Kommentar von Raman halfen mir, mich auf das zu konzentrieren, was ich brauchte.
JustJohn
@ Sam152: Sie könnten an einer Prämie von 500 Wiederholungen für eine verwandte Frage interessiert sein .
Dan Dascalescu
185

Habe alles sortiert - siehe die letzten Zeilen für Code - ( 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
quelle
7
Vielen Dank! Die 3.0-Dokumente sind überraschend vage, wo diese Funktionalität hingegangen ist.
Bill
12
Die 3.0-Dokumente sind überraschend vage darüber, wohin viele Dinge gingen. :(
Scott
5
Entschuldigung, das ist am falschen Ort. Es soll ein Kommentar für die ausgewählte Antwort sein. Aber muss sich die Extend-Funktion nicht in Ihrer for-Schleife befinden?
Kidbrax
1
Hallo, großartiger Code, aber könnte dieser Code verbessert werden, um zu vermeiden, dass "bei dieser Zoomstufe keine Bilder verfügbar sind". Da sich dieser Code nicht um die Zoomstufe kümmert, werden zwar alle Markierungen angezeigt, aber ich persönlich würde es vorziehen, einen niedrigeren Zoom zu sehen, um die Meldung "Keine Bilder ..." zu vermeiden. Irgendeine Idee bitte?
Slah
Sind dies "bounds.extend (myLatLng); map.fitBounds (bounds);" auch für Android verfügbar?
Lionfly
5

Mein Vorschlag für Google Maps API v3 wäre (glaube nicht, dass es effizienter gemacht werden kann):

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

Im Ergebnis passen Sie alle Punkte in Grenzen in Ihrem Kartenfenster an.

Beispiel funktioniert perfekt und Sie können es hier frei überprüfen www.zemelapis.lt

Ortszeit
quelle
Anstatt zurückzukehren, falsewenn dies der boundsFall ist null, könnten Sie dies tun maps[ mapId ].getBounds().
Kaiser
@localtime tatsächlich benötigt Ihre Website Google Maps API-Schlüssel, um zu funktionieren
1

Die Antworten eignen sich perfekt zum Anpassen der Kartengrenzen für Markierungen. Wenn Sie jedoch die Google Maps-Grenzen für Formen wie Polygone und Kreise erweitern möchten, können Sie die folgenden Codes verwenden:

Für Kreise

bounds.union(circle.getBounds());

Für Polygone

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

Für Rechtecke

bounds.union(overlay.getBounds());

Für Polylinien

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
quelle
-1

Die setCenter () -Methode gilt weiterhin für die neueste Version der Maps-API für Flash, bei der fitBounds () nicht vorhanden ist.

Sebastien
quelle
-15

Verwenden Sie unter einem,

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

Khayer
quelle
12
Dies ist für Google Maps API v2
dave1010
Sie müssen eine durchdachte Lösung bereitstellen. Und ich glaube, das ist für Google Maps v2.
AllJs