Amazon Location Service の新機能を QGIS で利用する

2025-03-03
コミュニティ通信

Author : 桐本 靖規 (AWS DevTools Hero)

こんにちは、AWS DevTools Hero の桐本です。

本日は、2024 年 11 月に新バージョンがリリースされた Amazon Location Service と、オープンソース GIS ソフトウェアである QGIS の組み合わせについてご紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. Amazon Location Service とは ?

Amazon Location Service は、AWS が提供する位置情報サービスで、2024 年 11 月に新バージョンがリリースされました。今回のアップデートでは、新機能の追加により利便性が大幅に向上しています。
とくに注目すべきポイントは、リソース作成が不要になり、統一されたエンドポイントで API を利用できるようになったことです。これにより、ユーザーは個別にリソースを作成することなく、すぐに API を利用できるようになりました。
さらに、Maps API、Places API、Routes API にも大幅な機能拡張や新機能が追加 され、利用範囲が広がっています。

2024 年 5 月、本国のサービスチームからオファーをいただき、このアップデートの検証に携わりました。


2. QGISとは ?

QGIS は、地理空間情報を扱うクロスプラットフォームのオープンソース GIS ソフトウェアです。地図データの作成・編集・分析・可視化などの基本機能に加え、豊富なプラグインを活用した高度なカスタマイズや空間解析が可能です。自治体、教育機関、企業など、幅広い分野で利用されています。

QGIS についてさらに詳しく知りたい方は、QGIS LAB というメディアサイトもぜひご覧ください。

 


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 キーの作成」をクリックします。

Maps・Places・Routesそれぞれの機能の利用有無を設定します。今回は図のような設定で作成します。

画像をクリックすると拡大します

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

画像をクリックすると拡大します

QGIS のインストール

QGIS をインストールします。

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

画像をクリックすると拡大します

対象の 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 キーとリージョン名を設定します。

  1. Config」メニューをクリック
  2. 各リソース名と API キーを設定
    • Region : ap-xxxxx
    • API Key : v1.public.xxxxx
  3. Save」をクリック

画像をクリックすると拡大します

ここまでで、事前準備は完了です。次に機能の紹介をします。


5. マップ機能

地図表示機能では、ラッパー API にスタイル名・リージョン名・API キーを指定してリクエストすることで、QGIS 上にラスタタイルレイヤーを作成します。Amazon Location Service の 2024 年 11 月にリリースされた新バージョンでは、従来のマップスタイルが廃止され、AWS オリジナルの「Standard・Monochrome・Hybrid・Satellite」の 4 種類のマップスタイルが利用可能になりました。

  1. Maps」メニューをクリック
  2. Style Name」を選択
  3. Add」をクリック
  4. 背景地図がレイヤーで表示

/location_service/functions/maps.py

ラッパー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 の詳細については、また別の機会に紹介したいと思います。

コードの一部を紹介します。

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

6. ジオコーディング機能

ジオコーディング機能では、SearchText API にリクエストすることで、QGIS 上に取得した POI データのポイントレイヤーを作成します。SearchText 機能を利用すると、指定した範囲内の POI データを検索し、その結果を取得できます。以前は、"SearchPlacesForText" と呼ばれていたものが名称変更され、機能が強化されました。

※ 2025.01 現在、SearchText のみ利用可能

  1. Places」メニューをクリック
  2. Select Function」を選択
  3. QueryText」にテキスト入力
  4. Get Location」をクリック
  5. 検索したい位置をクリック
  6. Search」をクリック
  7. 検索結果がレイヤーで表示

/location_service/functions/places.py

https://places.geo.{region}.amazonaws.com/v2/search-text?key={apikey}」に指定パラメータを POST リクエストで送信することで、候補のポイントデータを含むレスポンスを受け取ることができます。

SearchText API を利用することで、さまざまな条件でデータを取得することが可能です。今回は、Language・MaxResults・QueryText・BiasPosition をパラメータとして指定しています。

コードの一部を紹介します。

def 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

7. ルーティング機能

ルーティング機能では、CalculateRoutes API にリクエストすることで、QGIS 上に取得したルートデータのラインレイヤーを作成します。CalculateRoutes 機能を利用すると、指定した出発地と目的地を基にルートを計算し、その結果を取得できます。

※ 2025 年 1 月現在、CalculateRoutes のみが利用可能です。

  1. Routes」メニューをクリック
  2. Select Function」を選択
  3. Get Location (Starting Point)」をクリック
  4. 始点をクリック
  5. Get Location (End Point)」をクリック
  6. 終点をクリック
  7. Search」をクリック
  8. 検索結果がレイヤーで表示

/location_service/functions/routes.py

https://routes.geo.{region}.amazonaws.com/v2/routes?key={apikey}」に指定パラメータを POST リクエストで送信することで、候補のラインデータを含むレスポンスを受け取ることができます。

CalculateRoutes API を利用することで、さまざまな条件でデータを取得することが可能です。今回は、Origin・Destination・LegGeometryFormat をパラメータとして指定しています。

コードの一部を紹介します。

def 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

8. API キー削除

最後に、API キーを削除します。

対象の API キー名をクリックします。

画像をクリックすると拡大します

無効化」処理をします。

画像をクリックすると拡大します

画像をクリックすると拡大します

削除」処理をします。

画像をクリックすると拡大します

画像をクリックすると拡大します


8. まとめ

新バージョンの Amazon Location Service と QGIS を組み合わせ、QGIS 版 Amazon Location Service Plugin をオープンソースで公開しました。これにより、オープンソース GIS ソフトウェア環境での AWS 利活用の可能性が広がりました。今後も機能を追加し、さらに使いやすいツールへと進化させていく予定です。

また、Amazon Location Service にはデータ利用について 利用規約 があります。「82. Amazon Location Serviceプレビュー」の項目をご確認の上ご利用ください。

今回の内容が、AWS で位置情報アプリケーションの構築を検討している方々の参考になれば幸いです!


builders.flash メールメンバーへ登録することで
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

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する