ジオコーディング サービス

概要

ジオコーディングとは、住所(「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 コンソールで確認します。

有効な API のリストを表示する手順は次のとおりです。

  1. Google Cloud コンソールに移動します。
  2. [プロジェクトを選択] ボタンをクリックし、Maps JavaScript API を設定した同じプロジェクトを選択して、[開く] をクリックします。
  3. [ダッシュボード] の API のリストから、Geocoding API を探します。
  4. リストに API が表示されていれば、準備は完了です。API がリストに表示されていない場合は、次の手順で有効にします。
    1. ページの上部で、[API を有効にする] を選択して [ライブラリ] タブを表示します。または、左側のサイドメニューで [ライブラリ] を選択します。
    2. Geocoding API を検索し、結果のリストから選択します。
    3. [有効にする] を選択します。このプロセスを完了すると、[ダッシュボード] の 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 - 人が読める形式の最も近い住所を取得する LatLngLatLngLiteral)ジオコーダは、リバース ジオコーディングを実行します。 詳細については、リバース ジオコーディングをご覧ください。
         または
    placeId - 人が読める形式の最も近い住所を取得する場所の ID。詳しくは、プレイス ID の住所を取得するをご覧ください。

省略可能なパラメータ:

  • bounds - ジオコーディングの結果に大きくバイアスをかける LatLngBoundsbounds パラメータは、ジオコーダから返される結果に影響を与えますが、完全に制限するわけではありません。詳しくは、後述のビューポートのバイアス設定をご覧ください。
  • componentRestrictions - 結果を特定のエリアに制限するために使用します。詳しくは、後述のコンポーネントのフィルタリングをご覧ください。
  • region - 2 文字(数値ではない)の Unicode 地域サブタグで指定される地域コード。多くの場合、これらのタグはよく使用される ccTLD(「トップレベル ドメイン」)の 2 文字の値に直接マッピングされます。region パラメータは、ジオコーダから返される結果に影響を与えますが、完全に制限するわけではありません。詳しくは、後述の地域コードのバイアス設定をご覧ください。
  • extraComputations - このパラメータの有効な値は ADDRESS_DESCRIPTORS のみです。詳しくは、住所記述子についての記事をご覧ください。
  • fulfillOnZeroResults - レスポンスが ZERO_RESULT ステータスの場合、Promise に入力します。ジオコーディング結果がゼロであっても、追加のレスポンス単位のフィールドが返される可能性があるため、推奨されています。詳しくは、結果がゼロの場合に入力するをご覧ください。

ジオコーディングのレスポンス

ジオコーディング サービスには、ジオコーダの結果を取得する際に実行されるコールバック メソッドが必要です。このコールバックでは、resultsstatus のコードをこの順序で保持する 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_idGoogle Places API ライブラリと併用すると、電話番号や営業時間、ユーザーのレビューなど、ローカル ビジネスの詳細情報を取得できます。場所 ID の概要をご覧ください。
  • postcode_localities[] は、郵便番号に含まれるすべての地域区分を示す配列です。結果が複数の地区を含む郵便番号の場合にのみ存在します。
  • geometry には、次の情報が含まれます。

    • location にはジオコーディングされた緯度と経度の値が含まれます。この場所は、フォーマット済み文字列ではなく、LatLng オブジェクトとして返されます。
    • location_type には、指定した場所に関する追加データが格納されます。現在サポートされている値は、以下のとおりです。
      • ROOFTOP は、返された結果が正確なジオコーディングを反映していることを示します。
      • RANGE_INTERPOLATED は、返された結果が(交差点などの)正確な 2 地点間で補間された近似値(通常は道路上)を反映していることを示します。補間された結果が返されるのは、番地に対してルーフトップ ジオコーディングが使用できない場合が一般的です。
      • GEOMETRIC_CENTER は、返された結果が、ポリライン(道路など)やポリゴン(地域)などの幾何学的な中心であることを示します。
      • APPROXIMATE は、返された結果が近似値であることを示します。

    • viewport には、返された結果の推奨ビューポートが格納されます。
    • bounds(オプションで返される)には、返された結果をすべて含むことができる LatLngBounds が格納されます。なお、この境界は推奨のビューポートとは一致しない場合があります(たとえば、厳密にはサンフランシスコにはファラロン諸島が市の一部として含まれますが、ビューポートでそのように返されることはありません)。

ジオコーダから返される住所には、ブラウザの優先言語設定、または API JavaScript を読み込んだときに language パラメータで指定した言語が使用されます(詳細については、ローカライズをご覧ください)。

住所のタイプと住所コンポーネントのタイプ

GeocoderResulttypes[] 配列は、住所タイプを示します。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_1sublocality_level_5 のいずれかの追加タイプを受け取ります。各下位地区レベルは行政区画で、数が大きいほど区域は小さくなります。
  • neighborhood は名前のある地域を示します。
  • premise は名前のある場所を示します。通常は共通の名前を持つ建物や建物の集合体です。
  • subpremise は、敷地レベルより下位のアドレス指定可能なエンティティ(アパート、ユニット、スイートなど)を示します。
  • 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 は、localitysublocality など、一部の国で郵送先住所に使用される地域グループを示します。
  • room は建物の部屋を示します。
  • street_number は正確な番地を示します。
  • bus_stationtrain_stationtransit_station は、バス、電車、または公共交通機関の停留所の場所を示します。

