Javascript 谷歌地图标记错误的位置

Javascript 谷歌地图标记错误的位置,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我在地图上有多个标记。但它不会将相应的信息窗口附加到标记上。它们总是在左上角。不知道这里有什么干扰 var geocoder=new google.maps.geocoder(); 变量地址=[ “Marienstr.37a 27472 Cuxhaven”, “Bahnhofsr.15 21745 Hemmoor”, “Richtpfad 20 26506 Norden”, “Eulenbusch 4 21391 Reppenstedt” ]; var bounds=new google.ma

我在地图上有多个标记。但它不会将相应的信息窗口附加到标记上。它们总是在左上角。不知道这里有什么干扰

var geocoder=new google.maps.geocoder();
变量地址=[
“Marienstr.37a 27472 Cuxhaven”,
“Bahnhofsr.15 21745 Hemmoor”,
“Richtpfad 20 26506 Norden”,
“Eulenbusch 4 21391 Reppenstedt”
];
var bounds=new google.maps.LatLngBounds();
var map=new google.maps.map(document.getElementById('map'){
mapTypeId:google.maps.mapTypeId.ROADMAP
});
var infowindow=new google.maps.infowindow(),marker,i;
对于(i=0;i
地理编码器是异步的。您的
for
循环在第一个地理编码请求得到响应之前结束。因此不能使用
i
,因为它总是
4
,而
地址[4]
不存在

无论如何,你不应该这样做,因为:

GoogleMapsAPI提供了一个geocoder类,用于根据用户输入动态地进行地理编码和反向地理编码。当您首次加载API时,将为您分配一个地理编码请求的初始配额。一旦您使用了此配额,附加请求将以每秒为单位进行速率限制。如果您希望对静态已知地址进行地理编码,请参阅地理编码web服务文档

如果对大量地址进行地理编码,尤其是在循环中(每秒限制),则可能会达到极限

在这里阅读更多信息:

它在这里失败了(正如MrUpsidown所观察到的)
infowindow.setContent(地址[i])因为当click listener运行i=4且地址[4]不存在时

解决问题的一种方法是对geocode函数和标记(如下)使用函数闭包。但正如Upsidown先生所观察到的,如果你有超过10个地址,它就不起作用了

function geocodeAddress(addresses, i) {
     geocoder.geocode( { 'address' : addresses[i]}, function(results, status) {
       if (status == google.maps.GeocoderStatus.OK) {
         // map.setCenter(results[0].geometry.location);
         marker = new google.maps.Marker({
             map: map,
             position: results[0].geometry.location
         });

         google.maps.event.addListener(marker, 'click', (function(marker, i) {
             return function() {
               infowindow.setContent(addresses[i]);
               infowindow.open(map, marker);
             };
         })(marker, i));

         bounds.extend(results[0].geometry.location);
         map.setCenter(bounds.getCenter());
         map.fitBounds(bounds);
       } else {
         alert("Geocode was not successful for the following reason: " + status);
       }
     });
}
工作代码段:

功能地理编码地址(地址,i){
geocoder.geocode({'address':地址[i]},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
//map.setCenter(结果[0].geometry.location);
marker=新的google.maps.marker({
地图:地图,
位置:结果[0]。几何体。位置
});
google.maps.event.addListener(标记,'click',(函数(标记,i){
返回函数(){
infowindow.setContent(地址[i]);
信息窗口。打开(地图、标记);
};
})(marker,i));
extend(结果[0].geometry.location);
map.setCenter(bounds.getCenter());
映射边界(bounds);
}否则{
警报(“地理编码因以下原因未成功:“+状态”);
}
});
}
var geocoder=new google.maps.geocoder();
变量地址=[
“Marienstr.37a 27472 Cuxhaven”,
“Bahnhofsr.15 21745 Hemmoor”,
“Richtpfad 20 26506 Norden”,
“Eulenbusch 4 21391 Reppenstedt”
];
var bounds=new google.maps.LatLngBounds();
var map=new google.maps.map(document.getElementById('map'){
mapTypeId:google.maps.mapTypeId.ROADMAP
});
var infowindow=new google.maps.infowindow(),marker,i;
对于(i=0;i

function geocodeAddress(addresses, i) {
     geocoder.geocode( { 'address' : addresses[i]}, function(results, status) {
       if (status == google.maps.GeocoderStatus.OK) {
         // map.setCenter(results[0].geometry.location);
         marker = new google.maps.Marker({
             map: map,
             position: results[0].geometry.location
         });

         google.maps.event.addListener(marker, 'click', (function(marker, i) {
             return function() {
               infowindow.setContent(addresses[i]);
               infowindow.open(map, marker);
             };
         })(marker, i));

         bounds.extend(results[0].geometry.location);
         map.setCenter(bounds.getCenter());
         map.fitBounds(bounds);
       } else {
         alert("Geocode was not successful for the following reason: " + status);
       }
     });
}