El problema es el siguiente: nos propusimos
var bounds = new google.maps.LatLngBounds();
para que podamos encajar más tarde nuestros marcadores a un área delimitada en el mapa. GMaps siempre alejará de forma asíncrona a fitBounds() en consecuencia, pero no hará zoom para lograr lo mismo (como notado previamente por @broady). Esto no es ideal para muchas aplicaciones ya que una vez que se ha ido y muestra una serie de marcadores en el mapa que causaron que el mapa se aleje (quizás < 10), no volverá a acercarse sin que el usuario lo haga manualmente.
GMaps continuará utilizando los límites de la (falta de mejores palabras) la mayoría del estado de la colección de marcadores omitidos (lo siento). Establecer en 'nulo' antes de cada llamada de nuevos marcadores le brinda un mapa nuevo para trabajar.
Para acercar automáticamente, simplemente configure LatLngBounds(); a 'nulo' como tal (véase el ejemplo de pseudo continuación para ver su colocación):
bounds = new google.maps.LatLngBounds(null);
Pseudo ejemplo:
// map stuff/initiation
...
var bounds = new google.maps.LatLngBounds();
var gmarkers = [];
function CreateMarker (obj) {
myLatLng = new google.maps.LatLng(obj['latitude'], obj['longitude']);
marker = new google.maps.Marker({
position: myLatLng,
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(obj['job']);
infowindow.open(map, marker);
}
})(marker, i));
bounds.extend(myLatLng);
gmarkers.push(marker);
}
....
// here's an AJAX method I use to grab marker coords from a database:
$.ajax({
beforeSend: function() {
clear_markers(gmarkers); // see below for clear_markers() function declaration
},
cache: false,
data: params,
dataType: 'json',
timeout: 0,
type: 'POST',
url: '/map/get_markers.php?_=<?php echo md5(session_id() . time() . mt_rand(1,9999)); ?>',
success: function(data) {
if (data) {
if (data['count'] > 0) {
var obj;
var results = data['results'];
// Plot the markers
for (r in results) {
if (r < (data['count'])) {
CreateMarker(results[r]);
}
}
}
}
},
complete: function() {
map.fitBounds(bounds);
}
});
// clear_markers()
function clear_markers(a) {
if (a) {
for (i in a) {
a[i].setMap(null);
}
a.length = 0;
}
bounds = new google.maps.LatLngBounds(null); // this is where the magic happens; setting LatLngBounds to null resets the current bounds and allows the new call for zoom in/out to be made directly against the latest markers to be plotted on the map
}
Esto parece funcionar. Me pregunto qué se supone que 'panToBounds' debe hacer sin' fitBounds'. – dbkaplun