Amazon Location Service で Place ID が利用出来るようになりました

2022.10.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon Location Service ではデータプロバイダー(Esri, HERE)から提供されるインデックスを使ってフリーテキストや緯度経度で「場所」を検索することが出来ます。
今回のアップデートで Place ID が導入されました。

Place ID を使うことで検索した場所の識別情報を取得し、その識別情報を使った場所の名前や緯度経度の取得などを行うことが出来るようなり、完全名称や緯度経度での再検索などを行わなくても特定の場所情報にアクセスしやすくなりました。

本日はこちらを使って Place ID の取得と利用を行ってみたいと思います。

SearchPlaceIndexXXX で Place ID が取得出来る

まずは Place ID を取得してみます。

今回は AWS CLI から利用します。
v1.25.83、v2.8.0 以降で利用が可能で以下の 3 つのコマンドで取得が出来るようになっています。

  • search-place-index-for-text
  • search-place-index-for-position
  • search-place-index-for-suggestions

後述しますが Esri と HERE で Place ID が取得出来るコマンドが異なります。
Esri は本日時点でsearch-place-index-for-suggestionsで、HERE はすべて取得出来ます。

Esri は Suggestions でのみ取得可能

先程少し触れましたがデータプロバイダーが Esri の場合は Suggestions コマンドでのみ Place ID が取得出来ます。

search-place-index-for-suggestions

% aws location search-place-index-for-suggestions --index-name iwasa.esri --text "北海道札幌市中央区北3条西1-1-1" --max-results 15 --profile hoge
{
    "Results": [
        {
            "PlaceId": "AQAAANEAemKPKx3SotVcsPOm9T4xF1_zk5La2xeicSY-maXNAnCxJlq0aDZ77cRe0YEPwfyDKMKmZEWsmOQQ4sbIbmlC_l8cfCUBR8-cHa3FHXCu5iiERFAnkmHaqrpvpmx17bkQRW3M4d1wrntfPY0f-8s5ts-qeWUNBG3ogcJ4nc3BZHQa6yeKYsiadIkbrUPe6gQw06xaCubJSsmjp-ZU6iitl4HrRkJnCGCV-AXFePTEih4uEuEoY5tH3E0wfy6h4RbTWRnIB8okKcwwOq6glFbczP7ll0sY3W1QKihU6oIukD-_G7H-goeCf4AGMrqL58Sigg",
            "Text": "北海道札幌市中央区北3条西1-1-1"
        },
        {
            "PlaceId": "AQAAANEATrgRAKfw9H1WaPvAoo2fafkvrFCLJYN_pJELnjNhLO0BH2RXNBpYyHG8Jhils9PZL58ebihoEZPhxJtF8ed6gbTH3berNLgh1Er9O7YNCEIZUYYafuPd0bJFgF1U6jn4DewmvfGcbbXMHJPM_Qgxd9piVbHWlozzd2y0gssHIxf2ULy05HorVtUeTfjtSQ607Lcb0QZVroFdNXHoXBLbIDPM4bLCrlsZ4LG-XKvcWOrErO0CxSKsyCrLNJv_rVkpCF1WjwSdeUN1ZMg0w2zsBPRd_QPwDOAu2wU0Y4-whzNsBGuAPGmGRkg_mjG8zqalHg",
            "Text": "北海道札幌市中央区北3条西11-1-1"
        },
:
    ],
    "Summary": {
        "DataSource": "Esri",
        "MaxResults": 15,
        "Text": "北海道札幌市中央区北3条西1-1-1"
    }
}

上記ハイライト部分が Place ID です。331 文字ほどありました。
検索のたびに変わる ID というわけではなく、何度検索しても同じ値が取得されます。
どうやらデータプロバイダーで管理する「場所」ごとに識別情報の割り当てがあるようです。

search-place-index-for-text, search-place-index-for-position

以下は Esri の場合のsearch-place-index-for-textです。
やはり Place ID が取得出来ていないですね。

Esri

% aws location search-place-index-for-text --index-name iwasa.esri --text "ブリックキューブ" --profile hoge
{
    "Results": [
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        141.53358544800005,
                        43.117744309000045
                    ]
                },
                "Interpolated": false,
                "Label": "北海道江別市ブリック",
                "Region": "北海道"
            },
            "Relevance": 0.705
        }
    ],
    "Summary": {
        "DataSource": "Esri",
        "MaxResults": 50,
        "ResultBBox": [
            141.53358544800005,
            43.117744309000045,
            141.53358544800005,
            43.117744309000045
        ],
        "Text": "ブリックキューブ"
    }
}

