Amazon Location Service の Reverse Geocoding を試してみた

2021.06.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

Amazon Location Serviceでは、建物名や住所などの「テキスト」から「座標」を取得する「Geocoding」が利用できますが、その逆の「座標」から「住所」を取得できる「Reverse Geocoding」も利用できます。

今回は、boto3を利用してこの「Reverse Geocoding」を試してみたいと思います!

「Geocoding」については、下記のエントリもご参照ください。

前提

試した環境は、以下のような環境となります。

  • Python 3.7
  • boto31.17.86がインストール済み
  • boto3でアクセスできるように、~/.aws/configおよび~/.aws/credentialsは設定済み

また、前提条件として下記のドキュメントに記載のとおり「place index」が作成されている必要があります。今回は検証環境に既にexplore.placeという名前の「place index」存在していたので、これを利用しています。

認証に関しては、boto3を利用するので特に準備はしていません。

boto3のAPIについては、こちらのドキュメントを参照しつつ実装してみます。

Reverse Geocodingを試してみる

では、早速ためしてみましょう。簡単に以下のようなコードで試してみます。

検索座標のPositionにクラスメソッドの本社の座標である「経度(longitude)、緯度(latitude)」の139.77474374686125,35.69723703232465を指定して、住所が取得できるか試してみます。

search_place_by_position.py

import boto3
import json

location = boto3.client('location')
res = location.search_place_index_for_position(
    IndexName='explore.place',
    MaxResults=5,
    Position=[
        139.77474374686125,
        35.69723703232465
    ]
)
print(json.dumps(res, ensure_ascii=False, indent=2))
$ python search_place_by_position.py
{
  "ResponseMetadata": {
    "RequestId": "0ed1a157-c577-4252-909d-c6435c6195f9",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
(snip...)
    },
    "RetryAttempts": 0
  },
  "Results": [
    {
      "Place": {
        "AddressNumber": "7",
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.77493837465295,
            35.69732713778379
          ]
        },
        "Label": "東京都千代田区神田佐久間町1-11-7",
        "Neighborhood": "1",
        "PostalCode": "1010025",
        "Region": "東京都"
      }
    }
  ],
  "Summary": {
    "DataSource": "Esri",
    "MaxResults": 5,
    "Position": [
      139.77474374686125,
      35.69723703232465
    ]
  }
}

想定通り住所が取得できました!

日本の場合は、Regionに都道府県名、Neighborhoodに町名、AddressNumberに番地が返ってきています。一方で、街区符号である11は該当するフィールドが無いので返ってこないようです。

郵便番号もPostalCodeとして返ってきているのが良いですね。

色々な座標で試してみる

さて、せっかくなので色々な座標で試してみます。

「地番」の住所の座標を指定

先程の「東京都千代田区神田佐久間町」は住居表示の住所でした。

一方で地番の場合はどうなるかも見てみます。福島県喜多方市では地番が採用されているので、個人的に好きなラーメン屋さんの「坂内食堂(本店)」の座標139.8734944535631,37.651075754949844で試してみます。住所は福島県喜多方市細田7230になる想定です。

  "Results": [
    {
      "Place": {
        "AddressNumber": "1",
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.8734461049891,
            37.65092400724576
          ]
        },
        "Label": "福島県喜多方市細田7232-1",
        "PostalCode": "9660816",
        "Region": "福島県"
      }
    }
  ],

福島県喜多方市細田7230のはずなのですが、ちょっとズレてしまったようです。AddressNumberにはが入っており、地番の枝番が設定されるようですね。街区符号と同じように地番には該当するフィールドが無いようです。

「無番地(番外地)」の座標を指定

日本には番外地という番地の無い住所もあります。

無番地で有名な「千葉県四街道市市役所」の座標140.16835248591437,35.669972926612076で試してみましょう。ちなみにこの住所は千葉県四街道市鹿渡無番地になります。

  "Results": [
    {
      "Place": {
        "AddressNumber": "4",
        "Country": "JPN",
        "Geometry": {
          "Point": [
            140.1679730229862,
            35.66965143460298
          ]
        },
        "Label": "千葉県四街道市鹿渡917-4",
        "PostalCode": "2840003",
        "Region": "千葉県"
      }
    }
  ],

住所は合っているのですが、市役所内の建物の住所になるようです。無番地が出なかったので、ちょっと残念ですね。

なお、同様に「和歌山県伊都郡高野町高野山」の「高野山駅」の座標135.5775857064565,34.22762331843497でも試してみましたが、近くの建物である「和歌山県伊都郡高野町高野山4-2」が返ってきました。

特異な座標を指定

最後に特異な座標も試してみましょう。0,0です!

  "Results": [
    {
      "Place": {
        "Geometry": {
          "Point": [
            5.684341886080802e-14,
            5.684341886080802e-14
          ]
        },
        "Label": "Earth"
      }
    }
  ],

LabelEarthに凄みを感じます。さすがに座標の値もややおかしくなるようですね。

まとめ

以上、Amazon Location Service の Reverse Geocoding を試してみました!

座標から住所を求めるので使い方はシンプルでわかりやすいですね。取得できる住所は、特殊なケースではやや注意が必要そうですが、一般的な住所であれば問題なく取得できそうです。個人的には「郵便番号」が取得できるのがとても便利だなと感じました。

どなたかのお役に立てば幸いです。それでは!