ステータス コード

status コードとして次の値のうちのいずれかが返されます。

  • "OK" は、エラーが発生せず、住所が正常に解析され、少なくとも 1 件のジオコードが返されたことを示します。
  • "ZERO_RESULTS" は、ジオコードは成功したものの結果が返されなかったことを示します。これは、実在しない address がジオコーダに渡された場合に発生することがあります。
  • "OVER_QUERY_LIMIT" はリクエストが割り当て量を超えていることを示します。
  • "REQUEST_DENIED" はリクエストが拒否されたことを示します。ウェブページではジオコーダを使用できません。
  • "INVALID_REQUEST" は一般的に、クエリ(addresscomponentslatlng)が不足していることを示します。
  • "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 パラメータを使用して、countrypostalCode でフィルタリングしています。

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);
  }
});
}

結果がゼロの場合に入力する

リバース ジオコーディングの場合、デフォルトでは、status=ZERO_RESULTS で Promise が破棄されます。ただし、この場合、plus_code および address_descriptor のレスポンス単位の追加フィールドは引き続きデータが入力される可能性があります。fulfillOnZeroResults パラメータに true が指定されている場合、Promise は破棄されず、これらの追加フィールドは存在する場合、Promise からアクセスできます。

以下は、南極大陸の緯度 / 経度におけるこの動作の例です。 リバース ジオコーディングの結果がない場合でも、fulfillOnZeroResults=true を設定すると、Promise に Plus Code を出力できます。

    function addressDescriptorReverseGeocoding() {
      var latlng = new google.maps.LatLng(-75.290330, 38.653861);
      geocoder
        .geocode({
          'location': latlng,
          'fulfillOnZeroResults': true,
        })
        .then((response) => {
          console.log(response.plus_code);
        })
        .catch((error) => {
          window.alert(`Error`);
        });
    }
  

住所記述子

住所記述子には、ランドマークやエリアを使用して場所を説明するのに役立つ追加情報が含まれます。住所記述子デモでこの機能をご確認ください。

住所記述子は、extraComputations パラメータを使用して有効にできます。レスポンスで住所記述子を受け取るには、ジオコーディング リクエストリバース ジオコーディング リクエスト、またはプレイス ジオコーディング リクエストextra_computations=ADDRESS_DESCRIPTORS を含めます。

プレイス ジオコーディングのサンプル

次のクエリには、「Delhi」にあるプレイスの住所が含まれています。

function addressDescriptorPlaceIdLookup() {
  geocoder.geocode({ 
    'placeId': 'ChIJyxAX8Bj9DDkRgBfAnBYa66Q',
    'extraComputations': ['ADDRESS_DESCRIPTORS']
    }, function(results, status) {
    if (status == 'OK') {
      console.log(results[0].address_descriptor);
    } else {
      window.alert('Geocode was not successful for the following reason: ' + status);
    }
  });
}

リバース ジオコーディングのサンプル

次の照会には、「Delhi」にあるプレイスの緯度 / 経度の値が含まれています。

    function addressDescriptorReverseGeocoding() {
      var latlng = new google.maps.LatLng(28.640964,77.235875);
      geocoder
        .geocode({
          'location': latlng,
          'extraComputations': ["ADDRESS_DESCRIPTORS"],
        })
        .then((response) => {
          console.log(response.address_descriptor);
        })
        .catch((error) => {
          window.alert(`Error`);
        });
    }
  

住所記述子のサンプル

