Googleマップのジオコード制限を回避しますか?


32

cmsを介して125個のマーカーがプロットされたカスタムgoogleマップを作成しています。マップをロードすると、次のメッセージが表示されます。

次の理由によりジオコードが成功しませんでした:OVER_QUERY_LIMIT

マーカーをジオコーディングした方法だと確信しています。

これらの警告を回避するにはどうすればよいですか?結果をジオコーディングするより効率的な方法はありますか?

更新:これは、ケーシーの答えに対する私の試みです。現在、空白のページが表示されています。

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script> 

マーカーが即座に読み込まれ、契約条件に違反しない限り、ソリューションが何であるかは実際には関係ありません。


これらのルックアップを行う理由または頻度を言ってはいけません。あなたは、ページのレンダリングごとに同じポイントをジオコーディングしようとしていませんか?その場合、APIを使用してこれらの検索をサーバー側で1回だけ実行することを検討する必要があります(最初に場所がデータベースに追加されるとき)。
ピーター

@Peter のアドバイスを試してみたい場合は、Googleスプレッドシートのポイントをジオコーディングする簡単なツールがここにあります。これにより、都市の緯度/経度をCMSに書き込むことができるため、実行時にジオコーダーを使用する必要がなくなります。
スティーブンリード

@Peter実際、それは素晴らしいアイデアのように聞こえます。cmsの使いやすさが低下するので、私は少し破れています。クライアントが住所を入力するだけでなく、会社ごとに緯度/経度を調べる必要がある場合、ユーザーフレンドリーではありません。私はそれを正しく理解していますか?
ロブ

php関数については、私の新しい回答をご覧ください。
ピーター

2
@rob FWIW Ragiには適切なアプローチがあると思います。ケイシーの答えはまだあなたがすべての点をジオコードする必要があり、あなたの静的なデータセットのために必要であるようには見えないマップを描くたびに、
スティーブンは鉛

回答:


57

他のすべての人と同じように、コードで答えを出すことができますが、根本的に間違っていることをしていると誰かがあなたに説明したとは思いません。

このエラーが発生するのはなぜですか?誰かがページを表示するたびにジオコードを呼び出しているため、dbのどこにも結果をキャッシュしないためです!

制限が存在する理由は、Googleのリソースからの悪用を(意図的かどうかに関係なく)防ぐためです。これがまさにあなたがしていることです:)

グーグルのジオコードは高速ですが、誰もがこのように使用すると、サーバーがダウンします。Google Fusion Tablesが存在する理由は、サーバー側の多くの負荷を軽減するためです。ジオコーディングとタイルキャッシングは、サーバーで実行されます。それを使用したくない場合は、サーバーにキャッシュする必要があります。

それでも1日2500件のリクエストが少なすぎる場合、Google Maps Premier(有料)ライセンスを見て、1年に1万件程度のジオコーディングリクエストを1日あたり10万件提供する必要があります巨大なサイトであるか、大量のデータ処理を行っている場合を除き、この制限に達していない)。サーバー側のキャッシュなしで現在のアプローチを使用すると、1日あたり800ページビューしか実行できません。

他のプロバイダーがジオコードごとに課金することを理解すると、結果をデータベースにキャッシュする必要があることを理解できます。このアプローチでは、1ページの表示あたり約10米セントかかります。

あなたの質問は、Googleが提供するスロットル制限を回避できますか?はい。異なるIPアドレスからリクエストを行うだけです。ちなみに、Amazon Elastic IPを介して呼び出しをプロキシでき、常に新しい2500の割り当てられた呼び出しができます。しかし、もちろん、違法であることに加えて(Googleマップの利用規約によって与えられた制限を事実上回避しています)、システムに内在する固有の設計上の欠陥をカバーするためにハックを行うことになります。

それで、そのユースケースのための正しい方法は何ですか?GoogleジオコードAPIを呼び出す前に、サーバーに送信し、キャッシュにあるかどうかを照会します。そうでない場合は、ジオコードを呼び出してキャッシュに保存し、結果を返します。

