はじめに
こんにちは、AWS DevTools Hero の桐本です。
本日は、2024 年 11 月に新バージョンがリリースされた Amazon Location Service と、オープンソース GIS ソフトウェアである QGIS の組み合わせについてご紹介します。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
builders.flash メールメンバー登録
1. Amazon Location Service とは ?
Amazon Location Service は、AWS が提供する位置情報サービスで、2024 年 11 月に新バージョンがリリースされました。今回のアップデートでは、新機能の追加により利便性が大幅に向上しています。
とくに注目すべきポイントは、リソース作成が不要になり、統一されたエンドポイントで API を利用できるようになったことです。これにより、ユーザーは個別にリソースを作成することなく、すぐに API を利用できるようになりました。
さらに、Maps API、Places API、Routes API にも大幅な機能拡張や新機能が追加 され、利用範囲が広がっています。
2024 年 5 月、本国のサービスチームからオファーをいただき、このアップデートの検証に携わりました。

3. QGIS 版 Amazon Location Service Plugin とは ?
QGIS 版 Amazon Location Service Plugin をオープンソースで公開しました。このプラグインは、Amazon Location Service の地図表示、ジオコーディング、ルーティングなどの機能を QGIS 上で手軽に利用できるようにする世界初の試みです。現時点ではすべての機能を実装していませんが、今後さらに機能を追加していく予定です。
今回は、このプラグインを利用し Amazon Location Service と QGIS を組み合わせる方法を紹介します。
4. 事前準備
Amazon Location Service の API キー作成
Amazon Location Service の API キーを作成します。
AWSマネジメントコンソール → Amazon Location Service → 「API キー」をクリックします。

「API キーの作成」をクリック
「API キーの作成」をクリックします。

API キー名・リソースとアクションを設定
API キー名・リソースとアクションを設定 → 「API キーの作成」をクリックします。
Maps・Places・Routesそれぞれの機能の利用有無を設定します。今回は図のような設定で作成します。

表示された API キーをメモ
API キー作成後、「API キー値を表示」をクリック → 表示された API キーをメモします。

QGIS のインストール
QGIS をインストールします。
QGIS オフィシャルサイト にアクセス → 「Download」をクリックします。

対象の OS の LTS バージョンをダウンロードし、インストール
対象の OS の LTS バージョンをダウンロードします。今回は Mac 版をダウンロードします。
ダウンロード後、ローカルにインストールします。インストール方法の詳細は 「QGISを始めよう!QGISのインストール手順について紹介 〜Windows版、Mac版〜」 をご覧ください。

QGIS 版 Amazon Location Service Plugin のインストール
QGIS のインストール後、プラグインをインストールします。プラグインは公式リポジトリに登録されており、QGIS 上から直接インストール可能です。
「プラグイン」→「プラグインを管理およびインストール」を選択 → 「Amazon Location Service」や「AWS」で検索します。

表示メニューを確認
プラグインがインストールされたらメニューが表示されます。メニューは、Config、Maps、Places、Routes、Terms の 5 種類があります。
Config : API キーとリージョン名を設定
Maps : 地図表示機能
Places : ジオコーディング機能
Routes : ルーティング機能
Terms : 利用規約ページを表示

Amazon Location Service Plugin で API キーとリージョン名の設定
プラグインの設定画面から、API キーとリージョン名を設定します。
「Config」メニューをクリック
各リソース名と API キーを設定
Region : ap-xxxxx
API Key : v1.public.xxxxx
「Save」をクリック
ここまでで、事前準備は完了です。次に機能の紹介をします。

