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

ジオコーディングとは、住所(「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 を使用して Geocoding API v4 でサーバーサイドのジオコーディング リクエストを行う例です。

import json
import urllib.request

address = "1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key = "my-key-here"
url = f"https://geocode.googleapis.com/v4/geocode/address/{address}"
headers = {"X-Goog-Api-Key": key}

req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
    result = json.loads(response.read().decode("utf-8"))

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

{
  "results": [
    {
      "place": "places/ChIJiSSC8QK6j4AR98Thup8mqTc",
      "placeId": "ChIJiSSC8QK6j4AR98Thup8mqTc",
      "location": {
        "latitude": 37.4224864,
        "longitude": -122.0855962
      },
      "granularity": "ROOFTOP",
      "viewport": {
        "low": {
          "latitude": 37.4211700197085,
          "longitude": -122.08691558029149
        },
        "high": {
          "latitude": 37.4238679802915,
          "longitude": -122.08421761970851
        }
      },
      "bounds": {
        "low": {
          "latitude": 37.4221145,
          "longitude": -122.0860002
        },
        "high": {
          "latitude": 37.4228775,
          "longitude": -122.085133
        }
      },
      "formattedAddress": "Google Building 41, 1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "postalAddress": {
        "regionCode": "US",
        "languageCode": "en",
        "postalCode": "94043-1351",
        "administrativeArea": "CA",
        "locality": "Mountain View",
        "addressLines": [
          "1600 Amphitheatre Pkwy"
        ]
      },
      "addressComponents": [
        {
          "longText": "Google Building 41",
          "shortText": "Google Building 41",
          "types": [
            "premise"
          ],
          "languageCode": "en"
        },
        {
          "longText": "1600",
          "shortText": "1600",
          "types": [
            "street_number"
          ]
        },
        {
          "longText": "Amphitheatre Parkway",
          "shortText": "Amphitheatre Pkwy",
          "types": [
            "route"
          ],
          "languageCode": "en"
        },
        {
          "longText": "Mountain View",
          "shortText": "Mountain View",
          "types": [
            "locality",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "Santa Clara County",
          "shortText": "Santa Clara County",
          "types": [
            "administrative_area_level_2",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "California",
          "shortText": "CA",
          "types": [
            "administrative_area_level_1",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "United States",
          "shortText": "US",
          "types": [
            "country",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "94043",
          "shortText": "94043",
          "types": [
            "postal_code"
          ]
        },
        {
          "longText": "1351",
          "shortText": "1351",
          "types": [
            "postal_code_suffix"
          ]
        }
      ],
      "types": [
        "premise",
        "street_address"
      ]
    }
  ]
}

その他の例については、Geocoding API v4 の概要と住所をジオコーディングするガイドをご覧ください。

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

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

費用

ジオコーディング リクエストには、1 日あたりの割り当て(QPD)の上限は適用されません。代わりに、ジオコーディング リクエストごとに、ブラウザを介したクライアントサイドか、Geocoding API ウェブサービスを介したサーバーサイドかにかかわらず、リクエストごとの料金が請求されます。使用料金を管理するには、使用量上限と割り当ての管理を検討してください。

レート上限

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

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

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

キャッシュ

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

v4 のサーバーサイド アーキテクチャとクライアントサイド アーキテクチャ

Geocoding API v4(SearchDestinations、GeocodeAddress、GeocodeLocation、GeocodePlace を含む)は、サーバー間 API として設計されています。バックエンド サーバーから v4 エンドポイントを呼び出すと、次のような重要なメリットがあります。

  • 地域ごとの到着インテリジェンス: SearchDestinations メソッド(POST /v4/geocode/destinations)は、サーバーサイドの REST または gRPC リクエストでのみ使用できます。このメソッドは、クライアントサイドのブラウザ ジオコーダでは利用できない、建物の入り口、ルート設定可能なナビゲーション ポイント、建物の輪郭、近くのランドマークを返します。
  • API セキュリティの強化: サーバーサイドの呼び出しにより、API キーと OAuth トークンがクライアント ブラウザに公開されるのを防ぎます。API セキュリティをご覧ください。
  • レスポンス フィールド マスク: サーバーサイド v4 エンドポイントはフィールド マスクをサポートしているため、アプリケーションに必要なフィールドのみをリクエストして、ペイロード サイズとレイテンシを最小限に抑えることができます。

クライアントサイドのブラウザ検索を使用するタイミング

ライブ キーストロークに応答するインタラクティブなブラウザ アプリケーションの場合は、クライアントサイドの Place Autocomplete(ユーザー入力を曖昧性除去してプレイス ID を取得する)と、SearchDestinations または GeocodePlace へのバックエンド呼び出しを組み合わせて、地域ごとの詳細情報や座標を安全に取得することを検討してください。