2

リンクは次のとおりです: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);
}
4

2 に答える 2

3

はい、レート制限がありますが、十分に文書化されていません。1秒あたり9〜10件のリクエスト?エラーステータスを確認すると、OVER_QUERY_LIMITと呼ばれます。マーカーが100個あるので、マーカーがたくさんあるので、一般的な待機テクニックではあまり効果がないと思います。一度ジオコーディングし、LatLngを保存して使用することをお勧めします。

勇気があるなら、次のことを試すことができます。

setTimeout(function(){
  geocoder.geocode(geoOptions, createGeocodeCallback(list[i], map));
}, 200*i);

試行錯誤のせいで、なぜ誰もが200ミリ秒を使用するのかわかりません。150または100を試すことができます。それでも、100ミリ秒で100個のマーカーをロードするのに10秒かかります。私が読んだもう1つのアイデアは、バッチでクエリを実行することです。ジオコーディング10、待ってから、さらに10。

試すことができる別の関数はですsleep

function sleep(milliSeconds) {
  var startTime = new Date().getTime();
  while (new Date().getTime() < startTime + milliSeconds);
}
于 2012-05-26T01:22:14.280 に答える
1

Lilinaはレート制限について正しいですが、ファウルするかどうかに応じてレートを変更することができます。200msは常に問題ない可能性がありますが、このリンクされた質問も参照してください。このリンクされた質問では、それよりも速く開始する(実際には約150msまでしか遅くならない)変動レートの例があります。

そこで述べられている問題は、あなたの問題とまったく同じです。

Google Map V3:一部のマーカーのみが表示されます

于 2012-05-26T09:12:05.343 に答える