以下は HERE の場合です。こちらは Palce ID が取得出来ていますね。

HERE

% aws location search-place-index-for-text --index-name iwasa.here --text "ブリックキューブ" --profile hoge      
{
    "Results": [
        {
            "Place": {
                "AddressNumber": "1",
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        141.35452,
                        43.06573
                    ]
                },
                "Interpolated": false,
                "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1 札幌ブリックキューブ",
                "Municipality": "札幌市",
                "Neighborhood": "中央区",
                "PostalCode": "060-0003",
                "Region": "北海道",
                "TimeZone": {
                    "Name": "Asia/Tokyo",
                    "Offset": 32400
                }
            },
            "PlaceId": "AQAAAHUARlP4Kb9v_fYXkQnqCUwwtEeL5TU5XF7YzhxDKdoM6-qcCavIbvolk4ob8t9XZjU_986M9RFw2K-NLMRSwksN6MyA8EcXlmbuS3lAtUxcUeVWE5espu8A6hOr_axEqUYy9zaARJgxvKrf3RQ6cQHjO0b1sJjSymD4W1amyCl63H8enOWihcoiLYH1u8mp1H3LNle3XPI"
        }
    ],
    "Summary": {
        "DataSource": "Here",
        "MaxResults": 50,
        "ResultBBox": [
            141.35452,
            43.06573,
            141.35452,
            43.06573
        ],
        "Text": "ブリックキューブ"
    }
}

Place ID を使う

さて、それでは Place ID を使ってみましょう。
get-place コマンドを使います。

% aws location get-place --index-name iwasa.here --place-id AQAAAJsAhR-zooSzHzRNwpspbSdomeoER2QDcIRsAeqTRCntG-y2565vUdZGPHXJl3R9Ofoj3FHPFF7Gx6FMF90I4lPy1oQJmRVAa9LuwdbmPPnTamZp8fuUPN2tdn4QRT9ELJeK8Yuf2eWBCXB8lhrW2P3WxwnaKVxBrp8r9kKnRbaRdiwWHULb7HyjY31KwlUi2JYo6AfFO85WFfBeOevbvtnqdKrfetdOAClnXXtNcQaiu4Jgel0mO_2ttmvTIg --profile hoge
{
    "Place": {
        "AddressNumber": "1",
        "Country": "JPN",
        "Geometry": {
            "Point": [
                141.35452,
                43.06573
            ]
        },
        "Interpolated": false,
        "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1",
        "Municipality": "札幌市",
        "Neighborhood": "中央区",
        "PostalCode": "060-0003",
        "Region": "北海道",
        "TimeZone": {
            "Name": "Asia/Tokyo",
            "Offset": 32400
        }
    }
}

これを使うことでフリーテキストや緯度経度で再検索した上で絞り込みを行わなくても識別した場所の情報を取得することが出来ます。
ただし、利用にあたっては以下のドキュメントに記載されている制限事項を理解した上で利用する必要がありますので、いくつか確認してみましょう。

制限事項1: データプロバイダーは跨いだ利用は出来ない

まず Esri で取得した Place ID を HERE インデックスで利用することは出来ません。
その逆も同様です。

Esri で取得した Place ID を Esri で利用

% aws location get-place --index-name iwasa.esri --place-id AQAAANEAemKPKx3SotVcsPOm9T4xF1_zk5La2xeicSY-maXNAnCxJlq0aDZ77cRe0YEPwfyDKMKmZEWsmOQQ4sbIbmlC_l8cfCUBR8-cHa3FHXCu5iiERFAnkmHaqrpvpmx17bkQRW3M4d1wrntfPY0f-8s5ts-qeWUNBG3ogcJ4nc3BZHQa6yeKYsiadIkbrUPe6gQw06xaCubJSsmjp-ZU6iitl4HrRkJnCGCV-AXFePTEih4uEuEoY5tH3E0wfy6h4RbTWRnIB8okKcwwOq6glFbczP7ll0sY3W1QKihU6oIukD-_G7H-goeCf4AGMrqL58Sigg --profile hoge
{
    "Place": {
        "AddressNumber": "1",
        "Country": "JPN",
        "Geometry": {
            "Point": [
                141.35452034946275,
                43.06572691680199
            ]
        },
        "Interpolated": false,
        "Label": "北海道札幌市中央区北3条西1-1-1",
        "Municipality": "中央区",
        "Neighborhood": "1",
        "PostalCode": "0600003",
        "Region": "北海道"
    }
}

