ジオコーディングとは、住所(「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 分あたりのクエリ数)に制限されています。これは、クライアント側とサーバー側のクエリ数の合計です。
モバイルアプリなどでクライアント側のジオコーディング リクエストを定期的に実行すると、すべてのユーザーが同時に(毎分同じ 1 秒間に)リクエストを行うと、リクエストでエラーが返されることがあります。これを回避するには、次のいずれかを検討してください。
- リクエストにランダムな間隔(ジッター)を導入します。ユーザーベース全体でリクエストがランダムになるようにします。
- Android 向けの開発では、不正確な繰り返しアラームを使用する。
- Android 向けの開発を行っている場合は、適切な位置情報戦略を選択する。
キャッシュ
キャッシュについては、 Geocoding API ポリシーをご覧ください。
クライアント側のジオコーディングはいつ使用するか
答えは「ほぼ毎回」です。その理由は次のとおりです。
- クライアントサイドのリクエストとレスポンスにより、高速でインタラクティブなエクスペリエンスをユーザーに提供できます。
- クライアント側リクエストには、ジオコーディングの品質を向上させる情報(ユーザーの言語、地域、ビューポート)を含めることができます。
特に、クライアント側のジオコーディングは、ユーザーからの入力に基づいて住所をジオコーディングする場合に最適です。
クライアント側のジオコーディングには、次の 2 つの基本アーキテクチャがあります。
- ジオコーディングと表示はすべてブラウザ内で行います。たとえば、ユーザーがページで住所を入力した場合、アプリケーションがそれをジオコーディングします。次に、ジオコードを使用して、ページが地図上にマーカーを作成します。ジオコードを使用して簡単な分析を行うこともできます。データがサーバーに送信されることはありません。 この方法により、サーバーの負荷を軽減できます。
- ブラウザでジオコーディングを行い、それをサーバーに送信します。たとえば、ユーザーがページで住所を入力した場合、アプリケーションによって、ブラウザ内でジオコーディングが行われます。アプリがサーバーに送信されます。サーバーは近隣のスポットなどのデータで応答します。これにより、独自のデータに基づいてレスポンスをカスタマイズできます。
サーバー側のジオコーディングはいつ使用するか
サーバー側のジオコーディングは、クライアントからの入力なしで住所をジオコーディングする必要があるアプリケーションに最適です。一般的な例は、ユーザー入力とは無関係に取得されるデータセットを取得する場合です。たとえば、ジオコーディングが必要な、既知の有限の既知の住所セットがある場合です。サーバー側のジオコーディングは、クライアント側のジオコーディングが失敗した場合のバックアップとしても役立ちます。
たとえば、ユーザーのレイテンシが不必要に増加することや、リクエストで取得できる情報が少ないためにクライアント側よりも品質が低下するなどの懸念があります。