2009-10-12 9 views
274

Je suis récemment passé à Google Maps API V3. 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.Google Map API v3 - Définir les limites et le centre

J'ai effectué des recherches dans le net haut et bas, y compris la propre 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 pourrais-je 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] 
    }); 
    } 
} 

Répondre

164

obtenu tout sorted - 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); 
} 
+6

Merci! Les documents 3.0 sont étonnamment vagues sur l'emplacement de cette fonctionnalité. – Bill

+8

Les documents 3.0 sont étonnamment vagues sur l'endroit où beaucoup de choses se sont passées. :( – Scottie

+0

absolument parfait, merci! – Rabbott

382

Oui, déclarer simplement votre nouvel objet de limites.

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

Ensuite, pour chaque marqueur, étendre vos limites objet:

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

API: google.maps.LatLngBounds

+34

vous pouvez également ajouter map.setCenter (bounds.getCenter()); –

+0

La réponse et le commentaire de Raman m'ont aidé à me concentrer sur ce dont j'avais besoin. – JustJohn

+0

@ Sam152: vous pourriez être intéressé par une prime [500 rep pour une question connexe] (http://stackoverflow.com/questions/27094908/google-maps-keep-center-when-zooming). –

-15

utilisation ci-dessous un,

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

+12

Ceci est pour Google Maps API v2 – dave1010

+0

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

-1

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

5

Ma suggestion pour v3 api google maps serait (ne pense pas que cela peut être fait plus effeciently):

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

Dans le résultat u s'adapter tous les points limites dans la fenêtre de votre carte.

exemple fonctionne parfaitement et u peut librement vérifier ici www.zemelapis.lt

+0

Au lieu de retourner 'false' si les' bounds' sont 'null', vous pouvez' maps [mapId] .getBounds() '. – kaiser

+0

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

0

Les réponses sont parfaits pour ajuster les limites de la carte pour les marqueurs, mais si vous voulez étendre les limites de Google Maps pour les formes comme des polygones et des cercles, vous pouvez utiliser codes suivants:

Pour les cercles

bounds.union(circle.getBounds()); 

Pour Polygones

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

Pour Rectangles

bounds.union(overlay.getBounds()); 

Pour polylignes

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