他のアプローチもありますが、これにより正しい方向に進むことができます。

更新:以下のコメントから、PHPを使用していると言われているため、正しく実行する方法のサンプルコードを示します(Googleチーム自体からの推奨)https://developers.google.com/maps/articles/phpsqlsearch_v3


サーバーなどに送信する例がありますか?
ロブ

バックエンドCMSは何ですか?(私はあなたがそれをどのように変えることができる/知っていると仮定し、あなたの選択した言語でそれを行う方法を示す簡単な例が欲しいだけです。あなたはクライアントサイドjsの例を必要としませんか?あなたはjsを使用していますか? jqueryのようなフレームワーク?
Ragi Yaser Burhum

また、あなたはマーカーデータが最初の場所でお使いのシステムに取得する方法についての詳細コンテキストを与える必要があります
Ragi Yaser Burhum

1
OK。Phpその後。Googleのドキュメントからこのビットは、MySQLとPHPの一部含まれている必要がありcode.google.com/apis/maps/articles/phpsqlgeocode.html
Ragi Yaser Burhum

1
許可されるキャッシュの種類の詳細については、10.1.3(b)を参照してください。developers.google.com/maps/terms#section_10_12
ポールラムジー

14

両方の点で、Sは正しいと思います。

すべてのアドレスを一度に送信するという点では、1つのオプションは要求を間隔を置いて送信することです。過去にJavaScriptを使用する場合、リクエストを0.25秒(動作しているようです!)遅らせることを選択しました。

setTimeout( [FUNCTION CALL] , 250 )

方法。

.NETでは、以下を選択しました。

System.Threading.Thread.Sleep(250);

動作しているようです。

編集:カントは本当にそれをテストしますが、これは動作するはずです/動作するかもしれません!

Javascriptの例。addressArrayはアドレスである文字列を保持しています...

for (var i = 0; i < addressArray.length; i++0 
{

setTimeout('googleGeocodingFunction(' + addressArray[i] + ')' , 250);

}

編集:

for (var i = 0; i < address.length; i++) {
    function(i) {
        setTimeout(geocoder.geocode({ 'address': address[i] }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                var marker = new google.maps.Marker({ position: places[i], map: map });
                markers.push(marker);
                mc.addMarker(marker);
                google.maps.event.addListener(marker, 'click', function() {
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with all coordinates 
                bounds.extend(places[i]);

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds)
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        }), 250);// End of setTimeOut Function - 250 being a quarter of a second. 
    } 
}

返信いただきありがとうございます。どうすればそれをコードに入れることができますか。これは少し新しいので、手で持っておく必要があります。あなたは私のソースコードを見ることができるはずです。
ロブ

どのビット?どの言語を使用していますか?
CatchingMonkey

私はJavaScriptを使用していますが、どのように間隔を設定できますか?
ロブ

私の答えを編集しました。
CatchingMonkey

また、私はsetTimeout()を意味しました...ありがとうケーシー。
CatchingMonkey

9

Googleによって課せられた同時リクエストの制限に達しているように思えます(ただし、実際に制限が何であるかについての参照は見つかりません)。125のリクエストを一度に送信しないように、リクエストの間隔を空ける必要があります。1日あたり2500件のジオコードリクエストもあります。

詳細については、Google Geocoding Strategiesドキュメントをご覧ください。

更新: Mapperzの投稿のおかげでインスピレーションを得た追加ソリューションとして、新しいGoogle Fusion Tableを作成し、住所と関連データをテーブルに保存し、Webインターフェイスを介してテーブルをジオコーディングすることを検討できます。Fusion Tableが行うジオコードリクエストの数には制限がありますが、その制限は非常に大きくなります。制限に達すると、ジオコードリクエストを再送信する必要があり、Fusion Tablesは中断したところから再開します。ONCEをジオコーディングするだけで、このアプローチのボーナスは大幅に速度が向上します。現在のソリューションでは、すべての負荷でジオコーディングする必要があり、すぐに1日の制限に達します。


限界に近づいていると思ったので、私はこれが初めてなので、助けとなるコード例が必要だと思います。
ロブ

私はGoogle Fusion Tablesを調べてきましたが、いくつかの問題に遭遇しました。1.テーブルで住所を手動でジオコードする必要があります(ファイル->ジオコードを使用)。これは自動的に実行できますか?2.一部のマーカーは特定のズームレベルでのみ表示されますが、他のマーカーはズームレベルに関係なく表示されます。これは例です-mediwales.com/mapping/example。最終的にやりたいのは、Wordpressデータ(つまり、すべての会社の住所)をフュージョンテーブルにエクスポートし、それらを自動的にジオコーディングしてから、すべてのジオコーディングされた住所を取得し、即座にマップをプロットすることです。
ロブ

7

javascriptでジオコードリクエストをスロットルする方法は次のとおりです。アドレスは、ジオコードする各アドレスを含む配列です。

for (i=0;i<=addresses.length;i++) {
    setTimeout( function () {
            geocoder.geocode( { 'address': addresses[i]}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) { 

                    //create and add marker to map based off geocode result
                    var marker = new google.maps.Marker({  
                        map: map,
                        title: results[0].formatted_address,
                        position: results[0].geometry.location
                    });

                 } //EDIT, was missing the closing bracket here
            });

    }, i * 1500);
}