Esri で取得した Place ID を HERE で利用

% aws location get-place --index-name iwasa.here --place-id AQAAANEAemKPKx3SotVcsPOm9T4xF1_zk5La2xeicSY-maXNAnCxJlq0aDZ77cRe0YEPwfyDKMKmZEWsmOQQ4sbIbmlC_l8cfCUBR8-cHa3FHXCu5iiERFAnkmHaqrpvpmx17bkQRW3M4d1wrntfPY0f-8s5ts-qeWUNBG3ogcJ4nc3BZHQa6yeKYsiadIkbrUPe6gQw06xaCubJSsmjp-ZU6iitl4HrRkJnCGCV-AXFePTEih4uEuEoY5tH3E0wfy6h4RbTWRnIB8okKcwwOq6glFbczP7ll0sY3W1QKihU6oIukD-_G7H-goeCf4AGMrqL58Sigg --profile hoge

An error occurred (ValidationException) when calling the GetPlace operation: 'placeID' is invalid

制限事項2: 同一アカウント、同一リージョンでのみ Place IDは使える

もしデータプロバイダーが一緒だとしても、取得した Place ID を他の AWS アカウントで利用することは出来ません。
これはいくつかのユースケースで制限されそうですが、Place ID を AWS アカウント外にパブリックに共有しても使えないということです。

% aws location get-place --index-name iwasa.here --place-id AQAAAJsA2vS4AZAkHDXCHEvFLCx6dLJ9fsELi4D7CK1SjbT1bWi65TKRpPwj12kFPuAJx_FJtU1z2dwcJqYO4GySm86-5yof8_O33GmOPbKG9Sar715JGdyMStq_X5Fun2QBDi60_zhtYXuMtZiYL9pxX1MUuglJLhOY62LZt63HNzqaMoMzqpzis-3sSEkC65mmbZ3K-8Ca5-c2TbgTnikJ7MgmdZZyMNYhBZXGpzLBaydF015ldcom7qkZcpuNXg --profile hoge

An error occurred (ValidationException) when calling the GetPlace operation: 'placeID' is invalid

ただし、Place ID は呼び出し IAM ユーザーなどとは紐付いてないようなで、同一 AWSアカウント・リージョンであれば別の IAM ユーザーからの利用は可能です。

% aws location get-place --index-name iwasa2.here --place-id AQAAAJsA2vS4AZAkHDXCHEvFLCx6dLJ9fsELi4D7CK1SjbT1bWi65TKRpPwj12kFPuAJx_FJtU1z2dwcJqYO4GySm86-5yof8_O33GmOPbKG9Sar715JGdyMStq_X5Fun2QBDi60_zhtYXuMtZiYL9pxX1MUuglJLhOY62LZt63HNzqaMoMzqpzis-3sSEkC65mmbZ3K-8Ca5-c2TbgTnikJ7MgmdZZyMNYhBZXGpzLBaydF015ldcom7qkZcpuNXg --profile piyo
{
    "Place": {
        "AddressNumber": "1",
        "Country": "JPN",
        "Geometry": {
            "Point": [
                141.35452,
                43.06573
            ]
        },
        "Interpolated": false,
        "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1",
        "Municipality": "札幌市",
        "Neighborhood": "中央区",
        "PostalCode": "060-0003",
        "Region": "北海道",
        "TimeZone": {
            "Name": "Asia/Tokyo",
            "Offset": 32400
        }
    }
}

% aws location get-place --index-name iwasa2.here --place-id AQAAAJsA2vS4AZAkHDXCHEvFLCx6dLJ9fsELi4D7CK1SjbT1bWi65TKRpPwj12kFPuAJx_FJtU1z2dwcJqYO4GySm86-5yof8_O33GmOPbKG9Sar715JGdyMStq_X5Fun2QBDi60_zhtYXuMtZiYL9pxX1MUuglJLhOY62LZt63HNzqaMoMzqpzis-3sSEkC65mmbZ3K-8Ca5-c2TbgTnikJ7MgmdZZyMNYhBZXGpzLBaydF015ldcom7qkZcpuNXg --profile piyo2
{
    "Place": {
        "AddressNumber": "1",
        "Country": "JPN",
        "Geometry": {
            "Point": [
                141.35452,
                43.06573
            ]
        },
        "Interpolated": false,
        "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1",
        "Municipality": "札幌市",
        "Neighborhood": "中央区",
        "PostalCode": "060-0003",
        "Region": "北海道",
        "TimeZone": {
            "Name": "Asia/Tokyo",
            "Offset": 32400
        }
    }
}

