LoginSignup
15
12

More than 3 years have passed since last update.

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

Posted at

PlaceIDとは

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

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

その他の特徴は PlaceIDのドキュメント 参照。
簡単にまとめると、

  • 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

ただし、PlaceIDはサービス固有の規約でキャッシュできることになっている。
Google Maps Platform Service Specific Terms 5.4 Caching

サービス固有の規約上はPlaces API Policiesに従うようになっており、そこにも無期限にキャッシュを保持できる旨が記載されている。
Pre-Fetching, Caching, or Storage of Content

キャッシュしたPlaceIDの用途

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

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

キャッシュ時の考慮事項

キャッシュ全般に言えることだが、オリジナルのデータと整合性が取れなくなる。
その対策というか考慮事項についてはここに書いてあった。
Save place IDs for later use

これもまとめておくと、

  • 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

Place Details APIの fields パラメーターにPlaceIDのみ指定して使う。
PlaceIDだけ指定したリクエストは無料になる。
PlaceIDをキーに呼び出し、PlaceIDだけ返ってくる。
SKU: Places Details – ID Refresh

Place Search APIでも fields パラメーターにPlaceIDだけ指定すれば無料で利用できる。
未指定の場合はPlaceIDしか返ってこなかったと思うので、その場合も無料かもしれない。
SKU: 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を更新するのかなと思う。

15
12
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
15
12