[英]More batch geocoding questions with the Google Maps API v3
我正試圖找出一種很好的方法來限制我向Google Maps API v3地理編碼器服務發送地理編碼請求的速率。 我知道Javascript沒有任何好的wait
或sleep
因為它的執行暫時是單線程的。
每個地理編碼器請求都是在jQuery的each
函數內發送的。 所以,通用代碼框架是:
$(xml).find('foo').each(function(){
// do stuff
...
geocoder.geocode(request, function(results, status) {/* do other stuff */});
// do more stuff
...
}
如何設置固定間隔以在每次geocode
調用之間等待? 如果我以Javascript運行的速度發送每個請求,那么我很快就會開始接收OVER_QUERY_LIMIT
響應 - 即使我只發送了20個請求。 這是預期的,我正在嘗試讓我的客戶端與Google的服務很好地協作。
我願意采用的另一種方法是完全放棄Javascript進行地理編碼,並用Java編寫。 使用Java,在請求之間睡眠非常容易。
但是,我找不到在Java中使用Google的地理編碼服務(特別是使用API的第3版)的方法。 GeoGoogle似乎已經過時了一年多,並且使用了v2。
它可以用Java完成,如果是這樣,怎么做?
Google正在積極開發Maps API的v2和v3。 v3是一個更纖薄的版本,適用於處理能力有限或基本映射任務的設備(並且不需要API密鑰才能工作)。
在任何一種情況下,如果您要對許多內容進行地理編碼,您應該考慮使用Google的HTTP地理編碼服務( http://code.google.com/apis/maps/documentation/geocoding/index.html )。 這將避免速率限制問題。
並且fwiw:Javascript可以使用setInterval()和setTimeout()進行基本的睡眠/等待操作。 只需觸發請求並重置計時器,以便在回調處理結束時再次執行此操作。
實現某種速率限制提交的最佳選擇是使用計時器對象和隊列。 計時器按固定速率安排無限期運行(jQuery有一些非常好的計時器實現),並且在該計時器的主體中,你從隊列中彈出一些東西然后提交它然后完成。 您可以根據需要將其他代碼添加到該隊列中。
這是我的腳本中的一個片段,基本上如果它點擊google.maps.GeocoderStatus.OVER_QUERY_LIMIT它會再次嘗試
function(results, status) {
// If the limit is reached try again in a second
if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
window.setTimeout(
function() {self.resolveAddress(addr);},1000
);
} else if (status == google.maps.GeocoderStatus.OK) {
// Do something clever
} else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
self.reduce(addr); // Try removing something from addr
} else {
atira.log('Something terrible happened');
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.