これにより、各ジオコーディングリクエストの間に2番目の半分が追加されます。


答えてくれてありがとう。コードに統合しようとすると空白のページが表示され続ける-mediwales / mapping
Rob

エラーを指摘できるデバッグツールを使用していますか?そうでない場合は、FireFoxプラグインのfirebugを使用してみてください。このような状況では非常に便利です。
ケーシー

私は違います。コードを適切な場所に配置したかどうか確信が持てません。その試みで質問を更新します。
ロブ

コードサンプルに閉じ括弧がありませんでした。回答を編集し、コメント付きで追加しました。ただし、これはサンプルコードの問題ではなかったようです。空白のページまたは空白のマップを取得していますか?空白ページは、javascriptコードに構文エラーがあることを示します。空のマップ(マーカーなし)は、ジオコーディングコードに問題があることを示します。
ケーシー

1
こんにちは。私はあなたの答えにもう一度行きました。遅延は現在機能していますが、マーカーをプロットできません。私のコードから、これらはマーカーをプロットする重要なビットです-(function(i){and})(i); それらがないと、遅延を追加しなくてもプロットされません。
ロブ

5

私は今のページを試してみましたが、それが動作しているようだ、今

あなたが現在使用しているタイマーアプローチは正しいと思いますが、サーバー側のサポートを必要とせずに動作する唯一の方法を知っている限り、次の変更を提案する必要があります(ジオコーディング関数を書き直す自由を取りました)localStorageを利用します

LocalStorageは、ほとんどのブラウザに組み込まれている比較的新しいテクノロジーであり、Webページがクライアントにデータを保存できるようにします。これはCookieに多少似ていますが、はるかに強力であり、常に(Cookieとは異なり)サーバーに再送信されるわけではありません。

私の目的は、ユーザーがページを更新した場合、Googleのジオコーダー機能を再度呼び出す必要がないように、ジオコーディングされた住所をクライアントに保存することです。以下の実装は粗雑です(古いレコードをチェックするコードを追加する必要があり、おそらくインデックスよりも優れたキャッシュキーが必要です)が、開始するには十分なはずです。それが役に立てば幸い。

(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 0, maxZoom: 0, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
var popup_content = [..redacted..];

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city 
function geocodeAddress(i) {
     // check if localStorage is available (it is now available on most modern browsers)
     // http://html5tutorial.net/tutorials/working-with-html5-localstorage.html
     // NB: this *must* be improved to handle quota limits, age/freshness, etc
     if(localStorage && localStorage['address_'+i]) {
        places[i]=JSON.parse(localStorage['address_'+i]);
        addPlace(i);
     } else {
      geocoder.geocode( {'address': address[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            places[i] = results[0].geometry.location;
            if(localStorage) {
               // cache result locally on the browser, this will help reducing the number of requests
               // to the google geocoder in case the user refreshes the page
               // remember: the more he will refresh, the more he's likely to hit the limit
               // (this is one case where refreshing or closing the browser does not work)
               localStorage['address_'+i]=JSON.stringify(results[0].geometry.location);
            }

            addPlace(i);
        } else { 
            console.log("Geocoding of address "+address[i]+" failed");
        }
    })
}

function addPlace(i) {
    // Adding the markers 
    var marker = new google.maps.Marker({position: places[i], map: map});
    markers.push(marker);
    mc.addMarker(marker);

    // Creating the event listener. It now has access to the values of i and marker as they were during its creation
    google.maps.event.addListener(marker, 'click', function() {
        // Check to see if we already have an InfoWindow
        if (!infowindow) {
            infowindow = new google.maps.InfoWindow();
        }

        // Setting the content of the InfoWindow
        infowindow.setContent(popup_content[i]);

        // Tying the InfoWindow to the marker 
        infowindow.open(map, marker);
    });

    // Extending the bounds object with each LatLng 
    bounds.extend(places[i]); 

    // Adjusting the map to new bounding box 
    map.fitBounds(bounds);
}

function geocode() {
    if (geoIndex < address.length) {
        geocodeAddress(geoIndex);
        ++geoIndex;
    }
    else {
        clearInterval(geoTimer);
    }
}
var geoIndex = 0;
var geoTimer = setInterval(geocode, 600);  // 200 milliseconds (to try out)

var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 

どうもありがとう。他の何かを試してみてください。しかし、すぐにこれを試してみます。良いアイデアのように聞こえます。
ロブ・

試してみたところ(以前の状態に戻った)、最初に機能した後、更新すると空白のページが表示された。
ロブ

今すぐ試してください、エラーが発生しました。また、popup_content変数は簡潔にするために編集されていることに注意してください。
ユニコレッティ

3

geopyジオコーダーを使用すると、問題なく多数の住所をジオコーディングできます(ポスターのセットアップがわからないか、プロジェクトにPythonの依存関係を含めることができるかどうか)

ここに私のテストがあります:

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

結果スニペット

7595(u'Av。Jo \ xe3o Naves de \ xc1vila、7595-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-288、Brazil '、(-18.9388154、-48.2220562))

7596(u'Av。Jo \ xe3o Naves de \ xc1vila、7596-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-680、Brazil '、(-18.938814、-48.2217423))

7597(u'Av。Jo \ xe3o Naves de \ xc1vila、7597-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-288、Brazil '、(-18.9388128、-48.2220381))

7598(u'Av。Jo \ xe3o Naves de \ xc1vila、7598-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-680、Brazil '、(-18.9388114、-48.2217242))

7599(u'Av。Jo \ xe3o Naves de \ xc1vila、7599-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-288、Brazil '、(-18.9388102、-48.2220201))

7600(u'Av。Jo \ xe3o Naves de \ xc1vila、7600-Segismundo Pereira、Uberl \ xe2ndia-Minas Gerais、38408-680、Brazil '、(-18.9388088、-48.2217062))

これはまだ実行中であり、7kの結果が得られています。

編集:しばらくして、私は通りの端に当たり、グーグルは私に同じポイントを与え始めましたが、それはまだリクエストをしていて、私に正確な答えを与えているようです。


Geopyは魔法ではなく、使用上の制約が適用されます。
alphabetasoup

1

このphp関数(どの言語で作業しているかわかりませんが、確かに別の言語を選択できます)はgoogle geolocator apiを使用します。住所を指定すると、正規化された住所と緯度経度が返されます。HTH。

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}    

返信いただきありがとうございます。これをどのようにコードに組み込むのでしょうか?
ロブ

申し訳ありませんが、サイトをコーディングしていると思われます。その関数は、たとえばユーザー入力アドレスを取得し、Google Geocoder APIを使用して座標を取得するサーバー側スクリプトの一部として使用されます。その後、これらの座標をデータベースに配置し、マップを作成する必要がある場合は、座標を照会してマーカー付きのマップを作成するだけです。そうすれば、説明どおりにページレンダリングごとにジオコーダーを乱用することはありません。(私のコメントをおろそかにしましたか?私は助けようとしていますが、私を罰することはあまり私を励ましません)。また、APIではgmapで使用する必要があることを忘れてしまいました。
ピーター

1

クエリが表示されました。次のコードを試すことができます。ジオコードステータスチェックelse部分で、失われた住所の時間ギャップを使用して同じ関数を再帰的に呼び出します。

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }

