概要
ジオコーディングとは、住所(「1600 Amphitheatre Parkway, Mountain View, CA」など)を地理座標(緯度 37.423021、経度 -122.083739 など)に変換する処理のことをいいます。地理座標を使用して、マーカーを配置したり地図の位置決めを行ったりできます。
リバース ジオコーディングとは、地理座標を人が読める住所に変換するプロセスです。詳しくはリバース ジオコーディング(住所検索)をご覧ください。
ジオコーダを使用して、特定の場所 ID の住所を探すこともできます。
Maps JavaScript API には、ユーザーの入力内容から動的にジオコーディングやリバース ジオコーディングを行う Geocoder クラスが用意されています。既知の住所を動的にではなく静的にジオコーディングしたい場合は、ジオコーディング ウェブサービスのドキュメントをご覧ください。
はじめに
Maps JavaScript API でジオコーディング サービスを使用するにはまず、Maps JavaScript API 用に設定したプロジェクトで、Geocoding API が有効になっていることを Google Cloud Console で確認します。
有効な API のリストを表示する手順は次のとおりです。
- Google Cloud コンソールに移動します。
- [プロジェクトを選択] ボタンをクリックし、Maps JavaScript API を設定した同じプロジェクトを選択して、[開く] をクリックします。
- [ダッシュボード] の API のリストから、Geocoding API を探します。
- リストに API が表示されていれば、準備は完了です。API がリストに表示されていない場合は、次の手順で有効にします。
- ページの上部で、[API を有効にする] を選択して [ライブラリ] タブを表示します。または、左側のサイドメニューで [ライブラリ] を選択します。
- Geocoding API を検索し、結果のリストから選択します。
- [有効にする] を選択します。このプロセスを完了すると、[ダッシュボード] の API のリストに Geocoding API が表示されます。
料金とポリシー
料金
2018 年 7 月 16 日に、マップ、ルート、プレイスに対して従量課金制の新しい料金プランが適用されました。JavaScript ジオコーディング サービスの新しい料金と使用量上限については、Geocoding API の使用量と請求額をご覧ください。
ポリシー
ジオコーディング サービスは、Geocoding API に関するポリシーに従って使用する必要があります。
ジオコーディング リクエスト
ジオコーディング サービスにアクセスすると、Google Maps API は外部サーバーに対して呼び出しを行うので、処理が非同期になります。このため、コールバック メソッドを渡してリクエストの完了時に実行し、結果を処理させる必要があります。なお、ジオコーダは複数の結果を返すこともあるので注意してください。
Google Maps API ジオコーディング サービスにアクセスするには、コード内で google.maps.Geocoder
コンストラクタ オブジェクトを使用します。Geocoder.geocode()
メソッドはジオコーディング サービスへのリクエストを開始し、入力語句を含む GeocoderRequest
オブジェクト リテラルと、回答の受け取り時に実行するコールバック メソッドを渡します。
GeocoderRequest
オブジェクト リテラルには次のフィールドがあります。
{ address: string, location: LatLng, placeId: string, bounds: LatLngBounds, componentRestrictions: GeocoderComponentRestrictions, region: string }
必須パラメータ: 以下のフィールドのうち 1 つだけを指定する必要があります。
address
- ジオコーディングする住所。
または
location
- 人が読める形式の最も近い住所を取得するLatLng
(LatLngLiteral
)ジオコーダは、リバース ジオコーディングを実行します。 詳細については、リバース ジオコーディングをご覧ください。
または
placeId
— 人が読める形式の最も近い住所を取得する場所の ID。詳しくは、場所 ID の住所を取得するをご覧ください。
省略可能なパラメータ:
bounds
- ジオコーディングの結果に大きくバイアスをかけるLatLngBounds
。bounds
パラメータは、ジオコーダから返される結果に影響を与えますが、完全に制限するわけではありません。詳しくは、後述のビューポートのバイアス設定をご覧ください。componentRestrictions
- 結果を特定のエリアに制限するために使用します。詳しくは、後述のコンポーネントのフィルタリングをご覧ください。region
— 2 文字(数値ではない)の Unicode 地域サブタグで指定される地域コード。多くの場合、これらのタグはよく使用される ccTLD(「トップレベル ドメイン」)の 2 文字の値に直接マッピングされます。region
パラメータは、ジオコーダから返される結果に影響を与えますが、完全に制限するわけではありません。詳しくは、後述の地域コードのバイアス設定をご覧ください。
ジオコーディングのレスポンス
ジオコーディング サービスには、ジオコーダの結果を取得する際に実行されるコールバック メソッドが必要です。このコールバックでは、results
と status
のコードをこの順序で保持する 2 つのパラメータを渡す必要があります。
ジオコーディングの結果
GeocoderResult
オブジェクトは、1 つのジオコーディング結果を表します。なお、1 件のジオコード リクエストで、結果として複数のオブジェクトが返される場合もあります。
results[]: { types[]: string, formatted_address: string, address_components[]: { short_name: string, long_name: string, postcode_localities[]: string, types[]: string }, partial_match: boolean, place_id: string, postcode_localities[]: string, geometry: { location: LatLng, location_type: GeocoderLocationType viewport: LatLngBounds, bounds: LatLngBounds } }
以下はフィールドの説明です。
types[]
は、返される結果の住所のタイプを示す配列です。この配列には、結果として返された対象物のタイプを表す 0 個以上のタグのセットが含まれています。たとえば、「Chicago」のジオコードは「Chicago」が市であることを示す「locality」と、行政区画であることを示す「political」を返します。詳しくは、後述の住所タイプと住所コンポーネントのタイプをご覧ください。formatted_address
は、人が読める形式のこの場所の住所を含む文字列です。ほとんどの場合、この住所は「郵便の宛先」と同一ですイギリスなど一部の国では、ライセンス上の制限があるため実際の郵便の宛先は配信できません。
フォーマット済み住所は、論理的には 1 つ以上の住所コンポーネントで構成されます。たとえば、「111 8th Avenue, New York, NY」という住所は、「111」(番地)、「8th Avenue」(道路名)、「New York」(都市名)、「NY」(アメリカの州名)で構成されています。
フォーマット済み住所は、プログラムで解析しないでください。その代わりに、フォーマット済み住所のフィールドに加えて、API レスポンスに含まれる個々の住所コンポーネントを使用してください。
address_components[]
は、この住所に適用される個々のコンポーネントを含む配列です。通常、各住所コンポーネントには次のフィールドがあります。
types[]
は住所コンポーネントのタイプを示す配列です。サポートされているタイプのリストをご覧ください。long_name
は、ジオコーダが返した住所コンポーネントの説明または名前です。short_name
は、住所コンポーネントの略称です(略称がある場合)。たとえば、アラスカ州の住所コンポーネントの場合は、long_name
には「Alaska」が設定され、short_name
には 2 文字の郵便略称を使用して「AK」が設定されます。
address_components[]
配列については、次の点に注意してください。- 住所コンポーネントの配列には、
formatted_address
よりも多くのコンポーネントが含まれている場合があります。 - この配列には、
formatted_address
に含まれているもの以外の住所を持つ行政区画が、すべて含まれているとは限りません。特定の住所を含むすべての行政区画を取得するには、リバース ジオコーディングを使用して住所の緯度と経度をパラメータとしてリクエストに渡します。 - レスポンスの形式は、リクエスト間で同じになるとは限りません。特に、
address_components
の数はリクエストされた住所によって異なり、同じ住所でも将来的に変わる可能性があります。コンポーネントは、配列内の位置が変わる場合があります。 コンポーネントのタイプは変わる場合があります。特定のコンポーネントが以降のレスポンスに含まれない場合があります。
詳しくは、後述の住所タイプと住所コンポーネントのタイプをご覧ください。
-
partial_match
は、ジオコーダによって、元のリクエストに完全一致する住所は見つからなかったものの、部分一致する住所は見つかったことを示します。元のリクエストで住所の表記が間違っていたり、不完全である可能性があります。多くの場合、リクエストで渡された地域に番地が存在しないために部分一致が発生します。また、同じ地域内に複数の場所があるリクエストを行った場合も部分一致が返されます。たとえば、「Hillpar St, Bristol, UK」の場合は、Henry Street と Henrietta Street の両方の部分一致が返されます。リクエストに表記が間違った住所コンポーネントが含まれている場合、ジオコーディング サービスが別の住所を提示することもある点に注意してください。この場合も、部分一致として結果が返されます。
place_id
は他の Google API と一緒に使用できるプレイス固有の識別子です。たとえば、place_id
を Google Places API ライブラリと併用すると、電話番号や営業時間、ユーザーのレビューなど、ローカル ビジネスの詳細情報を取得できます。場所 ID の概要をご覧ください。postcode_localities[]
は、郵便番号に含まれるすべての地域区分を示す配列です。結果が複数の地区を含む郵便番号の場合にのみ存在します。geometry
には、次の情報が含まれます。location
にはジオコーディングされた緯度と経度の値が含まれます。この場所は、フォーマット済み文字列ではなく、LatLng
オブジェクトとして返されます。location_type
には、指定した場所に関する追加データが格納されます。現在サポートされている値は、以下のとおりです。ROOFTOP
は、返された結果が正確なジオコーディングを反映していることを示します。RANGE_INTERPOLATED
は、返された結果が(交差点などの)正確な 2 地点間で補間された近似値(通常は道路上)を反映していることを示します。補間された結果が返されるのは、番地に対してルーフトップ ジオコーディングが使用できない場合が一般的です。GEOMETRIC_CENTER
は、返された結果が、ポリライン(道路など)やポリゴン(地域)などの幾何学的な中心であることを示します。APPROXIMATE
は、返された結果が近似値であることを示します。
viewport
には、返された結果の推奨ビューポートが格納されます。bounds
(オプションで返される)には、返された結果をすべて含むことができるLatLngBounds
が格納されます。なお、この境界は推奨のビューポートとは一致しない場合があります(たとえば、厳密にはサンフランシスコにはファラロン諸島が市の一部として含まれますが、ビューポートでそのように返されることはありません)。
ジオコーダから返される住所には、ブラウザの優先言語設定、または API JavaScript を読み込んだときに language
パラメータで指定した言語が使用されます(詳細については、ローカライズをご覧ください)。
住所のタイプと住所コンポーネントのタイプ
GeocoderResult の types[]
配列は、住所タイプを示します。types[]
配列は、GeocoderAddressComponent 内で返し、特定の住所コンポーネントのタイプを示すこともできます。ジオコーダから返される住所には、複数のタイプがあり、そうしたタイプはタグと見なされる場合があります。
たとえば、多くの都市には political
タイプと locality
タイプのタグが付けられています。
ジオコーダでは、次のタイプは住所タイプと住所コンポーネント タイプの両方でサポートされており、返されます。
street_address
は正確な住所を示します。route
は名前のある道路(US 101 など)を示します。intersection
は、主要交差点(通常は 2 つの大通りの交差点)を示します。political
は行政区画を示します。通常、このタイプは行政区画のポリゴンを示します。country
は国レベルの行政区画を示し、一般的にはジオコーダから返される最上位のタイプです。administrative_area_level_1
は国レベルの下の 1 次的な行政区画を示します。米国の場合、州がこの行政区画レベルに相当しますが、すべての国でこの行政区画レベルが存在するわけではありません。多くの場合、administrative_area_level_1 の省略名は下位区分 ISO 3166-2 とその他の一般的なリストに一致します。ただし、Google のジオコーディングの結果はさまざまな信号と位置情報データに基づいているため、これらの名前が厳密に一致するとは限りません。administrative_area_level_2
は国レベルの下の 2 次的な行政区画を示します。米国の場合、郡がこの行政区画レベルに相当しますが、すべての国でこの行政区画レベルが存在するわけではありません。administrative_area_level_3
は国レベルの下の 3 次的な行政区画を示します。このタイプは小規模な行政区域を示します。 すべての国でこの行政区画レベルが存在するわけではありません。administrative_area_level_4
は国レベルより下位の 4 次の行政区画を示します。このタイプは小規模な行政区域を示します。 すべての国でこの行政区画レベルが存在するわけではありません。administrative_area_level_5
は国レベルの 5 次以下の行政区画を示します。このタイプは小規模な行政区域を示します。 すべての国でこの行政区画レベルが存在するわけではありません。administrative_area_level_6
は国レベルの 6 次以下の行政区画を示します。このタイプは小規模な行政区域を示します。すべての国でこの行政区画レベルが存在するわけではありません。administrative_area_level_7
は国レベルの 7 次以下の行政区画を示します。このタイプは小規模な行政区域を示します。すべての国でこの行政区画レベルが存在するわけではありません。colloquial_area
は一般的に使用されている通称を示します。locality
は行政区画である都市または町を示します。sublocality
は locality の下の 1 次的な行政区画を示します。一部の場所では、sublocality_level_1
かsublocality_level_5
のいずれかの追加タイプを受け取ります。各下位地区レベルは行政区画で、数が大きいほど区域は小さくなります。neighborhood
は名前のある区域を示します。premise
は名前のある場所を示します。通常は共通の名前を持つ建物や建物の集合体です。subpremise
は名前のある場所の下の 1 次的な存在を示します。通常は共通の名前を持つ建物の集合体内の 1 棟の建物です。plus_code
はエンコードされた場所の参照情報を示します。緯度と経度に基づきます。Plus Codes は、番地がない場所(建物に番号が付いていない場所や、通りに名前がない場所)で、番地の代わりに使用できます。詳しくは https://plus.codes をご覧ください。postal_code
は対象の国内で郵便物の宛先として使用される郵便番号を示します。natural_feature
は特徴的な地勢を示します。airport
は空港を示します。park
は名前付きの公園を示します。point_of_interest
は名前のあるスポットを示します。通常、これらの「スポット」は、その地域で有名な場所のことを指し、「エンパイア ステートビル」や「エッフェル塔」など、他のカテゴリにはあまり当てはまらないものです。
タイプリストが空の場合は、特定の住所コンポーネントに対して既知のタイプが存在しないことを意味します。たとえば、フランスのリュディがこれに相当します。
上記の他に、住所コンポーネントには以下のタイプが含まれることがあります。
注: このリストはすべてを網羅するものではなく、今後変更される可能性もあります。
floor
は建物の階数を示します。establishment
は通常、まだ分類されていない場所を示します。landmark
は、ナビゲーションを支援するために参照として使用される付近の場所を示します。point_of_interest
は名前のあるスポットを示します。parking
は、駐車場や立体駐車場を示します。post_box
は特定の郵便ポストを示します。postal_town
は、locality
やsublocality
など、一部の国で郵送先住所に使用される地域グループを示します。room
は建物の部屋を示します。street_number
は正確な番地を示します。bus_station
、train_station
、transit_station
は、バス、電車、または公共交通機関の停留所の場所を示します。
ステータス コード
status
コードとして次の値のうちのいずれかが返されます。
"OK"
は、エラーが発生せず、住所が正常に解析され、少なくとも 1 件のジオコードが返されたことを示します。"ZERO_RESULTS"
は、検索は成功したものの結果が返されなかったことを示します。これは、実在しないaddress
がジオコーダに渡された場合に発生することがあります。"OVER_QUERY_LIMIT"
はリクエストが割り当て量を超えていることを示します。"REQUEST_DENIED"
はリクエストが拒否されたことを示します。ウェブページではジオコーダを使用できません。"INVALID_REQUEST"
は一般的に、クエリ(address
、components
、latlng
)が不足していることを示します。"UNKNOWN_ERROR"
はサーバーエラーでリクエストが処理できなかったことを示します。再度リクエストすると、成功する可能性があります。"ERROR"
は、リクエストがタイムアウトしたか、Google サーバーへの接続中に問題が発生したことを示します。再度リクエストすると、成功する可能性があります。
この例では、住所をジオコーディングして、返される緯度と経度の値が示す場所にマーカーを設定します。ハンドラを匿名の関数リテラルとして渡していることに注意してください。
var geocoder; var map; function initialize() { geocoder = new google.maps.Geocoder(); var latlng = new google.maps.LatLng(-34.397, 150.644); var mapOptions = { zoom: 8, center: latlng } map = new google.maps.Map(document.getElementById('map'), mapOptions); } function codeAddress() { var address = document.getElementById('address').value; geocoder.geocode( { 'address': address}, function(results, status) { if (status == 'OK') { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert('Geocode was not successful for the following reason: ' + status); } }); } <body onload="initialize()"> <div id="map" style="width: 320px; height: 480px;"></div> <div> <input id="address" type="textbox" value="Sydney, NSW"> <input type="button" value="Encode" onclick="codeAddress()"> </div> </body>
ビューポートのバイアス
ジオコーディング サービスでは、(境界ボックスとして表現される)特定のビューポート内の結果を優先するように指定することもできます。その場合は、GeocoderRequest
オブジェクト リテラル内で bounds
パラメータを設定して、このビューポートの境界を定義します。なお、バイアスで優先されるのは境界内の結果のみです。境界の外により関連性の高い結果がある場合はそれらも含まれます。
たとえば、「Winnetka」のジオコードでは通常、シカゴ郊外の地域が返されます。
{ "types":["locality","political"], "formatted_address":"Winnetka, IL, USA", "address_components":[{ "long_name":"Winnetka", "short_name":"Winnetka", "types":["locality","political"] },{ "long_name":"Illinois", "short_name":"IL", "types":["administrative_area_level_1","political"] },{ "long_name":"United States", "short_name":"US", "types":["country","political"] }], "geometry":{ "location":[ -87.7417070, 42.1083080], "location_type":"APPROXIMATE" }, "place_id": "ChIJW8Va5TnED4gRY91Ng47qy3Q" }
ただし、bounds
パラメータを指定してロサンゼルスのサン フェルナンド バレーの境界ボックスを定義すると、この場所にある「Winnetka」という名前の地区がジオコーディングの結果として返されます。
{ "types":["sublocality","political"], "formatted_address":"Winnetka, California, USA", "address_components":[{ "long_name":"Winnetka", "short_name":"Winnetka", "types":["sublocality","political"] },{ "long_name":"Los Angeles", "short_name":"Los Angeles", "types":["administrative_area_level_3","political"] },{ "long_name":"Los Angeles", "short_name":"Los Angeles", "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"] }], "geometry":{ "location": [34.213171,-118.571022], "location_type":"APPROXIMATE" }, "place_id": "ChIJ0fd4S_KbwoAR2hRDrsr3HmQ" }
地域コードのバイアス
また、region
パラメータを使用することにより、ジオコーディング サービスの結果で特定の地域を優先するように設定できます。このパラメータには、地域コードを 2 文字(数値ではない)の Unicode 地域サブタグで指定します。このタグは、「co.uk」の場合の「uk」など、よく使用される ccTLD(「トップレベル ドメイン」)の 2 文字の値に直接対応します。場合によって、region
タグは ISO-3166-1 コードもサポートします。これは ccTLD 値(「Great Britain」の「GB」など)とは異なることがあります。
region
パラメータを使用する際は以下に留意します。
- 国または地域を 1 つだけ指定します。複数の値は無視され、リクエストが失敗する原因となります。
- 2 文字の地域サブタグ(Unicode CLDR 形式)だけを使用します。他の形式での入力はエラーになります。
- サポートされるのは、Google Maps Platform のサポート状況に記載されている国や地域のみです。
ジオコーディング リクエストは、Google マップのメイン アプリケーションでジオコーディングを提供する全ドメインに対して送信できます。なお、バイアスで優先されるのは特定のドメイン内の結果のみです。このドメインの外により関連性の高い結果がある場合はそれらも含まれます。
たとえば、「Toledo」をジオコーディングすると、ジオコーディング サービスのデフォルトのドメインが「United States」に設定されているため、次のような結果が返されます。
{ "types":["locality","political"], "formatted_address":"Toledo, OH, USA", "address_components":[{ "long_name":"Toledo", "short_name":"Toledo", "types":["locality","political"] },{ "long_name":"Ohio", "short_name":"OH", "types":["administrative_area_level_1","political"] },{ "long_name":"United States", "short_name":"US", "types":["country","political"] }], "place_id": "ChIJeU4e_C2HO4gRRcM6RZ_IPHw" }
region
フィールドを 'es'
(スペイン)に設定して「Toledo」をジオコーディングすると、スペインの都市が返されます。
{ "types":["locality","political"], "formatted_address":"Toledo, España", "address_components":[{ "long_name":"Toledo", "short_name":"Toledo", "types":["locality","political"] },{ "long_name":"Toledo", "short_name":"TO", "types":["administrative_area_level_2","political"] },{ "long_name":"Castilla-La Mancha", "short_name":"CM", "types":["administrative_area_level_1","political"] },{ "long_name":"España", "short_name":"ES", "types":["country","political"] }], "place_id": "ChIJ8f21C60Lag0R_q11auhbf8Y" }
コンポーネントのフィルタリング
コンポーネント フィルタを使用して、ジオコーディング サービスが特定のエリアを優先して結果を返すよう設定することもできます。componentRestrictions
パラメータでフィルタを指定します。フィルタの値は、スペル訂正や部分一致など、他のジオコーディングのリクエストと同じメソッドをサポートしています。
ジオコーダは、コンポーネント フィルタのすべてに一致する結果のみを返します。つまり、指定されたフィルタは OR ではなく AND として評価されます。
コンポーネント フィルタは、次の項目で構成されます。
route
は、道路の正式名または略称を照合します。locality
は、locality および sublocality タイプで照合します。administrativeArea
は、すべてのレベルの行政区域を照合します。postalCode
は郵便番号と郵便番号のプレフィックスを照合します。country
は、国名、または 2 文字の ISO 3166-1 国コードを照合します。注: この API は ISO 標準に従って国を定義しているため、対応する ISO 国コードを使用するとフィルタリングが最適に動作します。
次の例では、componentRestrictions
パラメータを使用して、country
と postalCode
でフィルタリングしています。
function codeAddress() { geocoder.geocode({ componentRestrictions: { country: 'AU', postalCode: '2000' } }, function(results, status) { if (status == 'OK') { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { window.alert('Geocode was not successful for the following reason: ' + status); } }); }
リバース ジオコーディング(住所検索)
通常、「ジオコーディング」という言葉は、人が判読できる住所を地図上の地点に変換することを意味します。一方、地図上の地点を人が判読できる住所に変換する処理を「リバース ジオコーディング」と呼びます。
テキストの address
を指定するのではなく、location
パラメータでカンマ区切りの緯度と経度のペアを指定します。
以下の例では、緯度と経度の値をジオコーディングし、その場所に地図の中心を合わせ、フォーマット済み住所が入った情報ウィンドウを表示しています。
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 8, center: { lat: 40.731, lng: -73.997 }, } ); const geocoder = new google.maps.Geocoder(); const infowindow = new google.maps.InfoWindow(); (document.getElementById("submit") as HTMLElement).addEventListener( "click", () => { geocodeLatLng(geocoder, map, infowindow); } ); } function geocodeLatLng( geocoder: google.maps.Geocoder, map: google.maps.Map, infowindow: google.maps.InfoWindow ) { const input = (document.getElementById("latlng") as HTMLInputElement).value; const latlngStr = input.split(",", 2); const latlng = { lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1]), }; geocoder .geocode({ location: latlng }) .then((response) => { if (response.results[0]) { map.setZoom(11); const marker = new google.maps.Marker({ position: latlng, map: map, }); infowindow.setContent(response.results[0].formatted_address); infowindow.open(map, marker); } else { window.alert("No results found"); } }) .catch((e) => window.alert("Geocoder failed due to: " + e)); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 8, center: { lat: 40.731, lng: -73.997 }, }); const geocoder = new google.maps.Geocoder(); const infowindow = new google.maps.InfoWindow(); document.getElementById("submit").addEventListener("click", () => { geocodeLatLng(geocoder, map, infowindow); }); } function geocodeLatLng(geocoder, map, infowindow) { const input = document.getElementById("latlng").value; const latlngStr = input.split(",", 2); const latlng = { lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1]), }; geocoder .geocode({ location: latlng }) .then((response) => { if (response.results[0]) { map.setZoom(11); const marker = new google.maps.Marker({ position: latlng, map: map, }); infowindow.setContent(response.results[0].formatted_address); infowindow.open(map, marker); } else { window.alert("No results found"); } }) .catch((e) => window.alert("Geocoder failed due to: " + e)); } window.initMap = initMap;
サンプルを試す
前の例では、results[0]
を選択して最初の結果を表示しました。リバース ジオコーダは複数の結果を返すこともあるので注意してください。ジオコーディングの「住所」には、郵送先住所だけでなく、その場所の地理的な名称も含まれます。たとえば、シカゴ市のある地点のジオコーディングを行うと、ジオコーディングされる地点には番地、都市(シカゴ)、州(イリノイ)、国(米国)などのラベルが付きます。ジオコーダは、これらをすべて「住所」と認識ます。また、リバース ジオコーダからは、これらの結果がすべて返されます。
リバース ジオコーダによる検索では、行政区画(国、州、都市および区域)、番地、郵便番号を照合します。
上記のクエリで返される住所のリストの例は次のとおりです。
results[0].formatted_address: "277 Bedford Ave, Brooklyn, NY 11211, USA" results[1].formatted_address: "Grand St/Bedford Av, Brooklyn, NY 11211, USA" results[2].formatted_address: "Williamsburg, Brooklyn, NY, USA" results[3].formatted_address: "Brooklyn, NY, USA" results[4].formatted_address: "New York, NY, USA" results[5].formatted_address: "Brooklyn, NY 11211, USA" results[6].formatted_address: "Kings County, NY, USA" results[7].formatted_address: "New York-Northern New Jersey-Long Island, NY-NJ-PA, USA" results[8].formatted_address: "New York Metropolitan Area, USA" results[9].formatted_address: "New York, USA"
一致率が最も高い住所から最も低い住所の順で表示されます。一般的には最も正確な住所が最も重要な結果で、それはこのケースにも当てはまります。最も詳細な番地まで含む住所から、区域、都市、郡、州などのより範囲の広い行政区画まで、さまざまなタイプの住所が返されていることに注意してください。より一般的な住所との一致を検索する場合は、results[].types
フィールドを調べます。
注: リバース ジオコーディングは科学的に正確というわけではありません。ジオコーダは許容範囲内で、できる限り近い住所の場所を検索しようとします。
場所 ID の住所を取得する
特定の場所 ID の住所を検索するには、placeId
を指定します。場所 ID は、Google の他の API で使用できる一意の識別子です。たとえば、Roads API から返される placeId
を指定して、スナップ ポイントの住所を取得できます。場所 ID について詳しくは、場所 ID の概要をご覧ください。
placeId
を指定する場合、リクエストに次のフィールドを含めることはできません。
address
latLng
location
componentRestrictions
次の例では、場所 ID を受け取り、対応する住所を見つけて、その場所に地図の中心を合わせます。その場所のフォーマット済み住所を含む情報ウィンドウも表示されます。
TypeScript
// Initialize the map. function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 8, center: { lat: 40.72, lng: -73.96 }, } ); const geocoder = new google.maps.Geocoder(); const infowindow = new google.maps.InfoWindow(); (document.getElementById("submit") as HTMLElement).addEventListener( "click", () => { geocodePlaceId(geocoder, map, infowindow); } ); } // This function is called when the user clicks the UI button requesting // a geocode of a place ID. function geocodePlaceId( geocoder: google.maps.Geocoder, map: google.maps.Map, infowindow: google.maps.InfoWindow ) { const placeId = (document.getElementById("place-id") as HTMLInputElement) .value; geocoder .geocode({ placeId: placeId }) .then(({ results }) => { if (results[0]) { map.setZoom(11); map.setCenter(results[0].geometry.location); const marker = new google.maps.Marker({ map, position: results[0].geometry.location, }); infowindow.setContent(results[0].formatted_address); infowindow.open(map, marker); } else { window.alert("No results found"); } }) .catch((e) => window.alert("Geocoder failed due to: " + e)); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// Initialize the map. function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 8, center: { lat: 40.72, lng: -73.96 }, }); const geocoder = new google.maps.Geocoder(); const infowindow = new google.maps.InfoWindow(); document.getElementById("submit").addEventListener("click", () => { geocodePlaceId(geocoder, map, infowindow); }); } // This function is called when the user clicks the UI button requesting // a geocode of a place ID. function geocodePlaceId(geocoder, map, infowindow) { const placeId = document.getElementById("place-id").value; geocoder .geocode({ placeId: placeId }) .then(({ results }) => { if (results[0]) { map.setZoom(11); map.setCenter(results[0].geometry.location); const marker = new google.maps.Marker({ map, position: results[0].geometry.location, }); infowindow.setContent(results[0].formatted_address); infowindow.open(map, marker); } else { window.alert("No results found"); } }) .catch((e) => window.alert("Geocoder failed due to: " + e)); } window.initMap = initMap;