323 votes

Google Map API v3 - définir les limites et le centre

J'ai récemment adopté l'API V3 de Google Maps. Je travaille sur un exemple simple qui trace des marqueurs à partir d'un tableau, mais je ne sais pas comment centrer et zoomer automatiquement par rapport aux marqueurs.

J'ai cherché partout sur le net, y compris dans la documentation de Google, mais je n'ai pas trouvé de réponse claire. Je sais que je pourrais simplement prendre une moyenne des coordonnées, mais comment régler le zoom en conséquence ?

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

445voto

spencercooly Points 2468

Oui, vous pouvez déclarer votre nouvel objet bounds.

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

Ensuite, pour chaque marqueur, étendez votre objet de délimitation :

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

API : google.maps.LatLngBounds

51 votes

Vous pouvez également ajouter ceci map.setCenter(bounds.getCenter()) ;

0 votes

Tant la réponse que le commentaire de Raman m'ont aidé à me concentrer sur ce dont j'avais besoin.

0 votes

@Sam152 : vous pourriez être intéressé par une 500 rep de prime pour une question connexe .

199voto

Michael Bradley Points 1788

J'ai tout réglé - voir les dernières lignes pour le 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);
}

8 votes

Merci ! Les documents de la version 3.0 sont étonnamment vagues quant à la destination de cette fonctionnalité.

12 votes

Les documents de la version 3.0 sont étonnamment vagues quant à l'emplacement d'un grand nombre de choses.

5 votes

Désolé que ce soit au mauvais endroit. C'est censé être un commentaire pour la réponse sélectionnée. Mais la fonction extend ne doit-elle pas être à l'intérieur de votre boucle for ?

5voto

localtime Points 51

Ma suggestion pour l'api google maps v3 serait (je ne pense pas que cela puisse être fait plus efficacement) :

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

Le résultat est que tous les points sont délimités dans la fenêtre de la carte.

L'exemple fonctionne parfaitement et vous pouvez le vérifier librement ici. www.zemelapis.lt

0 votes

Au lieu de renvoyer false si le bounds son null vous pourriez maps[ mapId ].getBounds() .

0 votes

@localtime en fait, votre site web a besoin des clés API de Google Maps pour fonctionner.

-1voto

Sebastien Points 497

La méthode setCenter() est toujours applicable pour la dernière version de Maps API for Flash où fitBounds() n'existe pas.

-15voto

Khayer Points 9

Utilisez celui ci-dessous,

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

14 votes

Ceci est pour Google Maps API v2

0 votes

Vous devez fournir une solution plus réfléchie. Et je crois que c'est pour Google Maps v2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X