Google MapsのPlace IDをキャッシュ/リフレッシュする

# PlaceIDとは

Google Mapsの PlaceID は、建物や店舗など「**場所**」に付与された一意なID。
他のデータとは少し毛色の違う下記のような特徴がある。

- ユーザー側のシステムに無期限でキャッシュできる
- キャッシュのリフレッシュのためのAPI呼び出しは無料

その他の特徴は [PlaceIDのドキュメント](https://developers.google.com/places/place-id) 参照。
簡単にまとめると、

- IDの長さは可変
- PlaceIDで場所を一意に特定できる
- 1つの場所に複数のPlaceIDが付くこともある
- PlaceIDは変わることもある

PlaceIDのサンプルをいくつか。
サンプルだと27〜114文字だが、最大長は分からない。

```
ChIJgUbEo8cfqokR5lP9_Wh_DaM
GhIJQWDl0CIeQUARxks3icF8U8A
EicxMyBNYXJrZXQgU3QsIFdpbG1pbmd0b24sIE5DIDI4NDAxLCBVU0EiGhIYChQKEgnRTo6ixx-qiRHo_bbmkCm7ZRAN
EicxMyBNYXJrZXQgU3QsIFdpbG1pbmd0b24sIE5DIDI4NDAxLCBVU0E
IhoSGAoUChIJ0U6OoscfqokR6P225pApu2UQDQ
ElMxNjIsIExhbmUgTnVtYmVyIDcsIEJsb2NrIEgsIE5lYiBTYXJhaSwgU2FpbmlrIEZhcm0sIE5ldyBEZWxoaSwgRGVsaGkgMTEwMDYyLCBJbmRpYQ
```

# コンテンツのキャッシュと規約

Google Maps APIで取得したデータはユーザー側でキャッシュできるのか。

規約上は原則としてコンテンツのキャッシュは禁止されている。
一時的なキャッシュとして30日間保持することが許可されている項目もある。
[Google Maps Platform Terms of Service 3.2.3(b) No Caching](https://cloud.google.com/maps-platform/terms#3.-license.)

ただし、PlaceIDはサービス固有の規約でキャッシュできることになっている。
[Google Maps Platform Service Specific Terms 5.4 Caching](https://cloud.google.com/maps-platform/terms/maps-service-terms#5.-places-api)

サービス固有の規約上はPlaces API Policiesに従うようになっており、そこにも無期限にキャッシュを保持できる旨が記載されている。
[Pre-Fetching, Caching, or Storage of Content](https://developers.google.com/places/web-service/policies#pre-fetching,-caching,-or-storage-of-content)

# キャッシュしたPlaceIDの用途

キャッシュして何に使うのか。

当然Google Mapsの色々なAPIを横断しても使える。
1度目のリクエストでは検索して、2度目以降はPlaceIDで引っ張ってくるというのも一般的に多そう。
あと、自社のシステムで保持しているデータとGoogle Mapsの場所データをリンクさせたり。

# キャッシュ時の考慮事項

キャッシュ全般に言えることだが、オリジナルのデータと整合性が取れなくなる。
その対策というか考慮事項についてはここに書いてあった。
[Save place IDs for later use](https://developers.google.com/places/place-id#save-id)

これもまとめておくと、

- `NOT_FOUND` が返ってくることがある
- PlaceIDは定期的にリフレッシュするのがベストプラクティス
- PlaceIDのリフレッシュに使うAPIは何回呼び出しても無料
- リフレッシュするためには、Place Detailsリクエストで `fields` パラメーターにPlaceIDだけ指定する
- リフレッシュ時に `NOT_FOUND` が返ってくることがある（え
- 1つの方法として、PlaceIDを取得したときのリクエストを保持しておく方法がある（え
- ただし、そのリクエストは有料（ええ

## PlaceIDの更新事由

その他に、どういった理由でPlaceIDが変わるのかも書いてあった。

- 移転
- 閉店
- Googleの都合（え

PlaceIDの中には変わりやすい、もしくは `NOT_FOUND` を返しやすい場所もあるらしい。
よく分からなかったので原文のまま引用・・・

- Street addresses that do not exist in Google Maps as precise addresses, but are inferred from a range of addresses
- Segments of a long route, where the request also specifies a city or locality
- 交差点(これは分かった)
- Places with an address component of type subpremise

こういった場所はPlaceIDが長くなる傾向にあるっぽい。
サンプルに挙げたこの長いIDがそれ。

```
ElMxNjIsIExhbmUgTnVtYmVyIDcsIEJsb2NrIEgsIE5lYiBTYXJhaSwgU2FpbmlrIEZhcm0sIE5ldyBEZWxoaSwgRGVsaGkgMTEwMDYyLCBJbmRpYQ
```

# リフレッシュAPIの呼び出し

PlaceIDのリフレッシュAPIは、実際はPlaces Detailsである。
[SKU: Places Details](https://developers.google.com/places/web-service/usage-and-billing#places-details)

Place Details APIの `fields` パラメーターにPlaceIDのみ指定して使う。
PlaceIDだけ指定したリクエストは無料になる。
PlaceIDをキーに呼び出し、PlaceIDだけ返ってくる。
[SKU: Places Details – ID Refresh](https://developers.google.com/places/web-service/usage-and-billing#places-details-id-refresh)

Place Search APIでも `fields` パラメーターにPlaceIDだけ指定すれば無料で利用できる。
未指定の場合はPlaceIDしか返ってこなかったと思うので、その場合も無料かもしれない。
[SKU: Find Place – ID only](https://developers.google.com/maps/billing/gmp-billing#find-place-id-only)

# 実際の運用

実際どのような運用になるか。したことないけど。

## PlaceIDの取得

PlaceIDの長さは最大256文字くらい想定？
初回は Place Search か Place Details API を使って PlaceID とその他のデータを取得する。

## キャッシュ

閉店の状態は `business_status` で見るらしい。
その場合にPlaceIDが取得できるのか変更がないのか分からないが、要件によっては保存しておく必要があるかもしれない。

取得したPlaceIDはキャッシュするとして、取得時のリクエストもPlaceIDと一緒に保存しておく。

## リフレッシュ

Place Detail API を使って定期的にPlaceIDを更新する。
`NOT_FOUND` が返ってきた場合は、保持していたリクエストを Place Search API に投げてPlaceIDを取得し直す。

この時、`fields` パラメーターにPlaceIDだけ指定すれば無料になるが、さすがに他のフィールドを検証しないでPlaceIDだけ更新するのはどうかと思う。
なので、Place SearchでPlaceID以外の情報も有料で取得・検証して問題なければPlaceIDを更新するか、
Place SearchでPlaceIDだけ無料で取得して、Place Detailsで詳細な情報を有料で取得・検証した上でPlaceIDを更新するのかなと思う。