Amazon Location Serviceについて試してみた

# 背景・目的
AWSに、位置情報、マップのサービスとしてLocation Serviceというサービスがあります。
こちらについて概要を整理し、簡単に試してみます。

# まとめ

下記に特徴を整理します。

|特徴|説明|
|:--|:--|
|Amazon Location Service |・位置データと機能をアプリケーションに追加できる<BR><BR>・グローバルプロバイダーからの高品質なデータを使用してLBS（ロケーションベースのサービス）を提供している<BR><BR>・手頃な価格のデータ、tracking、geofences、ヘルスモニタリング用の組み込みメトリクスにより、位置情報に対応した高度なアプリケーションを構築可能|
|匿名性|顧客メタデータとアカウント情報を削除し、データプロバイダーに送信されるすべてのクエリを匿名化できる|
|機密性|施設、アセット、人員の所在地など、トラッキング、geofencesに関する機密性が、高い位置情報がAWSアカウントからできることは一切ない|
|データの所有|Amazonや第三者は顧客のデータを販売したり、広告に使用したりする権利はない|
|統合|下記のサービスなどと統合されている<BR>・CloudTrail<BR>・CloudWatch<BR>・IAM<BR>・EventBridge|
|機能|主な機能は下記の通り<BR>・Maps<BR>・Places<BR>・Routing<BR>・Geofencing<BR>・Trackers|
|Mapsでできること|・マップの基になるベースマップデータにアクセス可能<BR><BR>・Map リソースとマップレンダリングライブラリを使用して、インタラクティブマップをアプリケーションに追加できる<BR><BR>・アプリケーションの必要に応じて、マーカー (またはピン)、ルート、ポリゴンエリアなどの他の機能をマップに追加できる|
|Placesでできること|・地理位置情報を検索する<BR><BR>・APIにより下記を検索できる<BR>　・レストランやランドマークなど、興味のあるポイント<BR>　・住所<BR>　・緯度と経度の位置で、関連する住所やその場所に関するその他の情報を受け取る<BR>　・部分的またはスペルが間違っている自由形式のテキストクエリ|
|Routingでできること|・道路やライブトラフィック情報に基づいてルートを検索、移動時間を推定<BR><BR>・任意の 2 つの場所間の移動時間、距離、ルートをアプリケーションに提供する機能を構築可能<BR><BR>・ルートマトリックスの時間と距離を計算して、ルートプランニングに役立てる|
|Geofencingでできること|・ジオフェンス (マップ上の仮想境界) の保存および管理<BR><BR>・位置の更新がジオフェンスコレクション内のいずれかのジオフェンスの境界を越えたときに通知を受け取ることが可能|
|Trackersでできること|・複数のデバイスの位置更新情報を保存<BR><BR>・デバイスの現在位置や位置履歴を照会できる|
|一般的なユースケース|・ユーザーエンゲージメントとジオマーケティングアプリケーション<BR><BR>・アセットトラッキングアプリケーション<BR><BR>・配信アプリケーション|


# 概要
下記の記事を基に整理します。

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/welcome.html

## Amazon Location Service とは？
> Amazon Location Service では、地図、目標地点、ジオコーディング、ルーティング、ジオフェンス、追跡などの機能を含む位置データと機能をアプリケーションに追加できます。Amazon Location は、信頼できるグローバルプロバイダーである Esri、Grab、HERE からの高品質なデータを使用して、ロケーションベースのサービス（LBS）を提供しています。手頃な価格のデータ、追跡機能、ジオフェンシング機能、ヘルスモニタリング用の組み込みメトリクスにより、位置情報に対応した高度なアプリケーションを構築できます。

- 下記の機能を含む位置データと機能をアプリケーションに追加できる
    - maps
    - points of interest
    - geocoding
    - routing
    - geofences
    - tracking
- Amazon Locationは、下記のグローバルプロバイダーからの高品質なデータを使用してLBS（ロケーションベースのサービス）を提供している
    - Esri
    - Grab
    - HERE
- 手頃な価格のデータ、tracking、geofences、ヘルスモニタリング用の組み込みメトリクスにより、位置情報に対応した高度なアプリケーションを構築できる

> Amazon Location を利用すれば、組織のデータを常に管理できます。Amazon Location は、顧客メタデータとアカウント情報を削除することで、データプロバイダーに送信されるすべてのクエリを匿名化します。さらに、施設、アセット、人員の所在地など、トラッキングやジオフェンシングに関する機密性の高い位置情報が、AWS アカウントから一切出ることはありません。これにより、機密情報を第三者から保護し、ユーザーのプライバシーを保護し、アプリケーションのセキュリティリスクを軽減できます。Amazon Location では、Amazon や第三者はお客様のデータを販売したり、広告に使用したりする権利を持ちません。


