2012-08-09 73 views
0

我想對地址解析超過1,000個地址並將值存儲在XML文件中。問題是我在第十個地址後收到OVER_QUERY_LIMIT錯誤。 我已經看到其他帖子提示每個地理編碼之間等待X秒,但這似乎不適用於我。下面是一段我的代碼:地址解析結束查詢限制解決方法

<div id="locations"></div> 
$(xml).find('marker').each(function (i) 
{ 
    var storeName = $(this).attr('name'); 
    var address = $(this).attr('address'); 

    setTimeout(function(){ 
     g.geocode(address, function(data) 
     { 
      if(data != null) 
      { 
       olat = data.latitude; 
       olng = data.longitude; 

       var marker = "<marker name='" + storeName + "' lat='" + olat + "' lng='" + olng + "' />"; 

       $('#locations').append(marker); 
      } 
      else 
      {    
        //Unable to geocode 
        alert('ERROR! Unable to geocode address');     
      } 
     }); 
    }, 1000); 
}); 
+0

可能重複的[我如何Geocode 20地址沒有收到OVER_QUERY_LIMIT響應?](http://stackoverflow.com/questions/2419219/how-do-i-geocode-20-addresses-without-receiving-an -over-query-limit-response) – 2012-08-10 16:42:14

回答

3

一記約Google's Terms of Service

很容易沒有想到這樣的東西,但它事有時做。除非您想加入this group from earlier today由於某些原因禁用了其服務,否則請確保在您對這些地址進行地理編碼時向用戶顯示地圖。 TOS還禁止批量地理編碼並將結果存儲在性能緩存以外的任何地方。

不要指責!只是引起注意。


程序員答案:

setTimeout的回調和geocode都是異步函數。現在使用你的代碼,雖然響應仍然從API返回,但你正在啓動你的1秒定時器,它也異步運行,而你的循環會立即繼續迭代,不會有任何延遲。一秒後,無操作被調用一次然後丟棄。每次循環運行時都會發生這種情況。

因此,您一次拍攝了1000個API請求。然後大約1秒鐘後(需要或幾毫秒),將有1000個無操作運行。

您對g.geocode的調用需要在setTimeout的回調函數中,然後回調函數的結尾需要在其內部設置另一個超時,直到完成爲止。沒有更多的沒有操作。

如果你想更準確的「工作圍繞」 OVER_QUERY_LIMIT錯誤和其他TOS限制(如地理編碼集體),你要考慮商業服務,沒有這樣的限制,像LiveAddress (披露:我在SmartyStreets工作)。

+0

嗨馬特。感謝您的提醒。我試圖建立一個商店定位器,所以Google的服務條款不應該有任何問題。我試着按照你的建議,但它仍然不起作用。我使用這些更改更新了上面的代碼。 – Gonzalo 2012-08-09 01:22:29

+0

同時對一千個以上的地址進行地理編碼?聽起來有點像我,但我想這不是由我來決定的。希望你會發現比其他人更多的財富!無論如何,你的代碼不工作,因爲'each'仍然沒有延遲地迭代。仔細檢查setTimeout的回調函數開始下一次迭代的部分;不要讓每個人都遠離你。 – Matt 2012-08-09 01:27:02

+0

馬特,感謝您的快速響應。是的,我打算將座標保存在xml中,以便我可以在用戶位置附近顯示商店。這不僅僅是爲了能夠在地圖上的特定位置放置標記,而是要顯示最近的商店。關於代碼,你在那裏失去了我。將每一個放在setTimeout裏面都會一次拍攝1,000個API請求,一旦完成,no-op將會運行...對嗎? – Gonzalo 2012-08-09 01:43:43