Amazon Location Service の Geocoding を試してみた

2021.06.03

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

先日、Amazon Location Service がGAとなりました!

すでにいくつかDevelopersIO内にもエントリは上がっていますが、個人的に非常に興味のある分野のサービスですので色々試してみたいと思っています。

そこで今回は、boto3を利用してジオコーディング(Geocoding)を試してみたいと思います!

前提

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

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

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

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

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

Geocodingを試してみる

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

検索文字列のTextにクラスメソッドの本社である神田佐久間町1-11を指定して、座標が取得できるか試してみます。

search_place_sample.py

import boto3
import json

location = boto3.client('location')
res = location.search_place_index_for_text(
    IndexName='explore.place',
    MaxResults=5,
    Text='神田佐久間町1-11'
)
print(json.dumps(res, ensure_ascii=False, indent=2))
$ python search_place_sample.py
{
  "ResponseMetadata": {
    "RequestId": "6552e6b5-7d98-4f78-b658-d47f444acd92",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
(snip...)
    },
    "RetryAttempts": 0
  },
  "Results": [
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.77474374686125,
            35.69723703232465
          ]
        },
        "Label": "東京都千代田区神田佐久間町1-11",
        "Neighborhood": "1",
        "PostalCode": "1010025",
        "Region": "東京都"
      }
    }
  ],
  "Summary": {
    "DataSource": "Esri",
    "MaxResults": 5,
    "ResultBBox": [
      139.77474374686125,
      35.69723703232465,
      139.77474374686125,
      35.69723703232465
    ],
    "Text": "神田佐久間町1-11"
  }
}

ばっちり取得できましたね!

Labelには東京都千代田区神田佐久間町1-11PostalCodeには1010025が返ってきています。

座標もみてみましょう。以下のようなURLでOpenStreetMapにアクセスするとマーカーを表示しつつ該当の地図が表示されます。

  • https://www.openstreetmap.org/?mlat=[緯度]&mlon=[経度]#map=18/[緯度]/[経度]

今回はPointとして139.77474374686125,35.69723703232465が取得できたので、以下のとおりとなります。

アクセスすると、以下のように想定どおりクラスメソッド本社の場所になっています!

© OpenStreetMap contributors

色々なテキストで試してみる

せっかくなので、Textに色々指定して試してみました。

「クラスメソッド」を指定

以下のような結果となっており、うまく検索できていないようです。

  "Results": [
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            137.28185095000003,
            34.90212791000005
          ]
        },
        "Label": "愛知県岡崎市鶇巣町クラ",
        "Neighborhood": "クラ",
        "Region": "愛知県"
      }
    }
  ],

「都庁」を指定

Labelはやや想定外ですが、座標は都庁を示した座標が返ってきていますね。

  "Results": [
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.69286633600007,
            35.690039874000036
          ]
        },
        "Label": "東京都新宿区都庁",
        "Region": "東京都"
      }
    },
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.6917758840001,
            35.68953794000004
          ]
        },
        "Label": "東京都新宿区都庁",
        "Region": "東京都"
      }
    }
  ],

「皇居」を指定

こちらもLabelがやや想定外ですが、座標はちゃんと皇居の座標です。

  "Results": [
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.75286293500005,
            35.684945549000076
          ]
        },
        "Label": "東京都千代田区皇居",
        "Region": "東京都"
      }
    },
    {
      "Place": {
        "Country": "JPN",
        "Geometry": {
          "Point": [
            139.75044184500007,
            35.68358604800005
          ]
        },
        "Label": "東京都千代田区皇居",
        "Region": "東京都"
      }
    }
  ],

まとめ

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

boto3経由で簡単にGeocodingができるのはとても素敵ですね。「Place index」によってGeocodingの精度も変わってきそうなので今後更に豊富な情報(建物名など)による検索もカバーされていくと、より使いやすくなりそうです。

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