以下是链接:http://alchemist3d.com/maptest.html
另外我在循环中使用地理编码器来获取地址数组的坐标,这里是代码:
function initialize() {
var list = [
{location:"residencial punta del sol casa 6 temixco Morelos Mexico",body : " 1", title : "m 1"},
{location:"prol. harris num. 23 ampl. bugambilias jiutepec Morelos Mexico",body : "ampl. bugambilias 2", title : "f 2"},
{location:"Gladiola Satelite Cuernavaca Morelos Mexico",body:"Montes de Oca"}
];
var latlng = new google.maps.LatLng(18.92009,-99.20611);
var myOptions = {
zoom: 12,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
//map.fitBounds(getBounds());
codeLocations(list, map);
}
function codeLocations(list, map) {
for (var i = 0; i < list.length; i++) {
//console.log("Looping " + list[i].location);
var geocoder = new google.maps.Geocoder();
var geoOptions = {
address: list[i].location,
bounds: getBounds(),
region: "NO"
};
geocoder.geocode(geoOptions, createGeocodeCallback(list[i], map));
}
}
function createGeocodeCallback(item, map) {
//console.log("Generating geocode callback for " + item.location);
return function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
//console.log("Geocoding " + item.location + " OK");
addMarker(map, item, results[0].geometry.location);
} else {
//console.log("Geocode failed " + status);
}
}
}
function addMarker(map, item, location) {
//console.log("Setting marker for " + item.location + " (location: " + location + ")");
var marker = new google.maps.Marker({ map : map, position : location});
marker.setTitle(item.title);
var infowindow = new google.maps.InfoWindow( {
content : item.body,
size : new google.maps.Size(100, 300)
});
new google.maps.event.addListener(marker, "click", function() {
infowindow.open(map, marker);
});
}
function getBounds() {
var myOptions = {
zoom: 23,
center: new google.maps.LatLng(-33.9, 151.2),
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var southwest = new google.maps.LatLng(17.920,-100.206);
var northeast =new google.maps.LatLng(19.920,-104.206);
return new google.maps.LatLngBounds(southwest, northeast);
}
答案 0 :(得分:3)
是的,有一个速率限制,没有太多记录。每秒9-10个请求?如果检查错误状态,则称为OVER_QUERY_LIMIT。有100个标记,我不认为常用的等待技术对你有好处,因为你有很多标记。最好进行一次地理编码,保存LatLng并使用它们。
如果你很勇敢,你可以尝试:
setTimeout(function(){
geocoder.geocode(geoOptions, createGeocodeCallback(list[i], map));
}, 200*i);
我不知道为什么每个人都使用200毫秒,也许是因为试错?您可以尝试150或100.但是,在100 ms时,您需要10秒钟才能加载100个标记。我读到的另一个想法是批量查询。地理编码十,等,然后再十。
您可以尝试的另一项功能是sleep
。
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
答案 1 :(得分:1)
Lilina对速度限制是正确的,但是可以根据你是否犯规来改变比率。 200毫秒可能一直都很好,但另见this linked question,其中有一个变化速率的例子,开始的速度比那个快(实际上只减慢到150毫秒左右)。
重述的问题是完全与您的相同。