Google API v3 соответствует масштабу карты и границам всех маркеров
Я работаю над этим некоторое время и пытаюсь реализовать широковещательные границы, чтобы динамически уместить все выводы на холсте карты. Но это не работает. Если кто-то сделал что-то похожее на мой код, может кто-нибудь направить меня по правильному пути?
var geocoder;
var map;
function initializeMap() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(39.88445,-86.11084);
var myOptions = {
zoom: 9,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
function codeAddress() {
var bound = new google.maps.LatLngBounds();
var markers = new Array();
var infowindow = new google.maps.InfoWindow({});
$('.LocAddHidden').each(function(index) {
var addy = $(this).text();
geocoder.geocode( { 'address': addy}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK)
{
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
position: results[0].geometry.location,
map: map,
title:addy
});
}
});
});
}
$(document).ready(function(){
initializeMap();
codeAddress();
for(var i in markers)
{
bound.extend(markers[i].getPosition());
}
map.fitBounds(bound);
});
4 ответа
Основная проблема в том, что вы расширяете границы в пустом цикле. Я не вижу, куда вы добавляете что-либо в массив маркеров, который вы создаете в начале codeAddress(). Вы должны добавить маркер, который вы создаете в запросе геокодирования.
Но вместо того, чтобы добавить его в массив маркеров в одном цикле, а затем расширить границы в другом цикле, вы можете избавиться от второго цикла и просто расширить границы в первом цикле.
И вам не нужно повторно вводить карту на каждой итерации цикла. Установка границ в самом конце заботится о перецентрировании и масштабировании.
И Чири указал на еще одну проблему, касающуюся переменной области.
Для IE8, чтобы работать..
Вместо того, чтобы использовать: for(var i in markersArray)
Использовать этот: for (i = 0; i < markersArray.length; i++)
Вам нужно будет объявить массив маркеров в вашем коде и вставить каждый созданный маркер в этот массив
// global
var markers = [];
// after created
markers.push(marker);
После нескольких попыток у меня получается что-то простое и практичное:
function simulateBounds() {
var bounds = new google.maps.LatLngBounds;
for (var i = 0; i < arrayChinchetas.length; i++) {
bounds.extend(arrayChinchetas[i].getPosition());
}
SurOeste = bounds.getSouthWest();
NorEste = bounds.getNorthEast();
//Constructs a rectangle from the points at its south-west and north-east corners.
var latlandBounds = new google.maps.LatLngBounds(SurOeste, NorEste);
map.fitBounds(latlandBounds);
}