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);
}
});
}