ジオコーディング時の割り当て使用状況の最適化

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

ジオコーディングとは、住所(「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 日の割り当ての上限を検討してください。

レート制限

ジオコーディング サービスのレートは 50 QPS(秒間クエリ数)に制限されており、クライアント側とサーバー側のクエリの合計数として計算されます。

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

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

キャッシュ

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

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

簡潔に言うと「たいていの場合」です。その理由は次のとおりです。

  • クライアント側のリクエストとレスポンスによって、ユーザーはインタラクティブかつ高速に操作できます。
  • クライアント側リクエストには、ジオコーディングの品質を向上させる情報(ユーザーの言語、地域、ビューポート)を含めることができます。

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

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

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

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

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

考えられる懸念事項としては、ユーザーのレイテンシが不必要に増加することや、ジオコーディングできる情報がクライアントサイドよりも低くなることが挙げられます。これは、リクエストで利用できる情報が少ないためです。