Amazon Location Serviceプレースインデックス機能のAPIエンドポイントへリクエストをしてみた


## はじめに
今回はAmazon Location Serviceプレースインデックス機能の３つのエンドポイントへリクエストしてみました。
プレースインデックス作成の設定はあくまで今回の例です、実際に試す方は必要に応じて変更してください。

## Amazon Location Serviceプレースインデックス機能
ジオコーディング、逆ジオコーディング、地点の検索機能を扱うことができます。
- ジオコーディング
住所、POI などを検索し、座標データを取得できます。
- 逆ジオコーディング
座標を入力し、その位置に関するメタデータを受け取ることができます。
- サジェスト検索
住所や地名に含まれる文字列で検索し、候補を返すことができます。

## 作成手順
Amazon Location Serviceの画面から「プレースインデックス作成」ボタンを押します。
入力フォームから以下の内容を入力します。今回権限関連はAPIキーを作成して使用します。

![スクリーンショット 2024-03-15 143310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/d47ccf39-0aee-73de-40b6-5fb4c0a3ff50.png)

- 名前：TestIndex
- データプロバイダー：Esri
- データストレージオプション：いいえ、単回使用のみ
- APIキー：APIキーを作成する
- APIキー名：test_key
- アクション：「GetPlace」「SearchPlaceIndexForPosition」「SearchPlaceIndexForSuggestions」「SearchPlaceIndexForText」のみチェック

![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/47ebd3a8-b1d3-5a22-c90d-245ab2b78cc1.png)
![スクリーンショット 2024-03-15 143206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/c64e3435-8ae8-b814-0bee-2b93ad90c878.png)


## Amazon Location Serviceエンドポイントへリクエストする
### エンドポイント情報
今回はAmazon Location Serviceのエンドポイントへリクエストしようと思います。
リファレンスを参照すると、エンドポイントの構成は以下のようにまとめることができます。
```
https://サービスコード.geo.リージョンコード.amazonaws.com/places/v0/indexes/インデックス名/search/コマンド
```

https://docs.aws.amazon.com/general/latest/gr/location.html

### APIにリクエストしてみる
では実際にリクエストを投げてみましょう。今回はChromeエクステンションのTalend API Testerを使用してみました。
- 住所の検索
   - Post URL:```https://places.geo.ap-northeast-1.amazonaws.com/places/v0/indexes/TestIndex/search/text```
   - パラメータ:key=上記作成したtest_keyの値
   - body: { "Text" : "東京都千代田区東京駅" }
![スクリーンショット 2024-03-19 163104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/ad655078-e52f-8be8-e14d-e65ed5c17111.png)

以下のレスポンスが返されます。
```json
{
    "Summary": {
        "Text": "東京都千代田区東京駅",
        "MaxResults": 50,
        "ResultBBox": [
            139.76706,
            35.68113,
            139.767211447,
            35.681184616
        ],
        "DataSource": "Esri"
    },
    "Results": [
        {
            "Place": {
                "Label": "東京都千代田区東京駅",
                "Geometry": {
                    "Point": [
                        139.767211447,
                        35.681184616
                    ]
                },
                "Region": "東京都",
                "Country": "JPN",
                "Interpolated": false,
                "Categories": [
                    "PointOfInterestType",
                    "Train Station"
                ]
            },
            "Relevance": 1
        },
        {
            "Place": {
                "Label": "とうきょうと千代田区東京駅",
                "Geometry": {
                    "Point": [
                        139.76706,
                        35.68113
                    ]
                },
                "SubRegion": "千代田区",
                "Region": "とうきょうと",
                "Country": "JPN",
                "Interpolated": false,
                "Categories": [
                    "PointOfInterestType",
                    "Train Station"
                ]
            },
            "Relevance": 1
        }
    ]
}

```
- 座標の検索
   - Post URL:```https://places.geo.ap-northeast-1.amazonaws.com/places/v0/indexes/TestIndex/search/position```
   - パラメータ:key=上記作成したtest_keyの値
   - body:  { "position" : [139.76721144700002, 35.68118461600005] }

以下のレスポンスが返されます。
```json
{
    "Summary": {
        "Position": [
            139.76721144700002,
            35.68118461600005
        ],
        "MaxResults": 50,
        "DataSource": "Esri"
    },
    "Results": [
        {
            "Place": {
                "Label": "東京都千代田区丸の内１-９-１",
                "Geometry": {
                    "Point": [
                        139.766185236986,
                        35.681729882807
                    ]
                },
                "AddressNumber": "１",
                "Neighborhood": "１",
                "Region": "東京都",
                "Country": "JPN",
                "PostalCode": "1000005",
                "Interpolated": false,
                "Categories": [
                    "AddressType"
                ],
                "SubMunicipality": "丸の内"
            },
            "Distance": 110.88122647200349
        }
    ]
}
```
- サジェスト検索による候補の取得
   - Post URL:```https://places.geo.ap-northeast-1.amazonaws.com/places/v0/indexes/TestIndex/search/suggestions```
   - パラメータ:key=上記作成したtest_keyの値
   - body: { "Text" : "市役所" }