0

ここに私の解決策があります:

依存関係:Gmaps.js、jQuery

var Maps = function($) {
   var lost_addresses = [],
       geocode_count  = 0;

   var addMarker = function() { console.log('Marker Added!') };

   return {
     getGecodeFor: function(addresses) {
        var latlng;
        lost_addresses = [];
        for(i=0;i<addresses.length;i++) {
          GMaps.geocode({
            address: addresses[i],
            callback: function(response, status) {
              if(status == google.maps.GeocoderStatus.OK) {
                addMarker();
              } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                lost_addresses.push(addresses[i]);
              }

               geocode_count++;
               // notify listeners when the geocode is done
               if(geocode_count == addresses.length) {
                 $.event.trigger({ type: 'done:geocoder' });
               }
            }
          });
        }
     },
     processLostAddresses: function() {
       if(lost_addresses.length > 0) {
         this.getGeocodeFor(lost_addresses);
       }
     }
   };
}(jQuery);

Maps.getGeocodeFor(address);

// listen to done:geocode event and process the lost addresses after 1.5s
$(document).on('done:geocode', function() {
  setTimeout(function() {
    Maps.processLostAddresses();
  }, 1500);
});

0

Googleマップのジオコード制限を避けることはできません。LatLng情報を取得して保存する必要があります。

複数の都市があり、LatLngを手動で取得したくない場合、タイムアウトを使用してgeocoder.geocodeを進行的に呼び出し、javascriptオブジェクト内に情報を保存console.log(JSON.stringify(object, null, 4));してから、コンソールでかなり印刷されたオブジェクトを取得することができます。例

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

今あなたが使用してマーカーを追加することができますlocationsPosition["Johannesburg - ZA"].latし、.lng


-1

次の2つのいずれかを行う必要があるようです。

  1. 1日あたりの固有の数がそれほど多くない場合は、結果をキャッシュするようにプロセスを変更します。または
  2. 1日にもっと処理できるサービスにアップグレードする

人々が何度も言及しているが、個人的な経験はないので、1日あたり10万ドルのGoogleライセンスは年間約1万ドルと思われる。

同じレベルまたはそれ以上の精度(およびその価格を支払う必要がない)が必要な場合は、当社のサービスを試すことができます。Googleよりはるかに少ない(ほぼ10分の1のコスト)場合、2500をはるかに超える制限(1日あたり25kの最小制限)を取得できます。

もちろん、私たちの有料ジオコーディングAPIを使用することは、100%正直であることをお勧めするソリューションではありません。代わりに、オプション1を使用して、サービスを最適化してキャッシュすることをお勧めします。1日あたり2500個を超える一意のジオコードが必要な場合を除きます。

免責事項:私はGeocode Farm(私が推奨しているサービス)で働いています。


なぜこれがダウン投票されたのですか?ここにあるものが不正確または不正確な場所を見ていませんか?
Geocode.Farmスタッフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.