- 組織のデータを常に管理できる
- 顧客メタデータとアカウント情報を削除し、データプロバイダーに送信されるすべてのクエリを匿名化できる
- 施設、アセット、人員の所在地など、トラッキング、geofencesに関する機密性が、高い位置情報がAWSアカウントからできることは一切ない
- Amazonや第三者は顧客のデータを販売したり、広告に使用したりする権利はない


> Amazon Location は、、Amazon AWS CloudTrail、Amazon CloudWatch、および AWS Identity and Access Management (IAM) などの サービスと完全に統合 EventBridgeされています。Amazon Location は、データ統合により開発ワークフローを簡素化し、ビルトインのモニタリング、セキュリティ、コンプライアンス機能によりアプリケーションを本番環境に迅速に移行させます。

- 下記のサービスなどと統合されている
    - CloudTrail
    - CloudWatch
    - IAM
    - EventBridge

## Amazon Location の主な機能
### Maps
> Amazon Location Service Map は、位置情報を視覚化することができ、多くの位置情報サービス機能の基礎となっています。Amazon Location Service は、オープンデータマップのほか、グローバルな位置情報データプロバイダーである Esri、Grab、HERE から取得されたさまざまなスタイルのマップタイルを提供します。

- 位置情報の視覚化
- オープンデータマップ、Esri、Grab、HEREから取得されたマップを提供する

### Places
> Amazon Location Service Places を使用すると、検索機能をアプリケーションに統合したり、住所を緯度と経度の地理座標に変換（ジオコーディング）したり、座標を住所に変換（リバースジオコーディング）したりできます。Amazon Location Service では、Places 機能をサポートするために Esri、Grab、HERE から高品質の地理空間データを収集しています。

- 検索機能をアプリケーションに統合
- 住所を緯度と経度の地理座標に変換（ジオコーディング）
- 座標と住所に変換（リバースジオコーディング）

### Routing
> Amazon Location Service Routes では、 up-to-date 道路やライブトラフィック情報に基づいてルートを検索し、移動時間を推定できます。任意の 2 つの場所間の移動時間、距離、ルートをアプリケーションに提供する機能を構築できます。ルートマトリックスの時間と距離を計算して、ルートプランニングに役立てることができます。

- 道路やライブトラフィック情報に基づいてルートを検索、移動時間を推定
- 任意の 2 つの場所間の移動時間、距離、ルートをアプリケーションに提供する機能を構築可能
- ルートマトリックスの時間と距離を計算して、ルートプランニングに役立てる

### Geofencing
> Amazon Location Service Geofence を使用すると、ジオフェンスと呼ばれる定義された地理的境界にデバイスが出入りした際に、それを検出して動作する機能を、アプリケーションに提供できます。ジオフェンス違反が検出され EventBridge ると、エントリまたは終了イベントを Amazon に自動的に送信します。これにより、ターゲットに通知を送信するなどのダウンストリームアクションを開始できます。

- ジオフェンスと呼ばれる定義された地理的境界にデバイスが出入りした際に、それを検出して動作する機能を、アプリケーションに提供できる
- ジオフェンス違反が検出されると、 エントリまたは終了イベントをEventBridgeに自動的に送信する
- ターゲットに通知を送信する

### Trackers
> Amazon Location Service ストラッカーを使用すると、追跡対応アプリケーションを実行しているデバイスの現在位置と過去の位置を取得できます。また、トラッカーを Amazon Location Service ジオフェンスとリンクさせて、デバイスからの位置情報のアップデートをジオフェンスと照合して自動的に評価することもできます。トラッカーは、位置の更新をジオフェンスに保存または評価する前にフィルタリングすることで、コスト削減に役立ちます。

>  トラッカーを使用すると、追跡対象デバイスの機密位置情報がAWS アカウントから出ることはありません。これにより、機密情報を第三者から保護し、ユーザーのプライバシーを保護し、セキュリティリスクを軽減できます。

- 追跡対応アプリケーションを実行しているデバイスの位置情報と過去の位置情報を取得できる
- ジオフェンスとリンクさせて、デバイスからの位置情報のアップデートをジオフェンスと照合して自動的に評価できる
- 位置の更新をジオフェンスに保存または評価する前に、フィルタリングすることで、コスト削減に貢献する
- 追跡対象デバイスの機密位置情報がAWSアカウントから出ることはない

## Amazon Location Service の概念
下記のドキュメントを基に整理します。

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/how-it-works.html

### Amazon Location の概要
> Amazon Location Service は、 AWS リソースを通じてロケーションベースの機能やデータプロバイダーへのアクセスを提供します。Amazon Location には、必要な機能の種類に応じて 5 種類の AWS リソースが用意されています。さまざまなリソースを組み合わせて、完全なロケーションベースのアプリケーションを作成します。Amazon Location コンソール、Amazon Location 、APIsまたは を使用して、これらのリソースを 1 つ以上作成できますSDKs。

- 5種類のAWSリソースが用意されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/47e9b5a7-d02d-5030-477e-06ab544a6998.png)

出典：[Amazon Location の概要](https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/how-it-works.html)