以下のレスポンスが返されます。
```json
{
    "Summary": {
        "Text": "市役所",
        "MaxResults": 5,
        "DataSource": "Esri"
    },
    "Results": [
        {
            "Text": "埼玉県久喜市市役所通り歯科",
            "PlaceId": "AQABAKEACxB7n-rKmI69YmmneMPoGaPt7GmFBjLX5_YzZMa8DeQ8TV2xF1vASsQecOJm5RxonPrkNHY5chMWl_0FNozR_YhNJATCvd310HGmsFPoy2Lkrn669qpvB5QKMBXgjBMh03TRJ5J73yDId094dBbOjLLLzSV1etk0FJT2SUdFjZYnGq00KPR4eK3X7EhFlwBye1C317FWeXfA1U0VlvOaYtZm-GchhmU0tOBoIdp04_xq2rKgbFEiVnenCPyuitYKQw"
        },
        {
            "Text": "広島県福山市市役所通りクリニック",
            "PlaceId": "AQABAKEA_EqmYaN5ooN2Uj_KHXaqqF48zoTquBJMA3AyOV_a8Y7ubjTfbuylTFDSLDySHbRvXPE-Hz2xAyT3p0uuoaGDiE-tVEF-DhiPABsbHYtywbyZTXHbnlusZJJZNejQDuyMN2hd4oNsDqrzkh2-FGdy5GAZDQneU6jKOa5MGD8igFXqmo2RX3wbVEL42eyhTL_EqS-VqUO-StbSlMi4X7hXtl9jirSRbJW5PuwbhN37shi72pptRO2KTg9UlDg0T7vyBQ"
        },
        {
            "Text": "兵庫県姫路市市役所前局",
            "PlaceId": "AQABAKEAFopOytKciOQl0qbW4ym5F2INV6TyNoM5vO7ldOFSQApZPOA67mhyYFmQChJuhb6TguoHoArwVpGf9XFlSET3TNrtD2usETekejRLfYflyHuk7v5ef4zoRDkPVU7ApDJ5mV50OLLFOP2u0ERJRDWT0-T5a6ozuQvJCB76xAhxEax3FMidB9MJAruUXzYvaIyeS9rpNXt6DKHMxCx_4uMe1Ptv1h69CqcQFpVdz0AaKr32pq5evUacQomHzHDhY2qeuQ"
        },
        {
            "Text": "兵庫県尼崎市市役所北交差点",
            "PlaceId": "AQABAKEALlJZSZKOb4uxBuc32FrMIdJvUska9PKQRWnhzu7Gtm9HwvuEHz2oVfS_jovHe5PSwqUMd5dimV9-OfPA5H4StULV8qtVuKyEFVD6YPl1ps6U_rV1o-PVuG4pMHDCKcqMYyFo5zV98B1qTGRJMjtiPCpxzjCWPGWrks-uj8pYGCFNNHgKb6WOHIA9_8bIJzOmQYMRfb2wd55lqy-lF2FKKHY-ixEw66g4FRWTZBwgReSSzJL5qFq3tLQhb_s2WCR9bw"
        },
        {
            "Text": "北海道小樽市市役所下交差点",
            "PlaceId": "AQABAKEAd3zbR2R0yWQpR_FHw-_wjChs6pu1ymDP9TN8DsQY5bm3jJriqUsy6WraTE9yxYeeF-YSyKv3aLH-r75_KpWNW19PZ16OVIDADlJjEsE3yxWo5DhHqHur2dQGD5KJBPJKJS7rTFWM2mrGtGnQYxoyBjDTqUayUx6-B8h8ljODDGraW4uqrgNkahjRY5GRxFXvH4ZurvwXtehKSapfKBlDDesiI98u3R5puR-6MELDyf4jaXEKNzsUX8RDm-KWQzJzrA"
        }
    ]
}
```

市役所でサジェスト検索しようとしたら、市役所ではない場所も返されて、5件の結果の中に都道府県がバラバラであることも気になりますね。データがまだ足りないでしょうか、サジェスト検索はまだ課題がありそうです。

## おわりに
Amazon Location Serviceを触ってみようと思う方は、AWS公式の入門ワークショップを参考にすることが多いではないでしょうか。

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

入門ワークショップでは以下のようにAWS CLIでコマンドを使用してリクエストする方法が紹介されています。
```cmd
# 住所の検索 search-place-index-for-textコマンド
aws location search-place-index-for-text --index-name WorkshopIndex --text "東京都千代田区東京駅"
```
今回はそのコマンド形式ではなく、APIエンドポイントへリクエストを投げてみました。
プレースインデックス機能にはフィルター機能もあり、返す内容を限定することもできます。フィルター機能についてはまた次の記事で紹介しようと思います。
では、以上になります。最後まで読んでいただき有難うございました。