4

Google Maps API v3 ジオコーダ サービスにジオコード リクエストを送信する速度を制限する良い方法を見つけようとしています。Javascript にはいいところがないこと、waitまたはsleepその実行が当面シングルスレッドであるためであることは知っています。

各ジオコーダー リクエストは、jQueryeach関数内で送信されます。したがって、一般的なコードの骨組みは次のとおりです。

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

への各呼び出しの間に待機する固定間隔を設定するにはどうすればよいgeocodeですか? Javascript が実行されるのと同じ速さで各リクエストを送信すると、OVER_QUERY_LIMIT20 件のリクエストしか送信していない場合でも、すぐに応答を受信し始めます。これは予想されることであり、クライアントが Google のサービスとうまく連携できるようにしようとしています。


私が追求したいと考えている別の方法は、ジオコーディングのために Javascript を完全に放棄し、すべてを Java で記述することです。Java を使用すると、リクエスト間でスリープするのは非常に簡単です。

しかし、Java で Google のジオコーディング サービスを (具体的には、バージョン 3 の API を使用して) 使用する方法が見つかりませんでした。GeoGoogleは 1 年以上古いようで、v2 を使用しています。

Javaでそれを行うことはできますか?

4

4 に答える 4

4

Google は、Maps API の v2 と v3 を別々に積極的に開発しています。v3 は、処理能力が制限されているデバイスや基本的なマッピング タスクに適した、はるかにスリムなバージョンです (動作に API キーは必要ありません)。

どちらの場合でも、多くのものをジオコーディングしている場合は、おそらく Google の HTTP ジオコーディング サービス ( http://code.google.com/apis/maps/documentation/geocoding/index.html ) を使用して調べる必要があります。これにより、レート制限の問題が回避されます。

fwiw: Javascript は、setInterval() と setTimeout() を使用して基本的なスリープ/待機操作を実行できます。リクエストを起動してタイマーをリセットするだけで、コールバック処理の最後にもう一度実行できます。

于 2009-09-21T19:16:12.403 に答える
2

http://rizsharif.blogspot.com/2010/10/recursion-settimeout-to-simulate-pause.html

于 2010-10-09T15:37:07.867 に答える
2

ある種のレート制限された送信を実装するための最善の策は、タイマー オブジェクトとキューを使用することです。タイマーは固定レートで無期限に実行されるようにスケジュールされており (jQuery には非常に優れたタイマーの実装がいくつかあります)、そのタイマーの本体で、何かをキューから取り出して送信し、終了します。他のコードは、必要に応じてそのキューに何かを追加します。

于 2009-09-21T19:19:36.203 に答える
1

これが私のスクリプトのスニペットです。基本的に、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');
        }
    });
于 2011-03-24T16:02:56.850 に答える