### Maps
> Amazon Location Service Map リソースを使用すると、マップの基になるベースマップデータにアクセスできます。Map リソースとマップレンダリングライブラリを使用して、インタラクティブマップをアプリケーションに追加します。アプリケーションの必要に応じて、マーカー (またはピン)、ルート、ポリゴンエリアなどの他の機能をマップに追加できます。

- マップの基になるベースマップデータにアクセス可能
- Map リソースとマップレンダリングライブラリを使用して、インタラクティブマップをアプリケーションに追加できる
- アプリケーションの必要に応じて、マーカー (またはピン)、ルート、ポリゴンエリアなどの他の機能をマップに追加できる

#### マップスタイル
> マップリソースを作成するときは、そのリソースのマップスタイルを選択する必要があります。マップスタイルは、レンダリングされたマップの外観を定義します。例えば、次の画像は、同じデータプロバイダーを Amazon Location の異なるマップリソースの 2 つの異なるスタイルで表現したものです。1 つのスタイルは、マップ内のベクターデータに基づく一般的な道路スタイルです。もう 1 つは、衛星画像を示すラスターデータです。マップを拡大または縮小するとスタイルが変わる場合がありますが、通常、スタイルには一貫したテーマがあります。スタイル情報をマップレンダリングライブラリに渡す前に、スタイル情報の一部または全部をオーバーライドできます。

- マップリソースを作成時に、マップスタイルを選択する必要がある
- マップスタイルは、レンダリングされたマップの外観を定義する

#### Political views
:::note warn
適用法に準拠して使用する必要があるため、使用する場合は、事前に利用規約および法的要件を確認すること
:::


> Political viewsは、適用法に準拠して使用する必要があります。これには、Amazon Location Service を通じてアクセスする地図、画像、その他のデータ、およびサードパーティのコンテンツを利用できる国または地域のマッピングに関する法律が含まれます。

- 適用法に準拠して使用する必要がある

#### カスタムレイヤー
> カスタムレイヤーは、マップスタイルに対して有効化できる追加のレイヤーです。現在、 VectorEsriNavigation マップスタイルのみがPOIカスタムレイヤーをサポートしています。

- マップスタイルに対して、有効化できる追加レイヤー

> POI カスタムレイヤーを有効にすると、ショップ、サービス、レストラン、アトラクション、その他の名所など、さまざまな場所の豊富なセットがマップに追加されます。デフォルトでは、カスタムレイヤーは unset です。詳細については、「ロケーションAPIリファレンスMapConfiguration」の「」を参照してください。

- POI カスタムレイヤーを有効化することで、ショップ、サービス、レストラン、アトラクション、その他の名所など、さまざまな場所の豊富なセットがマップに追加されます。

#### マップレンダリング
> アプリケーションでマップをレンダリングするには、通常、マップレンダリングライブラリを使用します。ライブラリにはよく使われるオプションがいくつかあります。

> - MapLibre - MapLibre は、インタラクティブマップをレンダリングするためのオープンソースライブラリであり、Amazon Location Service からマップをレンダリングするための推奨方法です。 には、データソース (Amazon Location マップリソースなど) からラスターデータとベクトルデータをレンダリングする機能 MapLibre が含まれています。を拡張 MapLibre して、マップ上に独自のデータを描画できます。

> - Amplify — Amplify は、ウェブ、iOS、Android などのアプリケーションを構築するためのオープンソースフレームワークです。アプリケーションで Amplify を使用している場合は、Amazon Location 機能を含むように拡張できます。Amplify には、レンダリングマップなどの Amazon Location ベースのアプリケーションを作成するためのライブラリが含まれています。Amplify は MapLibre を使用してマップをレンダリングしますが、Amazon Location Service に固有の追加機能を提供して、より効率的に使用できるようにします。また、検索やその他の機能も追加します。

> - Tangram – Tangram は、 のようなインタラクティブマップをレンダリングする代替オープンソースライブラリです MapLibre。

> マップレンダリングライブラリは、ランタイムに Amazon Location Service からデータを取得し、選択したマップリソースに基づいてマップデータをレンダリングします。マップリソースは、使用するデータプロバイダーとマップスタイルを定義します。

- マップレンダリングのために、マップレンダリングライブラリを使用する

### 場所検索
> Amazon Location Service の主な機能は、地理位置情報を検索する機能です。Amazon Location は、プレースインデックスリソースを通じてこの機能を提供します。

- 地理位置情報を検索する機能

> 場所インデックスを使用してAPIs以下を検索できます。
> - レストランやランドマークなど、興味のあるポイント。名前で検索したり、検索したい場所を指定したりすると、関連性の高い順に並んだオプションのリストが表示されます。
> - 住所。その住所の緯度と経度が表示されます。これはジオコーディングと呼ばれます。
> - 緯度と経度の位置で、関連する住所やその場所に関するその他の情報を受け取ります。これはリバースジオコーディングと呼ばれます。
> - 部分的またはスペルが間違っている自由形式のテキストクエリ (通常はユーザーが入力したもの)。これはオートコンプリート、オートサジェスト、またはファジーマッチングと呼ばれます。

- APIにより下記を検索できる
    - レストランやランドマークなど、興味のあるポイント
    - 住所
    - 緯度と経度の位置で、関連する住所やその場所に関するその他の情報を受け取る
    - 部分的またはスペルが間違っている自由形式のテキストクエリ

### ルート
#### ルート計算リソース

> ルート計算リソースを使用すると、選択したデータプロバイダーからの up-to-date 道路網とライブトラフィック情報に基づいてルートを検索し、移動時間を推定できます。

> Routes を使用してAPIs、アプリケーションが任意の 2 つの場所間のルートの移動時間、距離、ジオメトリをリクエストできる機能を構築できます。Routes を使用してAPI、1 回のリクエストで出発地と目的地の間の移動時間と距離をリクエストし、行列を計算することもできます。

- 最新の道路網とライブトラフィック情報に基づいてルートを検索し、移動時間を推定できる
- 任意の 2 つの場所間のルートの移動時間、距離、ジオメトリをリクエストできる機能を構築できる



### ジオフェンスとトラッカー
> このセクションでは、Amazon Location Service のジオフェンスとトラッカーの使用に関する概念の概要を説明します。ジオフェンスはポリゴンの境界線で、デバイスや位置がエリアに出入りしたときに通知を受けることができます。トラッカーリソースは、デバイスが移動するたびにその位置を保存および更新するために使用されます。

- ポリゴンの境界線
- デバイスや位置がエリアに出入りしたときに通知を受けることができる

#### ジオフェンス
> ジオフェンスコレクションリソースを使用すると、ジオフェンス (マップ上の仮想境界) を保存および管理できます。ジオフェンスコレクションリソースと照らし合わせて位置を評価し、位置の更新がジオフェンスコレクション内のいずれかのジオフェンスの境界を越えたときに通知を受け取ることができます。

- ジオフェンス (マップ上の仮想境界) の保存および管理
- 位置の更新がジオフェンスコレクション内のいずれかのジオフェンスの境界を越えたときに通知を受け取ることが可能

#### トラッカー
> トラッカーは、複数のデバイスの位置更新情報を保存します。トラッカーを使用して、デバイスの現在位置や位置履歴を照会できます。更新情報を保存しますが、保存する前に位置をフィルタリングすることで、ストレージスペースを減らし、視覚的なノイズを減らします。

- 複数のデバイスの位置更新情報を保存
- デバイスの現在位置や位置履歴を照会できる

## Amazon Location Service を使用する一般的なユースケース

下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/common-usecases.html

### ユーザーエンゲージメントとジオマーケティングアプリケーション
> 以下は、Amazon Location を使用したユーザーエンゲージメントとジオマーケティングのアプリケーションアーキテクチャを示しています。
> このアーキテクチャでは、次のことが可能になります。
> - ターゲットの近さに基づいてイベントを開始することで、近くの顧客にオファーを送ったり、店舗を去ったばかりの顧客を引き付けたりできます (ジオターゲティングと呼ばれます)。
> - 顧客のデバイスの位置を地図上で視覚化して、時間の経過に伴う傾向を監視します。
> - 顧客のデバイス位置を保存して、時間をかけて分析できるようにする。
> - ロケーション履歴を分析して、傾向や最適化の機会を特定します。

- ジオターゲティング
- 顧客のデバイスについて可視化
- 分析

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/903409e5-ffe9-0dcc-3bb7-45eeac24db83.png)

出典：[ユーザーエンゲージメントとジオマーケティングアプリケーション](https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/user-engagement-geomarketing.html)

- Step1:Geofenceコレクションに、Geofenceを作成しトラッカーをそれらにリンクする
- Step2:Geofenceの対象エリアに出入りする利用者に対して通知を送信するEventBridngeを設定する
- Step3:利用者の位置とGeofenceを地図上に表示する
- Step4:位置データを長期保存し、分析する

### アセットトラッキングアプリケーション
> 以下は、Amazon Location を使用するアセットトラッキングアプリケーションアーキテクチャの例です。
> このアーキテクチャでは、次のことが可能になります。
> - 資産の位置を地図上に表示して全体像を把握できます。例えば、運用チームや計画チームに役立つように、過去の場所やイベントを含むヒートマップを表示できます。
> - アセットの近さに基づいてイベントを開始し、荷物の到着に備えて荷物の到着に備えて処理時間を短縮するよう受領部門に通知します。
> - 資産の場所を保存して、バックエンドアプリケーションでアクションを開始したり、データを時系列的に分析したりできます。
> - ロケーション履歴を分析して、傾向や最適化の機会を特定します。

- 資産の位置を地図上に表示して全体像を把握する
- アセットの近さに基づいてイベントを開始し、荷物の到着に備えて処理時間を短縮するよう受領部門に通知する
- ロケーション履歴を分析して、傾向や最適化の機会を特定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1716c50c-5b81-7ede-1c00-52d89e89a076.png)
出典：[アセットトラッキングアプリケーション](https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/asset-tracking.html)

- Step1:Geofenceコレクションに、Geofenceを作成しトラッカーをそれらにリンクする
- Step2:通知送信orプロセス開始用のEventBridgeを設定する
- Step3:追跡対象アセットとアクティブなジオフェンスを地図上に表示する
- Step4:位置データを長期保存し、分析する

### 配信アプリケーション
> 以下は、Amazon Location を使用する配信アプリケーションアーキテクチャの例です。
> このアーキテクチャでは、次のことが可能になります。
> - 配達業者の近さに基づいてイベントを開始することで、集荷の準備が間に合い、配達が到着すると顧客に通知できるようになります。
> - ドライバーの所在地だけでなく、乗車場所や降車場所もほぼリアルタイムで地図上に表示し、派遣チームに全体像を把握できます。
> - 配送業者の位置情報を保存して、バックエンドアプリケーションで操作したり、時間をかけて分析したりできるようにします。
> - ロケーション履歴を分析して、傾向や最適化の機会を特定します。

- 配達業者の近さに基づいてイベントを開始することで、集荷の準備が間に合い、配達が到着すると顧客に通知できる
- ドライバーの所在地だけでなく、乗車場所や降車場所もほぼリアルタイムで地図上に表示できる
- 分析


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3a031458-79f4-c095-9ce6-ac6167b25a44.png)

出典:[配信アプリケーション](https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/delivery.html)

- Step1:Geofenceコレクションに、追加対象デバイスをリンクする
- Step2:注文の予約時に、Geofenceを自動的に追加及び削除するLambdaを作成する
- Step3:通知送信orプロセス開始用のEventBridgeを設定する
- Step4:追跡対象アセットとアクティブなジオフェンスを地図上に表示する
- Step5:位置データを長期保存し、分析する


## データプロバイダーとは何ですか？
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/what-is-data-provider.html

> Amazon Location Service を使用すると、第三者との契約や統合を必要とせずに、 AWS アカウントを通じて複数のデータプロバイダーの位置情報リソースにアクセスできます。これにより、サードパーティのアカウント、認証情報、ライセンス、請求を管理しなくても、アプリケーションの構築に集中できます。

- データプロバイダーの位置情報リソースにアクセス可能
- 第三者との契約、統合は不要
- サードパーティのアカウント、認証情報、ライセンス、請求の管理が不要

> 次の Amazon Location Service はデータプロバイダーを使用します。
> - マップ — マップリソースを作成 するときに、さまざまなマッププロバイダーからスタイルを選択します。マップリソースを使用して、データを視覚化するインタラクティブなマップを構築できます。
> - 場所 — ジオコーディング、リバースジオコーディング、検索のクエリをサポートするプレースインデックスリソースを作成時に、データプロバイダーを選択してください。
> - ルート — ルート計算リソースを作成する ときに、さまざまな地域やアプリケーションでのルート計算のクエリをサポートするデータプロバイダーを選択してください。Amazon Location Service では、選択したデータプロバイダーを使用して、 up-to-date 道路ネットワークデータ、ライブトラフィックデータ、計画的な閉鎖、過去のトラフィックパターンに基づいてルートを計算できます。

- 下記のLocation Serviceでデータプロバイダーを使用する
    - Maps
    - Places
    - Routing

### データプロバイダーの対象範囲と機能
::: note info
2024/8/17時点の情報を下にしています。[最新](https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/what-is-data-provider.html#data-provider-coverage)は、こちらをご確認ください。
:::

|プロバイダー|地理カバレッジ|機能カバレッジ|AWSリージョン|
|:--|:--|:--|:--|
|Esri|グローバル|maps<BR>Places<BR>Routing|Location Serviceが利用可能なすべてのリージョン|
|Grab|東南アジア※1|maps<BR>Places<BR>Routing|シンガポールリージョンのみ|
|HERE|グローバル|maps<BR>Places<BR>Routing|Location Serviceが利用可能なすべてのリージョン|
|オープンデータ|グローバル|maps|Location Serviceが利用可能なすべてのリージョン|


※1 Grab は、以下の国/地域の詳細データを提供しています。

- マレーシア
- フィリピン
- タイ
- シンガポール
- ベトナム
- インドネシア
- ミャンマー
- カンボジア


## 料金
下記のドキュメントを基に整理します。

https://aws.amazon.com/jp/location/pricing/

:::note info
- 下記の料金は、東京リージョンを基にしています。
- 2024/8/17時点の料金です
:::

|リソース | カテゴリ|料金|
|:--|:--|:--|
|Maps|商用データプロバイダー|0.040 USD/1,000マップタイル|
||Open Data|0.035 USD/1,000マップタイル|
|Places|アドレス提案リクエスト	|0.20 USD/1,000|
||ジオコーディングされた住所とリバースジオコーディングされた住所*|0.50 USD/1,000|
||ジオコーディングされた住所とリバースジオコーディングされた住所 (保存結果)|4.00 USD/1,000|
|Routing|算出されたルート|0.50 USD / 1,000|
||算出された Matrix ルート|0.50 USD / 1,000 |
|Trackers|位置の書き込み<BR>0～500,000	|0.0 5USD / 1,000|
||位置の書き込み<BR>500,001～5,000,000	|0.035 USD / 1,000|
||位置の書き込み<BR>5,000,001～50 M	|0.025 USD / 1,000|
||位置の書き込み<BR>50 M 以上|0.0125USD/1,000|
||その他のトラッキング API<BR>位置のバッチ読み込み|0.05 USD / 1,000|
||その他のトラッキング API<BR>削除されたデバイス	|0.05 USD / 1,000 |
||その他のトラッキング API<BR>評価された位置の完全性|1.00 USD / 1,000|
|Geofencing|評価された位置<BR>0～250,000|0.16 USD / 1,000|
||評価された位置<BR>250,001～2,000,000|0.11 USD / 1,000|
||評価された位置<BR>2,000,001～25 M|0.07 USD / 1,000| 
||評価された位置<BR>25 M 以上|0.06USD / 1,000|
||その他のジオフェンシング API<BR>作成、削除、記述されたジオフェンス|0.05 USD / 1,000|
||その他のジオフェンシング API<BR>ジオフェンスリストのリクエスト|0.05 USD / 1,000|
||その他のジオフェンシング API<BR>保存されたジオフェンス月数|0.20USD / 1,000
||その他のジオフェンシング API<BR>リクエストされたジオフェンスイベント予測|1.75USD / 1,000|
|サービスリソース|リソースの作成、読み取り、更新、削除、またはリストのリクエスト|0.01USD / 1,000|

# 実践
## 前提
:::note info 
参考とするドキュメントでは、Cloud9を基にしていますが、新規の作成が停止されたためVScodeで実装します。
:::

:::note warn
データプロバイダは各自の責任で選択してください。
:::

下記を前提に試しています。
- Cloud Shell
- MacOS
- AWS CLI
- jq
- データプロバイダは、Esriを利用

## 環境のセットアップ
### サンプルリポジトリのダウンロード
1. ローカルにサンプルリポジトリをダウンロードします
    ```bash
    $ git clone https://github.com/aws-samples/amazon-location-samples.git
    Cloning into 'amazon-location-samples'...
    remote: Enumerating objects: 3564, done.
    remote: Counting objects: 100% (343/343), done.
    remote: Compressing objects: 100% (208/208), done.
    remote: Total 3564 (delta 186), reused 264 (delta 126), pack-reused 3221 (from 1)
    Receiving objects: 100% (3564/3564), 131.60 MiB | 16.41 MiB/s, done.
    Resolving deltas: 100% (1879/1879), done.
    $
    ```
1. ダウンロードしたリポジトリをVSCodeのワークスペースに追加します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/003ee2f7-9b9a-667b-1a17-303da29ef47f.png)

### パッケージのインストール
1. ディレクトリを移動します
    ```bash
    $ cd amazon-location-samples/amplify-ui-geo-explore/
    ```
1. パッケージをインストールします
    ```bash
    $ npm install
    ```
    - package.jsonは下記のようになっています
        ```json
        {
          "name": "amplify-ui-geo-explore",
          "version": "1.5.0",
          "type": "module",
          "scripts": {
            "start": "vite",
            "build": "vite build",
            "preview": "vite preview"
          },
          "dependencies": {
            "@aws-amplify/ui-react": "^5.0.4",
            "@aws-amplify/ui-react-geo": "^1.0.1",
            "aws-amplify": "^5.3.12",
            "maplibre-gl-draw": "^1.5.7",
            "react": "^18.2.0",
            "react-dom": "^18.2.0"
          },
          "devDependencies": {
            "@types/react": "^18.2.14",
            "@types/react-dom": "^18.2.6",
            "@vitejs/plugin-react": "^4.0.1",
            "eslint": "^8.44.0",
            "eslint-plugin-react": "^7.32.2",
            "eslint-plugin-react-hooks": "^4.6.0",
            "eslint-plugin-react-refresh": "^0.4.1",
            "vite": "^4.5.2"
          },
          "license": "MIT-0"
        }
        ```
### Location Serviceリソースの作成
#### マップ
:::note info
ドキュメントでは、CloudFormation （Option1）の選択肢もありますが、今回は手動（Option2）で実行します。
:::