5. マップ機能
地図表示機能では、ラッパー API にスタイル名・リージョン名・API キーを指定してリクエストすることで、QGIS 上にラスタタイルレイヤーを作成します。Amazon Location Service の 2024 年 11 月にリリースされた新バージョンでは、従来のマップスタイルが廃止され、AWS オリジナルの「Standard・Monochrome・Hybrid・Satellite」の 4 種類のマップスタイルが利用可能になりました。
「Maps」メニューをクリック
「Style Name」を選択
「Add」をクリック
背景地図がレイヤーで表示
maps.py
def add_xyz_tile_layer(self, selected_style: str) -> str:
"""
Adds an XYZ tile layer (raster tile) into the current QGIS project using
configuration settings.
"""
try:
region_value, apikey_value = self.get_configuration_settings()
tile_url = (
f"https://als.dayjournal.dev/{region_value}/{selected_style}/"
f"{{z}}/{{x}}/{{y}}?APIkey={apikey_value}"
)
layer_url = f"type=xyz&url={tile_url}&zmin=0&zmax=18"
xyz_tile_layer = QgsRasterLayer(layer_url, selected_style, "wms")
QgsProject.instance().addMapLayer(xyz_tile_layer)
except KeyError as e:
raise KeyError(f"Missing configuration for {e!r}") from e
except Exception as e:
raise Exception(f"Failed to load XYZ tile layer: {e!r}") from e
ラッパーAPIとして、独自に構築したエンドポイント「https://als.dayjournal.dev/{region_value}/{selected_style}/{{z}}/{{x}}/{{y}}?APIkey={apikey_value}」に指定パラメータをGETリクエストで送信することで、ラスタタイルのレスポンスを受け取ることができます。
Amazon Location Service では、GetStyleDescriptor API を利用することで、ベクトルタイルのデータとスタイルを取得できます。しかし、QGIS や一部の Web マップライブラリでは、ベクトルタイルのスタイルに完全には対応していない場合が多いため、正確なスタイル表現が難しくなることがあります。そこで今回は、ラスタタイルへの変換配信に chiitiler を採用し、ラッパー API を構築することで、オリジナルのスタイルをラスタタイルとして正しく表示できるようにしました。ラッパー API には、AWS WAF・Amazon CloudFront・AWS Lambda を利用し、サーバーレス構成で実装しました。この API の詳細については、また別の機会に紹介したいと思います。
こちらはコードの一部です。
(/location_service/functions/places.py)
6. ジオコーディング機能
ジオコーディング機能では、SearchText API にリクエストすることで、QGIS 上に取得した POI データのポイントレイヤーを作成します。SearchText 機能を利用すると、指定した範囲内の POI データを検索し、その結果を取得できます。以前は、"SearchPlacesForText" と呼ばれていたものが名称変更され、機能が強化されました。
※ 2025.01 現在、SearchText のみ利用可能
「Places」メニューをクリック
「Select Function」を選択
「QueryText」にテキスト入力
「Get Location」をクリック
検索したい位置をクリック
「Search」をクリック
検索結果がレイヤーで表示
places.py
「https://places.geo.{region}.amazonaws.com/v2/search-text?key={apikey}」に指定パラメータを POST リクエストで送信することで、候補のポイントデータを含むレスポンスを受け取ることができます。SearchText API を利用することで、さまざまな条件でデータを取得することが可能です。今回は、Language・MaxResults・QueryText・BiasPosition をパラメータとして指定しています。コードの一部を紹介します。
SearchText APIdef search_text(self, text: str, lon: float, lat: float) -> Dict[str, Any]:
"""
Searches for a places index based on the provided longitude and
latitude coordinates.
Args:
lon (float): Longitude of the position to search.
lat (float): Latitude of the position to search.
Returns:
A dictionary containing the API request results with place information.
"""
region, apikey = self.get_configuration_settings()
place_url = (
f"https://places.geo.{region}.amazonaws.com/v2/search-text?key={apikey}"
)
data = {
"Language": self.PLACES_LANGUAGE,
"MaxResults": self.PLACES_MAX_RESULTS,
"QueryText": text,
"BiasPosition": [lon, lat],
}
result = self.api_handler.send_json_post_request(place_url, data)
if result is None:
raise Exception("Failed to receive a valid response from the API.")
return result
(/location_service/functions/places.py)
7. ルーティング機能
ルーティング機能では、CalculateRoutes API にリクエストすることで、QGIS 上に取得したルートデータのラインレイヤーを作成します。CalculateRoutes 機能を利用すると、指定した出発地と目的地を基にルートを計算し、その結果を取得できます。
※ 2025 年 1 月現在、CalculateRoutes のみが利用可能です。
「Routes」メニューをクリック
「Select Function」を選択
「Get Location (Starting Point)」をクリック
始点をクリック
「Get Location (End Point)」をクリック
終点をクリック
「Search」をクリック
検索結果がレイヤーで表示
routes.py
「https://routes.geo.{region}.amazonaws.com/v2/routes?key={apikey}」に指定パラメータを POST リクエストで送信することで、候補のラインデータを含むレスポンスを受け取ることができます。CalculateRoutes API を利用することで、さまざまな条件でデータを取得することが可能です。今回は、Origin・Destination・LegGeometryFormat をパラメータとして指定しています。コードの一部を紹介します。
CalculateRoutes APIdef calculate_routes(
self, st_lon: float, st_lat: float, ed_lon: float, ed_lat: float
) -> Dict[str, Any]:
"""
Calculates a route from start to end coordinates using an external API.
Args:
st_lon (float): Longitude of the start position.
st_lat (float): Latitude of the start position.
ed_lon (float): Longitude of the end position.
ed_lat (float): Latitude of the end position.
Returns:
A dictionary containing the calculated route data.
"""
region, apikey = self.get_configuration_settings()
routes_url = f"https://routes.geo.{region}.amazonaws.com/v2/routes?key={apikey}"
data = {
"Origin": [st_lon, st_lat],
"Destination": [ed_lon, ed_lat],
"LegGeometryFormat": "Simple",
}
result = self.api_handler.send_json_post_request(routes_url, data)
if result is None:
raise ValueError("Failed to receive a valid response from the API.")
return result
(/location_service/functions/routes.py)
8. API キー削除
8. まとめ
新バージョンの Amazon Location Service と QGIS を組み合わせ、QGIS 版 Amazon Location Service Plugin をオープンソースで公開しました。これにより、オープンソース GIS ソフトウェア環境での AWS 利活用の可能性が広がりました。今後も機能を追加し、さらに使いやすいツールへと進化させていく予定です。
また、Amazon Location Service にはデータ利用について 利用規約 があります。「82. Amazon Location Serviceプレビュー」の項目をご確認の上ご利用ください。
今回の内容が、AWS で位置情報アプリケーションの構築を検討している方々の参考になれば幸いです!
筆者プロフィール
桐本 靖規
Co-Founder and CEO of MIERUNE
AWS DevTools Hero | Amplify Japan User Group | MapLibre User Group Japan |
MapLibre Voting Member | OSGeo Charter Member | Owner of dayjournal
2004 年から位置情報分野に携わり、2016 年に MIERUNE を共同創業。独自のカルチャーを持つプロフェッショナルなチーム作りや、プロダクト成功のための組織マネジメントに注力し日々模索中。個人活動では、オープンソースへの貢献や、コミュニティの運営メンバーとしてカンファレンスやワークショップを開催。専門は GIS (Geographic Information System) と FOSS4G (Free and OpenSource Software for Geospatial)。AWS と位置情報技術の組み合わせを日々模索中。
好きな AWS サービス: Amazon Location Service / AWS Amplify
Twitter: @dayjournal_nori
GitHub: @dayjournal
LinkedIn: @YasunoriKirimoto

Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages