1

1,000 を超える住所をジオコーディングし、その値を XML ファイルに保存しようとしています。問題は、10 番目のアドレスの後に 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);
});
4

1 に答える 1

3

最初に、Google の利用規約に関するメモ

このようなことを考えないのは簡単ですが、時にはそれが問題になることもあります。なんらかの理由でサービスが無効になっているこのグループに今日から参加したい場合を除き、これらの住所をジオコーディングするときにユーザーに地図を表示していることを確認してください。また、TOS は、一括ジオコーディングと、パフォーマンス キャッシング以外の目的での結果の保存を禁止しています。

非難しない!注意を引くだけです。


プログラマーの答え:

setTimeoutの callback とgeocodeはどちらも非同期関数です。現在、あなたのコードでは、応答がまだ API から返されている間に、1 秒のタイマーを開始していますが、これも非同期で実行されますが、ループは遅延なくすぐに反復し続けます。1 秒後、no-op が 1 回呼び出されて破棄されます。これは、ループが実行されるたびに発生します。

つまり、一度に 1,000 の API リクエストを送信することになります。それから約 1 秒後 (数ミリ秒かかるかどうかに関係なく)、1,000 回の no-ops が実行されます。

への呼び出しg.geocodeは のコールバック関数内にある必要があり、コールバック関数setTimeoutの最後は、完了するまで、その内部で別のタイムアウトを設定する必要があります。もうノーオペレーションはありません。

OVER_QUERY_LIMITエラーやその他の TOS 制限 (geocoding en masseなど)をより正確に「回避」したい場合は、 LiveAddressのような制限のない商用サービスを検討することをお勧めします(開示: 私は SmartyStreets で働いています)。 )。

于 2012-08-09T00:47:54.050 に答える