簡體   English   中英

Google Maps API v3提供了更多批量地理編碼問題

[英]More batch geocoding questions with the Google Maps API v3

我正試圖找出一種很好的方法來限制我向Google Maps API v3地理編碼器服務發送地理編碼請求的速率。 我知道Javascript沒有任何好的waitsleep因為它的執行暫時是單線程的。

每個地理編碼器請求都是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM