2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Location ServiceのPlaces機能について触りながら理解していく ~AWS100本ノック~35/100

Posted at

はじめに

こんにちは。株式会社アベリオシステムズでエンジニアをやっている、なかざとです:smile:

前回の記事では、AWS Location Service(以降ALS)のGeofencing機能について紹介しました。
今回は、Places機能について紹介いたします。

Placesとは?

108か国の4億を超える住所とポイントオブインタレスト(POI)を含む包括的なプレースデータベースをクエリすることで、ロケーションを検索またはジオコード出来る機能です。

主な機能としては、以下になります。

  • 物理的な場所または住所を地理的座標 (経度と緯度) に変換:ジオコーディング
  • 地理的座標 (経度と緯度) を住所に変換:リバースジオコーディング
  • ユーザが入力した場所や住所の候補を補完:オートコンプリート
  • ユーザが入力した情報から関連する場所を予測/推奨:サジェスト
  • 指定した座標からの一定範囲内のPOIを検索:ニアバイサーチ

用語

Places関連の用語は以下になります。
Location、Places、Address、Positionの違いがわかりにくいですが関係性としては、 Position(最も具体的) → Address → Places → Location(最も一般的)になりそうです。

  • Location:地球の表面上の特定のポイント。地理的座標 (経度と緯度) で定義
    • 都市、建物、または興味のある場所など、任意の場所またはエリアを表すことができる
    • 例:交差点、道路上の任意の地点、などの名称が存在しない場所も含む
  • Places:管理エリア、住所、ポイントオブインタレスト (POI)、地理的エリアなどを含む任意の場所
    • 名前、住所、座標、タイプ、営業時間、連絡先、カテゴリなどの関連情報が関連付けられている
    • 例:東京タワー、スターバックス五反田店
  • Address:ポイントベースの住所 (オフィス、自宅など)、番地、補完された住所が含まれており、正確な位置データを提供
    • 例: 〒100-0005 東京都千代田区丸の内1-1-1
  • Secondary Address:ビルやフロア情報などの補助的な位置指示記号や識別子
  • ポイントオブインタレスト(POI):図上で特定の場所や地点、またはそれに関連する情報
    • レストランや観光スポット、ホテル、歴史的建造物など、人々が興味を持つ可能性のある場所全般
  • Administrative areas(行政区域):地理データを整理する国、都道府県、州、地区、ブロック、郵便番号などの地域
  • Geographic area(地理的領域):都市、地方、近隣地域を含むエリアで、地理データの粒度をさらに高める
  • Position(位置):マップ上の場所を特定する正確な座標 (経度と緯度) のセット
    • 例:latitude: 35.6812362, longitude: 139.7671248
  • バイアス位置:地理的データ内の参照ポイント
    • この場所に近い場所で検索結果を優先し、検索の関連性を高める
  • 境界ボックス:南西部と北東部の座標で定義される長方形の地理的エリア
    • マップ上のエリア内で検索を絞り込んだり、コンテンツを表示したりするために使用
  • プレイスタイプ:関数または特性に基づく場所の分類
    • 国、地域、地域、地区、郵便番号、ブロック、交差点、住所、ポイントアドレス、補完住所、または POI が含まれる
  • カテゴリ:レストラン、ホテル、学校、公園など、提供するサービスやアクティビティのタイプに基づくビジネスやランドマークのグループ化
    • カテゴリを使用すると、ユーザーは検索で特定のタイプのPOIを簡単に見つけることができる
  • 一致スコア:検索結果が入力値とどの程度一致しているか
  • Interpolation(補完):既知のアドレスの場所を参照ポイントとして使用して、不明なアドレスを推定する方法

クエリ

Placesの各APIでは、ロケーションを取得/検索するためのクエリオプションとバイアスオプションが用意されています
※バイアスオプションとは、検索結果に影響を与える場所であり、指定することでバイアス位置に近い場所を優先します

1-query.png

フィルター

Placesの各APIでは、特定の条件に基づいて検索結果を絞り込むための以下のフィルタリングオプションが用意されています

  • 地理的フィルター
  • 管理エリアフィルアー
  • POIカテゴリーフィルター

2-filter.png

地理的フィルター

円形

中心点 (経度と緯度) と半径で定義される円形の地理的領域。結果を円内の場所に制限します

境界ボックス

2つの座標のセット (南西部と北東部の角)で定義される長方形の地理的領域。
このボックス内の場所に結果を制限します

管理エリアフィルター

結果を特定の国に制限し、指定された国内のロケーションのみを含めることができます

プレースタイプ

国、都市、近隣など、特定のタイプの場所に結果を制限できます

2-1-filter.png

POIカテゴリフィルター

カテゴリ

レストランやショップなど、特定のPOIカテゴリに基づいて結果を絞り込みます

2-2-filter.png

ビジネスチェーン

スターバックスやマクドナルドなど、特定のビジネスチェーンに基づいて結果を絞り込みます

2-3-filter.png

食品タイプ

イタリア料理や中華料理など、特定の種類の食品関連の場所で結果をフィルタリングします

2-4-filter.png

実際にPlacesの各機能を試してみる

では実際に、地点検索の各機能をAWS CLIで試してみようと思います。

AWS Location ServiceのV0では、プレースインデックスというplaceリソースを作らないとAPIが利用できませんでしたが、V2では作成不要になりました:smile:

とりあえず、ALSの機能を試したいという方は、APIエクスプローラーから各機能を試すことが出来ます

物理的な場所または住所を地理的座標 (経度と緯度) に変換:ジオコーディング

ジオコーディングには、Geocodeを利用します。
各パラメータは以下になります。

  • QueryText:場所を検索するための自由形式のテキストクエリ
  • QueryComponents:正確な検索のための住所番号、国、地域、郵便番号など。以下を指定可能
    • Country:国
    • Region:地域(都道府県など)
    • SubRegion:副地域
    • Locality:地域(市区町村など)
    • District:地区
    • Street:通り
    • AddressNumber:番地
    • PostalCode: 郵便番号
  • MaxResults:取得最大件数(100件まで)
  • BiasPosition[]:ユーザーが指定した場所または定義されたエリアに基づいて検索結果を優先(結果の順位を変更)
  • Filter.IncludeCountries[]:特定の国でフィルタリング
  • Filter.IncludePlaceTypes[]:以下のプレースタイプでフィルタリング
    • InterpolatedAddress:補完された住所
    • Intersection:交差点
    • Locality:地域(市区町村など)
    • PointAddress:特定地点の住所
    • PostalCode:郵便番号
    • Street:通り
  • AdditionalFeatures[]:取得結果に追加する以下の情報
    • Access
    • Intersections
    • SecondaryAddresses
    • TimeZone
  • Language:結果の言語
  • PoliticalView:指定した国の政治的見解を適用
  • IntendedUse:クエリ結果を保存するか
  • Key:APIキー
touch geocode.json
{
  "QueryText": "皇居",
  "QueryComponents": {
    "Country": "JPN",
    "Region": "東京都"
  },
  "MaxResults": 10,
  "BiasPosition": [
    139.76767220129236,
    35.68127589936451
  ],
  "Filter": {
    "IncludeCountries": [
      "JPN"
    ]
  },
  "AdditionalFeatures": [
    "Access",
    "Intersections"
  ],
  "Language": "JPN",
  "IntendedUse": "Storage"
}

aws geo-places geocode \
  --cli-input-json file://geocode.json

{
    "PricingBucket": "Stored",
    "ResultItems": [
        {
            "PlaceId": "AQAAAFUAJuXz61e1H6fwY5ZYYC3WqEhS8V-u1_m8WT333GkRRsVfk6Zf09T2kO9tts5DnIBePdpKv_vIEf9NB44EQDMKaTDXOgwIGQW7upx4PWqmKVV_5E4VJDQOxKZhe5S29OPd2ZKiwpw7rz-4cU9Y-MBWISkeTtmL",
            "PlaceType": "PointOfInterest",
            "Title": "皇居",
            "Address": {
                "Label": "東京都千代田区千代田1-1 皇居",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "Locality": "千代田区",
                "SubDistrict": "千代田",
                "SubBlock": "1",
                "AddressNumber": "1"
            },
            "Position": [
                139.7536,
                35.68372
            ],
            "Distance": 1299,
            "Categories": [
                {
                    "Id": "tourist_attraction",
                    "Name": "Tourist Attraction",
                    "LocalizedName": "観光スポット",
                    "Primary": true
                },
                {
                    "Id": "landmark-attraction",
                    "Name": "Landmark-Attraction",
                    "LocalizedName": "名所旧跡",
                    "Primary": false
                },
                {
                    "Id": "historical_monument",
                    "Name": "Historical Monument",
                    "LocalizedName": "歴史的記念物",
                    "Primary": false
                },
                {
                    "Id": "government_or_community_facility",
                    "Name": "Government or Community Facility",
                    "LocalizedName": "政府または地域の施設",
                    "Primary": false
                }
            ],
            "AccessPoints": [
                {
                    "Position": [
                        139.7536,
                        35.68372
                    ]
                }
            ],
            "MatchScores": {
                "Overall": 1.0,
                "Components": {
                    "Title": 1.0,
                    "Address": {
                        "Country": 1.0,
                        "Region": 1.0
                    }
                }
            },
            "ParsedQuery": {
                "Title": [
                    {
                        "StartIndex": 0,
                        "EndIndex": 2,
                        "Value": "皇居",
                        "QueryComponent": "Query"
                    }
                ],
                "Address": {
                    "Country": [
                        {
                            "StartIndex": 0,
                            "EndIndex": 3,
                            "Value": "JPN",
                            "QueryComponent": "Country"
                        }
                    ],
                    "Region": [
                        {
                            "StartIndex": 0,
                            "EndIndex": 3,
                            "Value": "東京都",
                            "QueryComponent": "Region"
                        }
                    ]
                }
            }
        },
        { ・・・ }
    ]
}

地理的座標 (経度と緯度) を住所に変換:リバースジオコーディング

リバースジオコーディングには、ReverseGeocodeを利用します。
各パラメータは以下になります。

  • QueryPosition:リバースジオコーディングする緯度経度
  • QueryRadius:検索半径
  • MaxResults
  • Filter.IncludePlaceTypes[]
  • AdditionalFeatures[]
  • Language
  • PoliticalView
  • IntendedUse
  • Key
TOHOシネマズ日比谷の緯度経度からリバースジオコーディング
cat reverse-geocode.json

{
    "QueryPosition": [
      139.75861,
      35.67396
    ],
    "QueryRadius": 50,
    "MaxResults": 10,
    "Filter": {
      "IncludePlaceTypes": [
        "PointAddress"
      ]
    },
    "AdditionalFeatures": [
        "Access",
        "Intersections"
    ],
    "Language": "JPN",
    "IntendedUse": "Storage"
}

aws geo-places reverse-geocode \
  --cli-input-json file://reverse-geocode.json

{
    "PricingBucket": "Stored",
    "ResultItems": [
        {
            "PlaceId": "AQAAAE8AsWIcXY79irhYQ4g-D-dDvK1EzZnXzBfyCACfoCZKp3-lxvQBFouvj29sH9nwLfB5ut_VUtRzrUVCAtkDJ-Vpy6QhaBO13w7Kc-qXz40hUBOxxEOYtXUyYTvXbuZnBPig2ithg4nxw0KM_yxhGJ0L",
            "PlaceType": "PointAddress",
            "Title": "〒100-0006 東京都千代田区有楽町1丁目1-2",
            "Address": {
                "Label": "〒100-0006 東京都千代田区有楽町1丁目1-2",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "SubRegion": {},
                "Locality": "千代田区",
                "SubDistrict": "有楽町",
                "PostalCode": "100-0006",
                "Block": "1丁目",
                "SubBlock": "1",
                "AddressNumber": "2"
            },
            "Position": [
                139.75918,
                35.67358
            ],
            "Distance": 0,
            "MapView": [
                139.75762,
                35.67248,
                139.76025,
                35.67463
            ],
            "AccessPoints": [
                {
                    "Position": [
                        139.75861,
                        35.67396
                    ]
                }
            ]
        }
    ]
}

ユーザが入力した場所や住所の候補を補完:オートコンプリート

ジオコーディングには、Autocompleteを利用します。
各パラメータは以下になります。

  • QueryText
  • MaxResults
  • BiasPosition[]
  • Filter.BoundingBox[]:4点の領域でフィルタリング
  • Filter.Circle[]:円でフィルタリング
  • Filter.IncludeCountries[]
  • Filter.IncludePlaceTypes[]
  • PostalCodeMode:郵便番号モード
  • AdditionalFeatures[]
  • Language
  • PoliticalView
  • IntendedUse
  • Key
新宿を検索
touch auto-complete.json
{
  "QueryText": "新宿",
  "MaxResults": 10,
  "BiasPosition": [
    139.76767220129236,
    35.68127589936451
  ],
  "Filter": {
    "IncludeCountries": [
      "JPN"
    ]
  },
  "AdditionalFeatures": [
    "Core"
  ],
  "Language": "JPN",
  "IntendedUse": "SingleUse"
}

aws geo-places autocomplete \
  --cli-input-json file://auto-complete.json

{
    "PricingBucket": "Core",
    "ResultItems": [
        {
            "PlaceId": "AQAAADMAJWwA7L9b04LfENYwqI6jjs8tu-J7IkFZXl7HAkxQIt_jTn_RUjG816XVdVE337Nn3C_U9nEwyApN-lbyq5xb9cpSkPZQY_gQ1f6CgMNWGiEV5mw",
            "PlaceType": "Locality",
            "Title": "日本, 新宿区",
            "Address": {
                "Label": "東京新宿区",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "SubRegion": {
                    "Name": "東京"
                },
                "Locality": "新宿区"
            },
            "Distance": 10283,
            "Language": "ja",
            "Highlights": {
                "Title": [
                    {
                        "StartIndex": 4,
                        "EndIndex": 6,
                        "Value": "��"
                    }
                ],
                "Address": {
                    "Label": [
                        {
                            "StartIndex": 2,
                            "EndIndex": 4,
                            "Value": "��"
                        }
                    ],
                    "Locality": [
                        {
                            "StartIndex": 0,
                            "EndIndex": 2,
                            "Value": "��"
                        }
                    ]
                }
            }
        }
    ]
}

ユーザが入力した情報から関連する場所を予測/推奨:サジェスト

ジオコーディングには、Suggestを利用します。
各パラメータは以下になります。

  • QueryText
  • MaxResults
  • MaxQueryRefinements:クエリ絞り込み条件の数を制限
  • BiasPosition[]
  • Filter.BoundingBox[]
  • Filter.Circle[]
  • Filter.IncludeCountries[]
  • AdditionalFeatures[]
  • Language
  • PoliticalView
  • IntendedUse
  • Key
東京駅近くのレストランを検索
touch suggest.json
{
  "QueryText": "レストラン",
  "MaxResults": 10,
  "MaxQueryRefinements": 10,
  "BiasPosition": [
    139.76767220129236,
    35.68127589936451
  ],
  "Filter": {
    "IncludeCountries": [
      "JPN"
    ]
  },
  "AdditionalFeatures": [
    "Core"
  ],
  "Language": "JPN",
  "IntendedUse": "SingleUse"
}

aws geo-places suggest \
  --cli-input-json file://suggest.json

{
    "PricingBucket": "Core",
    "ResultItems": [
        {
            "Title": "レストラン",
            "SuggestResultItemType": "Query",
            "Query": {
                "QueryId": "AQAAANAA6q47B6WiGxPqKc8M-x7-y8kIFUHhwulKFNoLOINP3dey4mB1laiQnxZMyWz4HbUUyf1CYTZ2YEOzPGb6VqFS-cC4doeyXNOnROH7cnHtc4LihC6SpLNxfANgwK7SJd0rjcI6_N4Q5jXGvmPiNoPPqTxAYswZjoABRIBqsIwFLq4CReBtbyUNkCq6LnMucKxDDK_DgdjPTNNw71O_qz_6gNsLtSthp3zkr6p3F4RAeWZt97_RqOyzY5IiEIF9CT5BdiXsBL8-2c9H4exHiGRnsTACuSZOrwAMHiBqFDbbu1dvUxDcSllyyc7iJQDJyZd1",
                "QueryType": "Category"
            },
            "Highlights": {
                "Title": [
                    {
                        "StartIndex": 0,
                        "EndIndex": 5,
                        "Value": "レ��"
                    }
                ]
            }
        },
        {
            "Title": "レストラン大宮 新丸ビル店",
            "SuggestResultItemType": "Place",
            "Place": {
                "PlaceId": "AQAAAFUAZD5VDUNBE5De5rQ-PyvVFoePJQc5S-RCvy65UfiUn4FDBLNYLPcN8ooVDrHZVBsmHqn_yeiop8QA3Q3MXu6gNIdm6iVrs4LTFy58KCvA0_6kS_Wkc9C_rkptuyRQmf5Ip6lQ558nYDzWK0-qdZ-8oJL1Z_hV",
                "PlaceType": "PointOfInterest",
                "Address": {
                    "Label": "〒100-0005 東京都千代田区丸の内1丁目5-1 レストラン大宮 新丸ビル店",
                    "Country": {
                        "Code2": "JP",
                        "Code3": "JPN",
                        "Name": "日本"
                    },
                    "Region": {
                        "Name": "東京都"
                    },
                    "Locality": "千代田区",
                    "SubDistrict": "丸の内",
                    "PostalCode": "100-0005",
                    "Block": "1丁目",
                    "SubBlock": "5",
                    "AddressNumber": "1"
                },
                "Position": [
                    139.76409,
                    35.68255
                ],
                "Distance": 353,
                "Categories": [
                    {
                        "Id": "casual_dining",
                        "Name": "Casual Dining",
                        "LocalizedName": "カジュアルダイニング",
                        "Primary": true
                    },
                    {
                        "Id": "restaurant",
                        "Name": "Restaurant",
                        "LocalizedName": "レストラン",
                        "Primary": false
                    }
                ],
                "FoodTypes": [
                    {
                        "LocalizedName": "ヨーロッパ料理",
                        "Id": "european",
                        "Primary": true
                    },
                    {
                        "LocalizedName": "日本料理",
                        "Id": "japanese",
                        "Primary": false
                    },
                    {
                        "LocalizedName": "折衷料理",
                        "Id": "fusion",
                        "Primary": false
                    }
                ]
            },
            "Highlights": {
                "Title": [
                    {
                        "StartIndex": 0,
                        "EndIndex": 5,
                        "Value": "レ��"
                    }
                ],
                "Address": {
                    "Label": [
                        {
                            "StartIndex": 27,
                            "EndIndex": 32,
                            "Value": "田��"
                        }
                    ]
                }
            }
        },
        { ・・・ }
    ],
    "QueryRefinements": []
}

指定した座標からの一定範囲内のPOIを検索:ニアバイサーチ

ニアバイサーチには、SearchNearbyを利用します。
各パラメータは以下になります。

  • QueryPosition
  • QueryRadius
  • MaxResults
  • Filter.BoundingBox[]
  • Filter.IncludeCountries[]
  • Filter.IncludeCategories[]:結果に含めるカテゴリ
  • Filter.ExcludeCategories[]:結果から除外するカテゴリ
  • Filter.IncludeBusinessChains[]:結果に含めるビジネスチェーン
  • Filter.ExcludeBusinessChains[]:結果から除外するビジネスチェーン
  • Filter.IncludeFoodTypes[]:結果に含める食品タイプ
  • Filter.ExcludeFoodTypes[]:結果から除外する食品タイプ
  • AdditionalFeatures[]
  • Language
  • PoliticalView
  • IntendedUse
  • NextToken
  • Key
五反田駅から半径500m以内の中華料理屋を検索
touch search-nearby.json

{
    "QueryPosition": [
      139.72390796812374,
      35.62627244256367
    ],
    "QueryRadius": 500,
    "MaxResults": 10,
    "Filter": {
      "IncludeFoodTypes": [
        "chinese"
      ]
    },
    "AdditionalFeatures": [
        "Contact",
        "Phonemes"
    ],
    "Language": "JPN",
    "IntendedUse": "Storage"
}

aws geo-places search-nearby \
  --cli-input-json file://search-nearby.json

{
    "PricingBucket": "Stored",
    "ResultItems": [
        {
            "PlaceId": "AQAAAFUANsRstvLy4Do7nSs6nhtKiTsEYm19YdF6zqx0kpJAw0pzLnMwygegMwB2go2sYdgqWG4pYjem4qSc8uTL8bXRJMFLyQ1tM8TxI8BSS2Ddzi7i0t4lzp3UAA5r7YDZk_W_XXPzGUOAN8lZjVanw8D1DTrzguZw",
            "PlaceType": "PointOfInterest",
            "Title": "点心酒場PAOPAO+",
            "Address": {
                "Label": "〒141-0022 東京都品川区東五反田1丁目26-3 点心酒場PAOPAO+",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "Locality": "品川区",
                "SubDistrict": "東五反田",
                "PostalCode": "141-0022",
                "Block": "1丁目",
                "SubBlock": "26",
                "AddressNumber": "3"
            },
            "Position": [
                139.72393,
                35.62615
            ],
            "Distance": 13,
            "Categories": [
                {
                    "Id": "restaurant",
                    "Name": "Restaurant",
                    "LocalizedName": "レストラン",
                    "Primary": true
                }
            ],
            "FoodTypes": [
                {
                    "LocalizedName": "中華料理",
                    "Id": "chinese",
                    "Primary": true
                }
            ],
            "Contacts": {
                "Phones": [
                    {
                        "Value": "+81334418088"
                    }
                ],
                "Websites": [
                    {
                        "Value": "https://www.atre.co.jp/store/gotanda/shop/detail/2140"
                    }
                ]
            },
            "OpeningHours": [
                {
                    "Display": [
                        "月-日: 11:00 - 23:00"
                    ],
                    "OpenNow": true,
                    "Components": [
                        {
                            "OpenTime": "T110000",
                            "OpenDuration": "PT12H00M",
                            "Recurrence": "FREQ:DAILY;BYDAY:MO,TU,WE,TH,FR,SA,SU"
                        }
                    ]
                }
            ]
        },
        {
            "PlaceId": "AQAAAFUApb3UBKZlX-92Fvs8YVtoW8VMeepRCKIdx9M9GcrJybZqfk3I5nK6Qt9WmV90HBW0RM-fXFRZqULaSwhML8o3VQq_b422-JZ0FgwzGdEesW4C3uCruUkPVX1lC8ML-x1zUZpxXJGoL_uAPGfyDKTAm65ifVMU",
            "PlaceType": "PointOfInterest",
            "Title": "点心酒場パオパオ+",
            "Address": {
                "Label": "〒141-0022 東京都品川区東五反田1丁目26-3 点心酒場パオパオ+",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "Locality": "品川区",
                "SubDistrict": "東五反田",
                "PostalCode": "141-0022",
                "Block": "1丁目",
                "SubBlock": "26",
                "AddressNumber": "3"
            },
            "Position": [
                139.72396,
                35.62607
            ],
            "Distance": 23,
            "Categories": [
                {
                    "Id": "casual_dining",
                    "Name": "Casual Dining",
                    "LocalizedName": "カジュアルダイニング",
                    "Primary": true
                }
            ],
            "FoodTypes": [
                {
                    "LocalizedName": "中華料理",
                    "Id": "chinese",
                    "Primary": true
                }
            ],
            "Contacts": {
                "Phones": [
                    {
                        "Value": "+81334418088"
                    }
                ]
            }
        }
    ]
}
五反田駅から半径500m以内のスターバックスを検索
touch search-nearby.json

aws geo-places search-nearby \
  --cli-input-json file://search-nearby.json

{
    "PricingBucket": "Stored",
    "ResultItems": [
        {
            "PlaceId": "AQAAAFUAVPDtcKyvKuZjs2HgWJ-_enFxgYgx-TiXY6yoGKUkz58z-zujcviZXi9SQsXIclppzFfMlaaD7XJO8O1YNV3xQXi1tOzYnmNJoYqxyNVQDun_bMUhVRpE-bpu2IT-JrgLD_lhYFLhGGatw5yX3HfV0BlE35l_",
            "PlaceType": "PointOfInterest",
            "Title": "スターバックスコーヒー 五反田東急スクエア店",
            "Address": {
                "Label": "〒141-0022 東京都品川区東五反田2丁目1-2 スターバックスコーヒー 五反田東急スクエア店",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "Locality": "品川区",
                "SubDistrict": "東五反田",
                "PostalCode": "141-0022",
                "Block": "2丁目",
                "SubBlock": "1",
                "AddressNumber": "2"
            },
            "Position": [
                139.72454,
                35.62555
            ],
            "Distance": 98,
            "Categories": [
                {
                    "Id": "coffee_shop",
                    "Name": "Coffee Shop",
                    "LocalizedName": "コーヒー店",
                    "Primary": true
                }
            ],
            "BusinessChains": [
                {
                    "Name": "Starbucks",
                    "Id": "Starbucks"
                }
            ],
            "Contacts": {
                "Phones": [
                    {
                        "Value": "+81357954321"
                    }
                ],
                "Websites": [
                    {
                        "Value": "https://store.starbucks.co.jp/detail-808/"
                    }
                ]
            },
            "OpeningHours": [
                {
                    "Display": [
                        "月-日: 07:00 - 22:30"
                    ],
                    "OpenNow": true,
                    "Components": [
                        {
                            "OpenTime": "T070000",
                            "OpenDuration": "PT15H30M",
                            "Recurrence": "FREQ:DAILY;BYDAY:MO,TU,WE,TH,FR,SA,SU"
                        }
                    ]
                }
            ]
        },
        {
            "PlaceId": "AQAAAFUA4X9bYepQXSQDbsJLzh99Lw3qGasfGGORfy3tduUDa-kKNEZsntVIc_kKu0t-SF96dWcsxLl26640IAj2zeeapt5w4XFTLP-ZcIivMTA_Htz_0UUpuko8IpOGJEruzHCxTx9e2g8JYv-mZ0WG8e9MvcNdDMwl",
            "PlaceType": "PointOfInterest",
            "Title": "スターバックスコーヒー 西五反田店",
            "Address": {
                "Label": "〒141-0031 東京都品川区西五反田1丁目18-1 スターバックスコーヒー 西五反田店",
                "Country": {
                    "Code2": "JP",
                    "Code3": "JPN",
                    "Name": "日本"
                },
                "Region": {
                    "Name": "東京都"
                },
                "Locality": "品川区",
                "SubDistrict": "西五反田",
                "PostalCode": "141-0031",
                "Block": "1丁目",
                "SubBlock": "18",
                "AddressNumber": "1"
            },
            "Position": [
                139.72296,
                35.62362
            ],
            "Distance": 307,
            "Categories": [
                {
                    "Id": "coffee_shop",
                    "Name": "Coffee Shop",
                    "LocalizedName": "コーヒー店",
                    "Primary": true
                }
            ],
            "BusinessChains": [
                {
                    "Name": "Starbucks",
                    "Id": "Starbucks"
                }
            ],
            "Contacts": {
                "Phones": [
                    {
                        "Value": "+81354342219"
                    }
                ],
                "Websites": [
                    {
                        "Value": "https://store.starbucks.co.jp/detail-24/"
                    }
                ]
            },
            "OpeningHours": [
                {
                    "Display": [
                        "月-日: 07:00 - 22:00"
                    ],
                    "OpenNow": true,
                    "Components": [
                        {
                            "OpenTime": "T070000",
                            "OpenDuration": "PT15H00M",
                            "Recurrence": "FREQ:DAILY;BYDAY:MO,TU,WE,TH,FR,SA,SU"
                        }
                    ],
                    "Categories": [
                        {
                            "Id": "coffee_shop",
                            "Name": "Coffee Shop"
                        }
                    ]
                }
            ]
        }
    ]
}

アプリケーションで検索を行う際のベストプラクティス

アプリケーションでPlacesAPIを利用する際のベストプラクティスが、AWSで紹介されています。

オートコンプリート実装

デバウンス

対象のイベントが発生してから指定した時間が経過するまでは、同じイベントの発生を抑制します。
これにより、不要なAPI通信を減らすことができ、負荷やコストを軽減できます
例:文字入力のたびにAPIを実行するのではなく、入力されてから一定時間入力されなければAPI実行

ブラウザキャッシュ

最近の検索クエリと結果をローカルにキャッシュすることで、同じデータに対する冗長な APIコールを回避するのに役立ちます。
これにより、ネットワークトラフィックが最小限に抑えられ、キャッシュされたデータが利用可能な場合に処理されるため、アプリケーションが高速化されます

適切な結果の取得

バイアス位置や、円・境界ボックスなどのフィルターを使用し、出力を関連する場所に制限することで、結果を強化できます。
さらに、国・場所タイプ・カテゴリなどのフィルターによって、特定の基準を含めるか除外することで、検索の絞り込みに役立ちます

おまけ

最後にPlaces系で使えるAPIについて紹介します。

  • Autocomplete:ユーザー入力の部分的な情報に基づいて、検索場所や住所を補完
  • Geocode:テキストで入力された住所や場所を地理座標に変換
  • GetPlace:特定の場所(PlaceId)に関する住所・営業時間・連絡先・その他のメタデータなど詳細情報を取得
  • ReverseGeocode:地理座標から人が読める住所や場所に変換
  • SearchNearby:指定した地理座標から、一定の半径または距離内で観光スポットや興味のある地点 (POI)を検索
  • SearchText:テキスト入力から住所・観光スポットを検索し、場所名・住所・電話番号・連絡先・営業時間などの情報を返す
  • Suggest:ユーザーの入力やコンテキストに基づいて、関連する場所・観光スポット・検索語句などのインテリジェントな予測や推薦を提供

おわりに

今回は、ALSの1機能であるPlacesについて紹介しました。
マップでよく使う検索機能は、こういった機能で成り立っているということがわかって良かったです:smile:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?