ジオコーディング時の割り当ての最適な使い方

ジオコーディングとは、住所(「1600 Amphitheatre Parkway, Mountain View, CA」)を地理座標(37.423021、-122.083739)に変換する処理のことをいいます。地理座標を使用して、マーカーを配置したり、地図の位置決めを行ったりできます。Google Maps Platform API には、ジオコーディングの 2 つの方法が用意されています。

  • クライアント側ジオコーディング。ブラウザで実行されるため、通常はユーザーの操作に応答します。Maps JavaScript API には、リクエストを行うクラスが用意されています。このアプローチについては、Maps JavaScript API のドキュメントをご覧ください。
  • HTTP サーバーサイド ジオコーディング。サーバーで Google のサーバーに対して直接ジオコーディングのクエリを実行できます。Geocoding API は、この機能を提供するウェブサービスです。通常、このサービスは、サーバー側で実行されている他のコードと統合します。サーバー側のジオコーディングについては、Geocoding API のドキュメントをご覧ください。

クライアント側およびサーバー側のジオコーディングの例

次のサンプルのクライアント側ジオコーディングでは、住所を取得してジオコーディングし、地図の中心をその場所に移動して、そこに地図上のマーカーを追加します。

geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
    map.setCenter(results[0].geometry.location);
    var marker = new google.maps.Marker({
      map: map,
      position: results[0].geometry.location
    });
  }
});

その他の例については、Maps JavaScript API のドキュメントをご覧ください。

Python を使用してサーバーサイドのジオコーディング リクエストを実行する例を次に示します。

import urllib2

address="1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key="my-key-here"
url="https://maps.googleapis.com/maps/api/geocode/json?address=%s&key=%s" % (address, key)

response = urllib2.urlopen(url)

jsongeocode = response.read()

これにより、次のコンテンツを含む JSON オブジェクトが生成されます。

{
  "status": "OK",
  "results": [ {
    "types": street_address,
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components": [ {
      "long_name": "1600",
      "short_name": "1600",
      "types": street_number
    }, {
      "long_name": "Amphitheatre Pkwy",
      "short_name": "Amphitheatre Pkwy",
      "types": route
    }, {
      "long_name": "Mountain View",
      "short_name": "Mountain View",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "San Jose",
      "short_name": "San Jose",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Santa Clara",
      "short_name": "Santa Clara",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "California",
      "short_name": "CA",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "94043",
      "short_name": "94043",
      "types": postal_code
    } ],
    "geometry": {
      "location": {
        "lat": 37.4220323,
        "lng": -122.0845109
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188847,
          "lng": -122.0876585
        },
        "northeast": {
          "lat": 37.4251799,
          "lng": -122.0813633
        }
      }
    }
  } ]
}

サーバー側ジオコーダには、JSON の代わりに XML 形式も用意されています。その他の例については、Geocoding API のドキュメントと、Python とその他の言語のクライアント ライブラリをご覧ください。

割り当てと費用に関する考慮事項

このドキュメントで説明する戦略は、ジオコーディングの費用、割り当て、レート制限によって決まります。

コスト

1 日あたりの割り当て(QPD)の上限は、ジオコーディング リクエストには使用されなくなりました。そうするのではなく、各ジオコーディング リクエストが、クライアント側(ブラウザ経由)またはサーバー側(Geocoding API ウェブサービス)のいずれであっても、各料金で課金されます。費用を管理するには、1 日の割り当ての上限を検討してください。

レート制限

ジオコーディング サービスは、クライアント側とサーバー側の合計クエリとして 3,000 QPM(1 分あたりのクエリ)に制限されます。

モバイルアプリなど、クライアント側のジオコーディング リクエストを定期的に実行する場合、すべてのユーザーが同時にリクエストを行うと(たとえば、毎分同じ時間にすべて)、エラーが返されることがあります。これを回避するには、次のいずれかを検討してください。

  • リクエストにランダムな間隔(ジッター)を導入します。ユーザーベース全体でリクエストがランダムであることを確認します。
  • Android 向けの開発では、不正確な繰り返しアラームを使用します。
  • Android 向けの開発を行う場合は、適切なロケーション戦略を選択します。

キャッシュ

キャッシュについては、 Geocoding API ポリシーをご覧ください。

クライアント側のジオコーディングはいつ使用するか

正解は「ほぼ常に」です。その理由は次のとおりです。

  • クライアント側のリクエストとレスポンスにより、高速でインタラクティブなエクスペリエンスが実現されます。
  • クライアント側のリクエストには、ユーザーの言語、地域、ビューポートといったジオコーディング品質を向上させる情報を含めることができます。

特に、ユーザーの入力に基づいて住所をジオコーディングする場合は、クライアント側のジオコーディングが最適です。

クライアント側のジオコーディングには、次の 2 つの基本アーキテクチャがあります。

  • ジオコーディングと表示は完全にブラウザ内で行います。たとえば、ユーザーがページ上の住所を入力すると、アプリケーションがこれをジオコーディングします。次に、ページではジオコーディングを使用して地図上のマーカーを作成します。または、ジオコードを使用して、アプリで簡単な分析を行います。データがサーバーに送信されることはありません。 この方法により、サーバーの負荷を軽減できます。
  • ブラウザでジオコーディングを行ってから、サーバーに送信します。たとえば、ユーザーがページ上の住所を入力すると、アプリケーションがブラウザでジオコーディングします。その後、アプリがサーバーにデータを送信します。サーバーは周辺のスポットなどのデータを返します。これにより、独自のデータに基づいてレスポンスをカスタマイズできます。

サーバー側のジオコーディングはいつ使用するか

サーバー側のジオコーディングは、クライアントからの入力なしで住所をジオコーディングする必要があるアプリケーションに最適です。一般的な例としては、ジオコーディングを必要とする固定された有限かつ既知のアドレスセットがある場合など、ユーザー入力から独立してデータセットを取得する場合があります。クライアント側のジオコーディングは、クライアント側のジオコーディングが失敗した場合のバックアップとしても使用できます。

ユーザーにとってのレイテンシの不必要な増加や、リクエストに表示される情報が少ないため、クライアントサイドよりも低品質のジオコーディングの結果が返されることがあります。