1. AWSにサインインし、Location Serviceに移動します
1. ナビゲーションペインで「マップ」をクリックします
1. 名前に「WorkshopMap」を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fdc7f98b-0192-7b71-6636-1c53abe208f9.png)
1. マップでは下記を選択し、「マップを作成」をクリックします
    - フィルター：Esri
    - 属性：すべて
    - タイプ：Vector
    - ポリティカルビュー：なし
    - 利用規約の同意
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d4cc812a-30c7-926e-a85d-b6b3233a3ed1.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eaa4e943-a125-4d29-f9d3-a199c6654075.png)
1. 作成されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dba82167-16de-d61b-a0a4-e7cc6f834ef6.png)

#### プレースインデックス
1. ナビゲーションペインで、「インデックスの配置」をクリックします
1. 「プレーンインデックスを作成」をクリックします
1. 下記を入力し、「プレースインデックスを作成」をクリックします
    - 名前
    - データプロバイダ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/888ecdda-f91d-c4d8-c1aa-581de4889f00.png)
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0e992a0a-babc-af5a-e688-266b73ec7065.png)

#### ルート計算ツール
1. ナビゲーションペインで、「ルート計算ツール」をクリックします
1. 「ルート計算ツールを作成」をクリックします
1. 下記を入力し、「ルート計算ツールを作成」をクリックします
    - 名前
    - データプロバイダ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f379bfbc-94df-f6a2-8184-13d603e41b2d.png)
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b66a84bf-a1c6-0c0f-b1ff-af5f18ce1808.png)

#### ジオフェンスコレクション
1. ナビゲーションペインで、「ジオフェンスのコレクション」をクリックします
1. 「ジオフェンスコレクションを作成」をクリックします
1. 下記を入力し、「ジオフェンスコレクションを作成」をクリックします
    - 名前
    - EventBridgeルールの作成有無
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e68656ab-bf92-a4b1-c632-43cdcd61ee45.png)
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/66d18549-6ba5-cc9d-b8f1-778bb387bd90.png)

### EventBridgeルールの確認
上記のジオフェンスコレクションの作成の過程で作られたEventBridgeルールを確認します

1. EventBridgeに移動します
1. ナビゲーションペインで「バス>ルール」をクリックします
1. 作成されていました。ルールをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/27dbf2ba-b78a-c97a-e781-fc2fd99e4e71.png)
1. ①「ターゲット」タブをクリックします。ARNを見ると、CWLが指定されています
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/359a2fc0-fed4-a9af-ceb6-7a092f3ca29f.png)


### CloudWatch Logs
上記のジオフェンスコレクションの作成の過程で作られたCloudWatch Logs(CWL)を確認します

1. CloudWatch に移動します
1. ナビゲーションペインで「ログ＞ロググループ」をクリックします
1. 作成されていました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3c58564b-ca1e-4d95-1fae-93bbd3e567dd.png)

1. CWLのリソースポリシーを確認します
    ```json
    $ aws logs describe-resource-policies       
    {
        "resourcePolicies": [
            {
                "policyName": "TrustEventsToStoreLogEvents",
                "policyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"TrustEventsToStoreLogEvents\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"delivery.logs.amazonaws.com\",\"events.amazonaws.com\"]},\"Action\":[\"logs:CreateLogStream\",\"logs:PutLogEvents\"],\"Resource\":\"arn:aws:logs:ap-northeast-1:XXXXXX:log-group:/aws/events/*:*\"}]}",
                "lastUpdatedTime": 1723873538118
            }
        ]
    }
    $
    ```

### トラッカーリソース
1. Location Serviceに移動します
1. ナビゲーションペインで「トラッカー」をクリックします
1. 「トラッカーを作成」をクリックします
1. 名前と、位置のフィルタリングで「精度ベースのフィルタリング」を入力し、「トラッカーを作成」をクリックします
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/db100cd9-692b-8be9-de02-650b1641e3e0.png)

### Cognito Identity Poolの作成
Location Serviceは、IAMを使用してアクセスを指示します

1. Cognitoへ移動します
1. ナビゲーションペインで「IDプール」をクリックします
1. 「IDプールを作成」をクリックします
1. 認証でゲストアクセスをチェックし、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4eadd12d-abeb-09ce-16e9-6eda9eebfd00.png)
1. 「新しいIAMロールを作成」、IAMロール名を入力し、次へをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/970010eb-28af-ead8-1fcb-b2d367dd96f4.png)

1. IDプール名を入力し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4a319a57-91ac-b393-5e72-5cee0d5752fc.png)
1. 最後に問題なければ、「IDをプールを作成」をクリックします
1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/53947c53-2b8a-5afc-0b9d-6fdc8c2ff1db.png)

#### IAMポリシーの修正
1. IDプール名をクリックします
1. ①「ユーザーアクセス」タブをクリックし、②ゲストロールをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f92217a2-1519-c6b1-2ed8-6d624bc227bd.png)

