質問

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 を使用) を使用する方法は見つかりませんでした。 地理Google 1 年以上古いようで、v2 を使用しています。

Java で実行できますか? 実行できる場合、どのように実行すればよいですか?

役に立ちましたか?

解決

レート制限の提出のいくつかの並べ替えを実装するための最善の策は、タイマーオブジェクトおよびキューを使用することです。タイマーが終了し、その後無期限に実行(jQueryのは、いくつかの非常に素晴らしいタイマーの実装を持っている)、そのタイマーのボディに、あなたがキューから何かをポップし、それを提出してする固定金利で予定されています。必要に応じて他のコードは、そのキューに物事を追加します。

他のヒント

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

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

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

ここでは、基本的には、それが再び試みる、私のスクリプトからの抜粋であることが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帰属
所属していません StackOverflow
scroll top