コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

Amazon Location APIとPythonを使って住所を緯度経度に変換する

位置情報系の分析をしていると、店舗などの住所情報を緯度経度に変換したいケースがあるかと思います。今回は2020年12月にリリースされたAWSの位置情報サービスであるAmazon LocationをPythonから操作することでテキストの住所から緯度経度情報を取得してみました。

Amazon Locationとは

Amazon Locationとは、2020年12月にリリースされたAWSの位置情報サービスです。Amazon Locationは現時点(2021.03)では以下4つの機能を使うことができます。

  1. Maps
  2. Place indexes
  3. Geofence collections
  4. Trackers

f:id:hktech:20210309003403p:plain


実際にAmazon Locationのコンソール画面で見るとこのような形で上記の機能を画面上で試すことができます。
東京スカイツリーと打つと、東京スカイツリーの場所がマップ上で表示されています。
f:id:hktech:20210309004015p:plain


今回はこちらのPlace index上でクエリを投げて緯度経度を返す処理を、APIを通して実行してみました。

Amazon Location API

今回はAWSで用意されているSearchPlaceIndexForText APIを使って、テキストから緯度経度を取得します。
SearchPlaceIndexForText - Amazon Location Service Places

主なパラメータは以下です。

  • BiasPosition: 基準とする緯度経度を渡すことで、その位置から近い結果を返してくれる。クエリが曖昧な場合に有効
  • FilterBBox: 検索範囲のバウンディングボックスを緯度経度で指定可能
  • FilterCountries: 検索対象の国を指定。日本ならば 'JPN'
  • MaxResults: APIが返す検索結果の最大件数を指定
  • Text: 緯度経度を取得したいテキストを指定。住所や建物名など

Amazon Location APIPythonのboto3で操作する

APIPythonで操作します。今回はboto3というライブラリでAmazon Location APIにリクエストを投げてみます

まずはboto3をインストール

pip install boto3


AWS CLIのインストールがまだの方はこちら


それでは実際にboto3を使ってAPIにリクエストを投げていきます。今回はクエリとして東京スカイツリーの住所を指定します。

import boto3
client = boto3.client('location')

response = client.search_place_index_for_text(
        FilterCountries=[
            'JPN',
        ],
        IndexName='explore.place',
        MaxResults=1,
        Text='東京都墨田区押上1丁目1−2'
    )

以下のようなエラーが出た場合はIndexNameがうまく設定できていない。下記画像を参考に、Place Indexの名前を追加してあげれば問題なく動く。

ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the SearchPlaceIndexForText operation: resource[explore.plce] not found, reason: resource not found


f:id:hktech:20210309011933p:plain


レスポンスとしては下記のような結果が返ってくる。

{'ResponseMetadata': {'RequestId': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'date': 'Mon, 08 Mar 2021 16:37:25 GMT',
   'content-type': 'application/json',
   'content-length': '448',
   'connection': 'keep-alive',
   'x-amzn-requestid': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
   'x-amzn-remapped-x-amzn-requestid': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
   'access-control-allow-origin': '*',
   'x-amz-apigw-id': 'b4He5EiOtjMFX3A=',
   'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amzn-requestid,x-amz-apigw-id,date',
   'x-amzn-trace-id': 'Root=1-604652c5-5af5c3456fb37df104aef536'},
  'RetryAttempts': 0},
 'Results': [{'Place': {'AddressNumber': '2',
    'Country': 'JPN',
    'Geometry': {'Point': [139.80945027424463, 35.71003896450161]},
    'Label': '東京都墨田区押上1-1-2',
    'Neighborhood': '1',
    'PostalCode': '1310045',
    'Region': '東京都'}}],
 'Summary': {'DataSource': 'Esri',
  'FilterCountries': ['JPN'],
  'MaxResults': 1,
  'ResultBBox': [139.80945027424463,
   35.71003896450161,
   139.80945027424463,
   35.71003896450161],
  'Text': '東京都墨田区押上1丁目1−2'}}


Geometryと記載がある箇所に位置情報が入っているので、緯度経度を取得したい場合は下記のように書くと取得可能

response['Results'][0]['Place']['Geometry']['Point']
[139.80945027424463, 35.71003896450161]

位置も合っていることを確認(住所の範囲により、多少ずれるのは住所からの変換による限界)
f:id:hktech:20210309014447p:plain



Amazon Location APIの料金について

Amazon Location APIの特徴として、極めて安価という点があります。1000件あたり$0.5なのでGoogle Maps PlatformのAPIと比べて10倍安い計算になります。これはAWS一択ですね。

f:id:hktech:20210309012857p:plain

f:id:hktech:20210309012950p:plain


まとめ

最近リリースされたAmazon Location APIPythonから操作してみました。いろいろな例で試してみましたが、住所からの検索であればほぼ正確な位置情報を取得することができるため、Google Maps APIの代わりとして使えそうです。位置情報の分析をしている方はぜひ使ってみてはいかがでしょうか。