Javascript 谷歌地图API-多信息窗口和自动居中

Javascript 谷歌地图API-多信息窗口和自动居中,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我一直在拼凑互联网上的各种代码(包括StackOverflow),我已经有了一个工作地图(几乎),它可以从一个数组中对邮政编码进行地理编码,并为每个编码创建信息窗口 两个问题: 1) “我的信息”窗口应该从另一个数组获取文本,始终使用最后一个数组值 2) 我无法使地图自动居中。我使用了一些在其他情况下可以工作的代码,但在我的代码中没有 该代码相当不言自明: var geocoder = new google.maps.Geocoder(); var map = new google.maps.

我一直在拼凑互联网上的各种代码(包括StackOverflow),我已经有了一个工作地图(几乎),它可以从一个数组中对邮政编码进行地理编码,并为每个编码创建信息窗口

两个问题:

1) “我的信息”窗口应该从另一个数组获取文本,始终使用最后一个数组值

2) 我无法使地图自动居中。我使用了一些在其他情况下可以工作的代码,但在我的代码中没有

该代码相当不言自明:

var geocoder = new google.maps.Geocoder();

var map = new google.maps.Map(document.getElementById('map'), {
  //zoom: 10,
  //center: new google.maps.LatLng(-33.92, 151.25),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

var postcodes = [
    "EH14 1PR",
    "KY7 4TP",
    "IV6 7UP"   
];

var descriptions = [
    "Slateford",
    "Cortachy",
    "Marybank"
];

var markersArray = [];

var infowindow = new google.maps.InfoWindow();

var marker, i, address, description;

for(var i = 0; i < postcodes.length; i++) {
    address = postcodes[i];
    description = descriptions[i];
    geocoder.geocode(
        {
            'address': address,
            'region' : 'uk'
        }, 
        function(results, status){
            if (status == google.maps.GeocoderStatus.OK) {
                marker = new google.maps.Marker({
                    position: results[0].geometry.location,
                    map: map
                });
                markersArray[i] = marker;
                console.log(markersArray[i]);
                google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        infowindow.setContent(description);
                        infowindow.open(map, marker);
                    }
                })(marker, i));
            } else {
                alert("Geocode was not successful for the following reason: " + status);
                return false;
            }
        }
    );

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

    $.each(markersArray, function (index, marker) {
        bounds.extend(marker.position);
    });

    map.fitBounds(bounds);
    console.log(bounds);
}
var geocoder=new google.maps.geocoder();
var map=new google.maps.map(document.getElementById('map'){
//缩放:10,
//中心:新谷歌地图LatLng(-33.92151.25),
mapTypeId:google.maps.mapTypeId.ROADMAP
});
var邮政编码=[
“EH14 1PR”,
“KY7 4TP”,
“IV6 7UP”
];
变量说明=[
“斯莱特福德”,
“科塔奇”,
“玛丽班克”
];
var-markersArray=[];
var infowindow=new google.maps.infowindow();
变量标记,i,地址,描述;
对于(变量i=0;i
有什么想法吗?问题似乎在于geocode函数中计数器i的值

非常感谢任何帮助

两个问题:

1) 我的信息窗口,它应该从另一个数组中获取文本, 始终使用最后一个数组值

2) 我无法使地图自动居中。我用了一点水 在其他情况下有效的代码,但在我的 代码

答复:

1) 这是因为您很可能在这里遇到了问题。

2) “中心”将定义地图的中心点,但在代码中已对此进行了注释
//中心:新的google.maps.LatLng(-33.92151.25
), 删除此行的注释将以地图为中心,纬度为-33.92,经度为151.25。
使用方法如下:

var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 10,
  center: new google.maps.LatLng(-33.92, 151.25),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});
1) 我的信息窗口,它应该从另一个数组中获取文本, 始终使用最后一个数组值

2) 我无法使地图自动居中。我用了一点水 在其他情况下有效的代码,但在我的 代码

1) 是的,这是一个关闭问题。我就是这样绕过它的

我创建一个对象来存储我将要使用的所有属性。在您的示例中,我将使用
邮政编码
说明

function location(postalcode, desc){
  this.PostalCode = postalcode;
  this.Description = desc;
}
现在快速循环将所有
位置
对象添加到数组中

var locations = [];
for(var i = 0; i < postcodes.length; i++) {
     locations.push(new location(postcodes[i], descriptions[i]));
}
2) 正如您在上面所看到的那样,实现这一点的快速方法是扩展并适应地理代码回调函数内部的边界。这会导致多次调用
fitBounds
函数,如果只有几个标记,这并不是什么大问题,但如果有数百或数千个标记,则会导致问题。在这种情况下,正确的方法是创建一个异步循环函数。您可以在其中一个屏幕上看到它的示例


这是一个。

我尝试提取不同的阶段来分离函数,但运气不太好:(.而且,中心属性不需要(故意注释掉了),因为它自动居中。谢谢:)我自己通过提取各个部分(循环、地理代码、附加事件)来管理它)进入不同的功能,但我没有足够的代表回答我自己的问题之前8小时了!我将尝试您的边界计算解决方案,因为我无法使其工作。谢谢
function GeoCode(singleLocation){
     geocoder.geocode(
        {
            'address': singleLocation.PostalCode,
            'region' : 'uk'
        }, 
        function(results, status){
            if (status == google.maps.GeocoderStatus.OK) {
               var marker = new google.maps.Marker({
                    position: results[0].geometry.location,
                    map: map
                });

                //quick and dirty way
                bounds.extend(marker.position);
                map.fitBounds(bounds);                    

                markersArray[i] = marker;
                console.log(markersArray[i]);

                google.maps.event.addListener(marker, 'click', function() {
                        infowindow.setContent(singleLocation.Description);
                        infowindow.open(map, this); //this refers to the marker
                });

            } else {
                alert("Geocode was not successful for the following reason: " 
                      + status);
                return false;
            }
        }
    );
}