Amazon Location APIとPythonを使って住所を緯度経度に変換する
位置情報系の分析をしていると、店舗などの住所情報を緯度経度に変換したいケースがあるかと思います。今回は2020年12月にリリースされたAWSの位置情報サービスであるAmazon LocationをPythonから操作することでテキストの住所から緯度経度情報を取得してみました。
Amazon Locationとは
Amazon Locationとは、2020年12月にリリースされたAWSの位置情報サービスです。Amazon Locationは現時点(2021.03)では以下4つの機能を使うことができます。
- Maps
- Place indexes
- Geofence collections
- Trackers
実際にAmazon Locationのコンソール画面で見るとこのような形で上記の機能を画面上で試すことができます。
東京スカイツリーと打つと、東京スカイツリーの場所がマップ上で表示されています。
今回はこちらのPlace index上でクエリを投げて緯度経度を返す処理を、APIを通して実行してみました。
Amazon Location API
今回はAWSで用意されているSearchPlaceIndexForText APIを使って、テキストから緯度経度を取得します。
SearchPlaceIndexForText - Amazon Location Service Places
主なパラメータは以下です。
Amazon Location APIをPythonのboto3で操作する
APIをPythonで操作します。今回はboto3というライブラリでAmazon Location APIにリクエストを投げてみます
まずはboto3をインストール
pip install boto3
それでは実際に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
レスポンスとしては下記のような結果が返ってくる。
{'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]
位置も合っていることを確認(住所の範囲により、多少ずれるのは住所からの変換による限界)
Amazon Location APIの料金について
Amazon Location APIの特徴として、極めて安価という点があります。1000件あたり$0.5なのでGoogle Maps PlatformのAPIと比べて10倍安い計算になります。これはAWS一択ですね。
まとめ
最近リリースされたAmazon Location APIをPythonから操作してみました。いろいろな例で試してみましたが、住所からの検索であればほぼ正確な位置情報を取得することができるため、Google Maps APIの代わりとして使えそうです。位置情報の分析をしている方はぜひ使ってみてはいかがでしょうか。