address_descriptor のサンプルは次のとおりです。

  {
    "address_descriptor" : {
       "areas" : [
          {
             "containment" : "OUTSKIRTS",
             "display_name" : {
                "language_code" : "en",
                "text" : "Turkman Gate"
             },
             "place_id" : "ChIJ_7LLvyb9DDkRMKKxP9YyXgs"
          },
          {
             "containment" : "OUTSKIRTS",
             "display_name" : {
                "language_code" : "en",
                "text" : "Chandni Chowk"
             },
             "place_id" : "ChIJWcXciBr9DDkRUb4dCDykTwI"
          },
          {
             "containment" : "NEAR",
             "display_name" : {
                "language_code" : "en",
                "text" : "Katar Ganj"
             },
             "place_id" : "ChIJH3cWUyH9DDkRaw-9CjvcRvY"
          }
       ],
       "landmarks" : [
          {
             "display_name" : {
                "language_code" : "en",
                "text" : "Delite Cinema"
             },
             "straight_line_distance_meters" : 29.9306755065918,
             "place_id" : "ChIJLfiYDCT9DDkROoEa7NdupUM",
             "travel_distance_meters" : 418.7794799804688,
             "spatial_relationship" : "ACROSS_THE_ROAD",
             "types" : [ "establishment", "movie_theater", "point_of_interest" ]
          },
          {
             "display_name" : {
                "language_code" : "en",
                "text" : "YES Bank"
             },
             "straight_line_distance_meters" : 66.83731079101562,
             "place_id" : "ChIJFYHM3yb9DDkRRKGkZl2mpSQ",
             "travel_distance_meters" : 489.0340270996094,
             "spatial_relationship" : "DOWN_THE_ROAD",
             "types" : [ "bank", "establishment", "finance", "point_of_interest" ]
          },
          {
             "display_name" : {
                "language_code" : "en",
                "text" : "UCO Bank"
             },
             "straight_line_distance_meters" : 25.38849639892578,
             "place_id" : "ChIJ-c6_wCb9DDkRjIk1LeqRtGM",
             "travel_distance_meters" : 403.2246398925781,
             "spatial_relationship" : "ACROSS_THE_ROAD",
             "types" : [ "atm", "bank", "establishment", "finance", "point_of_interest" ]
          },
          {
             "display_name" : {
                "language_code" : "en",
                "text" : "Delhi By Cycle Meeting Point"
             },
             "straight_line_distance_meters" : 44.02867126464844,
             "place_id" : "ChIJNxVfkSb9DDkRJD22l-eGFdM",
             "travel_distance_meters" : 97.41281890869141,
             "spatial_relationship" : "AROUND_THE_CORNER",
             "types" : [
                "establishment",
                "point_of_interest",
                "tourist_attraction",
                "travel_agency"
             ]
          },
          {
             "display_name" : {
                "language_code" : "en",
                "text" : "Axis Bank Branch"
             },
             "straight_line_distance_meters" : 102.3495178222656,
             "place_id" : "ChIJr3uaDCT9DDkR8roHTVSn1x4",
             "travel_distance_meters" : 330.8566284179688,
             "spatial_relationship" : "DOWN_THE_ROAD",
             "types" : [ "bank", "establishment", "finance", "point_of_interest" ]
          }
       ]
    }
  }

address_descriptor オブジェクトには、landmarksareas の 2 つの配列があります。landmarks 配列には、リクエストされた座標までの距離、ランドマークの広さ、およびその認知度を考慮して、関連性の高い順にランク付けされた最大 5 つの結果が含まれます。各ランドマーク結果には次の値が含まれます。

  • place_id は、ランドマーク結果のプレイス ID です。プレイス ID の概要をご覧ください。
  • display_name はランドマークの表示名であり、language_codetext が含まれます。
  • straight_line_distance_meters は、入力座標とランドマーク結果間の直線距離(メートル単位)です。
  • travel_distance_meters は、入力座標とランドマークの結果間を道路網(道路規制は考慮に入れない)を使って移動する場合の距離(メートル単位)です。
  • spatial_relationship は入力座標とランドマーク結果の間の推定関係です。
    • "NEAR" は、以下のいずれにも該当しない場合のデフォルトの関係です。
    • "WITHIN": 入力座標がランドマークに関連付けられた建造物の境界内に含まれている場合。
    • "BESIDE": 入力座標がランドマークまたはランドマークの出入口に直接隣接している場合。
    • "ACROSS_THE_ROAD": 入力座標が経路を挟んだランドマークの真向かいにある場合。
    • "DOWN_THE_ROAD": 入力座標がランドマークと同じ経路上にあるが、"BESIDES" または "ACROSS_THE_ROAD" ではない場合。
    • "AROUND_THE_CORNER": 入力座標が経路を挟んだランドマークの斜向かいにある場合。
    • "BEHIND": 入力座標がランドマークに空間的に近いが、出入口からは遠い場合。
  • types は、ランドマークのプレイスタイプです。

areas オブジェクトには最大 3 つのレスポンスが含まれ、近隣地域、地域の下位区分、大規模な複合施設などの小さな地域を表す場所に限定されます。リクエストされた座標を含むエリアから始まり狭い方から広い方に列挙されます。各 areas の結果には次の値が含まれます。

  • place_id は、エリア結果のプレイス ID です。プレイス ID の概要をご覧ください。
  • display_name はエリアの表示名であり、language_codetext が含まれます。
  • containment は、入力座標とエリア結果間の推定された包含関係です。
    • "NEAR" は、以下のいずれにも該当しない場合のデフォルトの関係です。
    • "WITHIN": 入力座標がエリアの中心に近い場合。
    • "OUTSKIRTS": 入力座標がエリアの端に近い場合。

住所記述子の対象地域

この機能は一部の国でのみご利用いただけます。

これはプレビュー機能ですので、ご意見をお聞かせいただければ幸いです。address-descriptors-feedback@google.com 宛にフィードバックをお送りください。

リバース ジオコーディング(住所検索)

通常、「ジオコーディング」という言葉は、人が判読できる住所を地図上の地点に変換することを意味します。一方、地図上の地点を人が判読できる住所に変換する処理を「リバース ジオコーディング」と呼びます。

テキストの 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;
サンプルを表示

サンプルを試す