Javascript Google地图,只显示100个标记中的10个。是否有限制?

时间:2012-05-26 00:53:47

标签: javascript google-maps-api-3 geocoding

以下是链接: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);
}

2 个答案:

答案 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毫秒左右)。

重述的问题是完全与您的相同。

Google Map V3 : Only some markers are displayed