google map map.fitBounds() и bounds.extend() не работают должным образом.
У меня есть фрагмент кода ниже, который использует bounds.extend() и map.fitBounds(), чтобы изменить размер карты, чтобы разместить все маркеры. Я ожидаю, что карта может сфокусироваться на start_point как центр и уменьшить масштаб до соответствующего уровня, чтобы были видны все маркеры.
Тем не менее, это приводит к максимальному увеличению в start_point. И я попытался (commen) не вызывать bounds.extend() каждый раз в функции обратного вызова geocoder.geocode, а добавить маркер в массив и вызвать bounds.extend() в отдельном цикле, который тоже не работает.
Я дважды проверил, что маркеры успешно созданы, и я могу видеть их, если уменьшать вручную.
mark_pins () вызывается как функция обратного вызова ajax success, которую я здесь не включил.
Я что-то пропустил?
var map;
var start_point = new google.maps.LatLng(37.519002, -122.131);
var bounds = new google.maps.LatLngBounds();
function initialize() {
var map_canvas = document.getElementById('map_canvas');
var map_options = {
center: start_point,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(map_canvas, map_options);
}
google.maps.event.addDomListener(window, 'load', initialize);
function mark_pins(trucks){
var geocoder = new google.maps.Geocoder();
var markersArray = [];
for (i = 0; i < trucks.length; i++) {
// iterate each truck address
geocoder.geocode( { 'address' : trucks[i]['address']}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
marker.setMap(map);
bounds.extend(results[0].geometry.location);
//markersArray.push(marker);
} else {
alert('Internal error: ' + status + address);
}
});
}
var bounds = new google.maps.LatLngBounds();
for (i = 0; i< markersArray.length; i++) {
//code
//bounds.extend(new google.maps.LatLng(markersArray[i][1], markersArray[i][2]));
}
bounds.extend(start_point);
map.setCenter(start_point);
map.fitBounds(bounds);
}
1 ответ
Геокодер асинхронный. Ваш код звонков map.fitBounds(bounds)
прежде чем результаты вернутся. Размещенный код также никогда не вызывает функцию mark_pins.
function mark_pins(trucks) {
var geocoder = new google.maps.Geocoder();
var markersArray = [];
for (i = 0; i < trucks.length; i++) {
// iterate each truck address
geocoder.geocode({
'address': trucks[i]['address']
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
marker.setMap(map);
bounds.extend(results[0].geometry.location);
map.fitBounds(bounds);
} else {
alert('Internal error: ' + status + address);
}
});
}
}