1. 別タブでIAMロールの画面が開くので、許可ポリシーを編集し、下記のポリシードキュメントを貼りつけます。※各ResourceのARNは、Location ServiceリソースのARNを貼り付けます。※なお、`arn:aws:geo:us-east-1:<account ID>:map/WorkshopMap*`のように最後はアスタリスクをつけます
    ```JSON
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Maps",
                "Effect": "Allow",
                "Action": [
                    "geo:GetMap*"
                ],
                "Resource": "<MapARN>"
            },
            {
                "Sid": "Places",
                "Effect": "Allow",
                "Action": [
                    "geo:SearchPlaceIndex*"
                ],
                "Resource": "<PlaceIndexARN>"
            },
            {
                "Sid": "Routes",
                "Effect": "Allow",
                "Action": [
                    "geo:CalculateRoute"
                ],
                "Resource": "<RouteCalculator>"
            },
            {
                "Sid": "Geofences",
                "Effect": "Allow",
                "Action": [
                    "geo:ListGeofences",
                    "geo:PutGeofence",
                    "geo:BatchDeleteGeofence"
                ],
                "Resource": "<GeofenceARN>"
            },
            {
                "Sid": "Trackers",
                "Effect": "Allow",
                "Action": [
                    "geo:ListDevicePositions",
                    "geo:BatchUpdateDevicePosition",
                    "geo:GetDevicePositionHistory"
                ],
                "Resource": "<TrackerARN>"
            }
        ]
    }
    ```
1. 「次へ」をクリックします
1. 変更を保存します


### アプリケーションの起動
1. VSCodeで、「congiuration.js」を開きます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/52950527-dfa1-62e7-3526-734c2cc948a3.png)
1. 下記のようになっています。データプロバイダー事に
    ```javascript
    // This configuration file is a single place to provide any values to set up the app
    
    export const IDENTITY_POOL_ID =
      "XX-XXXX-X:XXXXXXXX-XXXX-1234-abcd-1234567890ab"; // REQUIRED - Amazon Cognito Identity Pool ID
    
    export const REGION = "XX-XXXX-X"; // REQUIRED - Amazon Cognito Region
    
    export const MAP = {
      NAME: "XXXXXXXXXXX", // REQUIRED - Amazon Location Service map resource name
      STYLE: "XXXXXXXXXXX", // REQUIRED - String representing the style of map resource
    };
    
    export const PLACE = "XXXXXXXXXXX"; // REQUIRED - Amazon Location Service place index resource name
    
    export const ROUTE = "XXXXXXXXXXX"; // REQUIRED - Amazon Location Service route calculator resource name
    
    export const GEOFENCE = "XXXXXXXXXXX"; // REQUIRED - Amazon Location Service geofence collection resource name
    
    export const TRACKER = "XXXXXXXXXXX"; // REQUIRED - Amazon Location Service tracker resource name
    
    export const TRACKER_SIMULATED_DEVICE = "Vehicle-1"; // REQUIRED - Simulated Device ID (Defaulting to Vehicle-1)
    
    ```
1. Esri Data Providerの場合は、下記のように置き換えます
    ```javascript
    // This configuration file is a single place to provide any values to set up the app
    
    export const IDENTITY_POOL_ID = "<ID>"; // REQUIRED - Amazon Cognito Identity Pool ID
    
    export const REGION = "<region>"; // REQUIRED - Amazon Cognito Region
    
    export const MAP = {
      NAME: "WorkshopMap", // REQUIRED - Amazon Location Service map resource name
      STYLE: "VectorEsriStreets", // REQUIRED - String representing the style of map resource
    };
    
    export const PLACE = "WorkshopIndex"; // REQUIRED - Amazon Location Service place index resource name
    
    export const ROUTE = "WorkshopRoutes"; // REQUIRED - Amazon Location Service route calculator resource name
    
    export const GEOFENCE = "WorkshopCollection"; // REQUIRED - Amazon Location Service geofence collection resource name
    
    export const TRACKER = "WorkshopAssets"; // REQUIRED - Amazon Location Service tracker resource name
    
    export const TRACKER_SIMULATED_DEVICE = "Vehicle-1";  // REQUIRED - Simulated Device ID (Defaulting to Vehicle-1)
    ```
1. IDENTITY_POOL_IDとREGIONを置き換えます
1. アプリを起動します
    ```
    amplify-ui-geo-explore $ npm start
    
    > amplify-ui-geo-explore@1.5.0 start
    > vite
    
    
      VITE v4.5.2  ready in 1441 ms
    
      ➜  Local:   http://localhost:8080/
      ➜  Network: http://XXX.XXX.XXX.XXX:8080/
      ➜  Network: http://XXX.XXX.XXX.XXX:8080/
      ➜  press h to show help
    ```

1. localhost:8080をブラウザで開きます。表示されました！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/89850416-93c5-a38d-8c5d-49462edd5118.png)


# 考察
今回、Location Serviceについて概要を整理し、簡単なデモを試しました。次回以降も継続して各リソースを試してみます。

# 参考

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/welcome.html

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/overview.html

https://aws.amazon.com/jp/location/pricing/

https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/what-is-data-provider.html

https://catalog.workshops.aws/amazon-location-101/ja-JP/mapping