制限事項3: 同一と思われる場所でも複数の Place ID が紐付いている場合がある

Place ID は一見すると同一だと思われる場所でも別の Place ID が取得される場合があります。
以下はクラスメソッドの現札幌オフィスの住所である「北海道札幌市中央区北3条西1丁目1-1」の緯度経度とフリーテキストでそれぞれ検索した結果です。

同じラベルが取得されていますが、Place ID が異なっていることがわかりますでしょうか。

% aws location search-place-index-for-position --index-name iwasa.here --position "[141.35452,43.06573]" --profile hoge     
{
    "Results": [
        {
            "Distance": 0,
            "Place": {
                "AddressNumber": "1",
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        141.35452,
                        43.06573
                    ]
                },
                "Interpolated": false,
                "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1",
                "Municipality": "札幌市",
                "Neighborhood": "中央区",
                "PostalCode": "060-0003",
                "Region": "北海道",
                "TimeZone": {
                    "Name": "Asia/Tokyo",
                    "Offset": 32400
                }
            },
            "PlaceId": "AQAAAHAAiNWQbt9LOsoBoJXGx-sDCqOuSsRP__Zqkcyy9fjVxutVO20v0RtMsPTj__SCHHsP-8mlDBDfkPqvU6lcy8sPoxjmRnh1x2pKbMRirNCrewjJCQSMbivKt4irizy0W8AVG7RpmSfyLWggA4zfKYLFD99uRamDwOYKIiziEszWATumHxPYxWgBhhgYyJu2XScP"
        },
        {
            "Distance": 0.813267726605418,
:

% aws location search-place-index-for-text --index-name iwasa.here --text "北海道札幌市中央区北3条西1丁目1-1" --profile hoge
{
    "Results": [
        {
            "Place": {
                "AddressNumber": "1",
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        141.35452,
                        43.06573
                    ]
                },
                "Interpolated": false,
                "Label": "〒060-0003 北海道札幌市中央区北3条西1丁目1-1",
                "Municipality": "札幌市",
                "Neighborhood": "中央区",
                "PostalCode": "060-0003",
                "Region": "北海道",
                "TimeZone": {
                    "Name": "Asia/Tokyo",
                    "Offset": 32400
                }
            },
            "PlaceId": "AQAAAJsAhR-zooSzHzRNwpspbSdomeoER2QDcIRsAeqTRCntG-y2565vUdZGPHXJl3R9Ofoj3FHPFF7Gx6FMF90I4lPy1oQJmRVAa9LuwdbmPPnTamZp8fuUPN2tdn4QRT9ELJeK8Yuf2eWBCXB8lhrW2P3WxwnaKVxBrp8r9kKnRbaRdiwWHULb7HyjY31KwlUi2JYo6AfFO85WFfBeOevbvtnqdKrfetdOAClnXXtNcQaiu4Jgel0mO_2ttmvTIg"
        }
    ],
    "Summary": {
        "DataSource": "Here",
        "MaxResults": 50,
        "ResultBBox": [
            141.35452,
            43.06573,
            141.35452,
            43.06573
        ],
        "Text": "北海道札幌市中央区北3条西1丁目1-1"
    }
}

ただし、どちらの Place ID でも get-place で場所情報を取得することは可能でした。
このことから Place ID を使って場所情報を取得することは出来ても Place ID を比較して場所が一致しているかどうかを比較するのは避けたほうが良さそうですね。

さいごに

本日は Amazon Location Service で Place ID が利用出来るようになったので使ってみました。

今まで検索済みの場所を Location API で情報を再取得する場合に再度フィルタリングを行う必要があったと思いますが、Place ID を使うことで適切に情報を取得することが出来るようになりました。
一方でデータプロバイダーごとの対応可否やいくつかの制限事項があることもわかったので、アプリケーション側で整合が取れなくなるような使い方には気をつける必要がありそうですね。