はじめに
こんにちは、デジタル推進課 まっきーです。今回はGoogle Map の情報が簡単に手に入る、Google Map Place API について解説したいと思います。
これからGoogle Map Place API を使用して、レストランの名前や住所情報からGoogle の評価や評価数など、Google Map の情報を取得したい方 に向けて備忘録を残しておきます。
意外とGoogle Map Place API に関する情報って少ないんですよね。。あと、公式ドキュメントの情報がかなり散らばっていてわかりづらい。。。2023年8月時点の公開された時にはDocumentが正しく公開されていなくて分からなかったGoogle Map Place API (New)ですが、ついに正しく公開されていたので、使用例を含めて解説したいと思います。サンプルコードも追記しているので、数十時間の時間の節約になると思います!
また、お仕事のお問い合わせはいつでもお待ちしております。下記のリンクよりお気軽にご相談ください!
まっきー | デジタル推進課 (@makkynm) | Twitter
Google Forms
まずどんなことができるかを想像してもらうため、実際にGoogle Map API とその他の情報を組み合わせて作ったものをまずはじめにご紹介します。Dinersダッシュ ボードの2024年版がPlace API (New)を使用したものになります。
ダイナースクラブ カードで使用できる、エグゼクティブダイニングですが、Google 信者の私はエグゼクティブダイニング対象かつGoogle で評価が良いところに行きたくなります。そんな場所を素早く検索できるダッシュ ボードです。
Paypay30%還元キャンペーン対象店舗 のGoogle 評価検索
美味しいレストラン検索アプリ
Place API (New)のメリット
Place API と、Place API (New)の違いについては、下記の公式ドキュメントが役立つと思います。Place API を使っていなかった方はスキップして問題ないです。
API バージョンの選択 | Places API | Google for Developers
以前のPlace API と比べて、下記の追加機能は個人的に嬉しかったです。
料金体系 フィールド マスクを使用してレスポンスで返すフィールドのリストを制御でき、リクエス トしたデータに対してのみ課金される
場所について一貫したレスポンス データ Place Details、Nearby Search、Text Search の各 API が1 つの場所に対して同じデータを返すようにレスポンスが標準化されている。
展開された場所のタイプ API レスポンスに場所の primary type が含まれるようになった
Place API (New)の種類
API の種類が若干減り、よりAPI の種類が選択しやすくなったように思えます。Inputパラメータが重要なので、各API のinput parameterを羅列します。
返されるOutputデータは、今回から標準化されました。料金体系のところにあるFieldが返されるフィールドの種類です。名前から大体は想像できますが、詳しくは公式Documentをご覧ください。ただし一部しか載っていない場合が多々あります。。
プレイスクラスのデータ フィールド | Maps JavaScript API | Google for Developers
Place API の種類(新旧比較)
検索キーワードを与えると、それに関連する場所のリストを返します
https://places.googleapis.com/v1/places:searchText
input parameter
FieldMask(レスポンスの種類の指定)*必須
textQuery(検索キーワード)*必須
includedType (Google Map上のタイプ eg. "bar")
Supported types | Places API | Google for Developers
languageCode(言語 eg. "ja")
locationBias or locationRestriction(検索領域の指定、中心位置・半径などを与えて、長方形もしくは円で検索領域を指定できる)
maxResultCount (結果を返す場所の数 1 ~ 20の範囲で指定)
minRating (最低評価 値は 0.0 ~ 5.0 の範囲で、0.5 単位で指定)
openNow (現在営業中か e.g. true)
priceLevels (価格帯 デフォルトでは、すべての価格レベルが選択) PRICE_LEVEL_UNSPECIFIED PRICE_LEVEL_FREE PRICE_LEVEL_INEXPENSIVE PRICE_LEVEL_MODERATE PRICE_LEVEL_EXPENSIVE PRICE_LEVEL_VERY_EXPENSIVE
rankPreference (レスポンスにおける結果のランキング方法を指定 DISTANCE: 距離別, RELEVANCE: 関連性)
regionCode (国コード e.g. "JP")
strictTypeFiltering (true に設定すると、includeType で指定したタイプに一致する場所のみが返される)
Google Map上のplace typeと位置情報、半径を与えると、関連する場所のリストを返します
https://places.googleapis.com/v1/places:searchNearby
input parameter
FieldMask(レスポンスの種類の指定)*必須
locationRestriction(検索領域の指定、中心位置・半径を与えて、円で検索領域を指定できる。半径は 0.0 ~ 50000.0 の範囲で指定)*必須
includeTypes/excludedTypes、includePrimaryTypes/excludedPrimaryTypes (Google Map上のタイプ。リストで指定 eg. "bar")
languageCode(言語 eg. "ja")
maxResultCount (結果を返す場所の数 1 ~ 20の範囲で指定)
rankPreference (レスポンスにおける結果のランキング方法を指定 POPULARITY: 人気度, DISTANCE: 距離)
regionCode (国コード e.g. "JP")
Place ID を与えると、その場所の詳細情報を返します
https://places.googleapis.com/v1/places/PLACE_ID
input parameter
Place Photo requests
PhotoURLを与えると、その写真を返します
https://places.googleapis.com/v1/NAME/media?key=API_KEY& PARAMETERS
input parameter
Photo name(写真の ID。Text Search(New)または Nearby Search(New)の結果のphotosリスト内に含まれている)*必須
maxHeightPx and maxWidthPx (画像の高さと幅の最大値をピクセル 単位で指定。1から4800までの整数)*必須
skipHttpRedirect (デフォルトはfalse。falseの場合、HTTPリダイレクトを行なって画像を返す。)
Place API (New)の料金体系
最新の情報は公式ドキュメントを参照いただければと思います。
Places API の使用量と請求額 | Google for Developers
下記は記事作成時、2024年1月16日現在の情報です。Place Details、 NearbySearch、Text SearchというAPI の種類とレスポンスの種類によって料金体系が異なります。リクエス トしたフィールドの種類で一番単価の高いフィールドを元に課金 されるので、それ以下の単価のフィールドについてはいくつリクエス トしても同じ料金という理解です。1つの場所に対して調べる場合は、Text SearchでPlaceIDのみ先に取得して、それを元にPlace Detailで詳細を取得する方が安い可能性があります。 曖昧検索のような形で複数の場所を一括で調べたい場合は、新料金の方が安いでしょう。無料枠が1 か月あたり 200 ドル分 のあるので、趣味程度であれば気にすることはないと思います。
Text Search(New)の料金
レスポンス:IDのみ
料金:無料 フィールド:places.id, places.name
レスポンス:Basic
料金:0.032 USD per request (0~100,000 requests / month) フィールド:places.accessibilityOptions, places.addressComponents, places.adrFormatAddress, places.businessStatus, places.displayName, places.formattedAddress, places.googleMapsUri, places.iconBackgroundColor, places.iconMaskBaseUri, places.location, places.photos, places.plusCode, places.primaryType, places.primaryTypeDisplayName, places.shortFormattedAddress, places.subDestinations, places.types, places.utcOffsetMinutes, places.viewport
レスポンス:Advanced
料金:0.035 USD per request (0~100,000 requests / month) フィールド:places.currentOpeningHours, places.currentSecondaryOpeningHours, places.internationalPhoneNumber, places.nationalPhoneNumber, places.priceLevel, places.rating, places.regularOpeningHours, places.regularSecondaryOpeningHours, places.userRatingCount, places.websiteUri
レスポンス:Preferred
料金:0.040 USD per request (0~100,000 requests / month) フィールド:places.allowsDogs, places.curbsidePickup, places.delivery, places.dineIn, places.editorialSummary, places.evChargeOptions*, places.fuelOptions*, places.goodForChildren, places.goodForGroups, places.goodForWatchingSports, places.liveMusic, places.menuForChildren, places.parkingOptions*, places.paymentOptions, places.outdoorSeating, places.reservable, places.restroom, places.reviews, places.servesBeer, places.servesBreakfast, places.servesBrunch, places.servesCocktails, places.servesCoffee, places.servesDesserts, places.servesDinner, places.servesLunch, places.servesVegetarianFood, places.servesWine, places.takeout
Nearby Search(New) の料金
レスポンス:Basic
料金:0.032 USD per request (0~100,000 requests / month) フィールド:places.accessibilityOptions, places.addressComponents, places.adrFormatAddress, places.businessStatus, places.displayName, places.formattedAddress, places.googleMapsUri, places.iconBackgroundColor, places.iconMaskBaseUri, places.id, places.location, places.name*, places.photos, places.plusCode, places.primaryType, places.primaryTypeDisplayName, places.shortFormattedAddress, places.subDestinations, places.types, places.utcOffsetMinutes, places.viewport
レスポンス:Advanced
料金:0.035 USD per request (0~100,000 requests / month) フィールド:places.currentOpeningHours, places.currentSecondaryOpeningHours, places.internationalPhoneNumber, places.nationalPhoneNumber, places.priceLevel, places.rating, places.regularOpeningHours, places.regularSecondaryOpeningHours, places.userRatingCount, places.websiteUri
レスポンス:Preferred
料金:0.040 USD per request (0~100,000 requests / month) フィールド:places.allowsDogs, places.curbsidePickup, places.delivery, places.dineIn, places.editorialSummary, places.evChargeOptions*, places.fuelOptions*, places.goodForChildren, places.goodForGroups, places.goodForWatchingSports, places.liveMusic, places.menuForChildren, places.parkingOptions*, places.paymentOptions, places.outdoorSeating, places.reservable, places.restroom, places.reviews, places.servesBeer, places.servesBreakfast, places.servesBrunch, places.servesCocktails, places.servesCoffee, places.servesDesserts, places.servesDinner, places.servesLunch, places.servesVegetarianFood, places.servesWine, places.takeout
Place Details(New) の料金
レスポンス:IDのみ
料金:無料 フィールド:places.id, places.name, photos
レスポンス:Basic
料金:0.0170 USD per request (0~100,000 requests / month) フィールド:accessibilityOptions, addressComponents, adrFormatAddress, businessStatus, displayName, formattedAddress, googleMapsUri, iconBackgroundColor, iconMaskBaseUri, location, primaryType, primaryTypeDisplayName, plusCode, shortFormattedAddress, subDestinations, types, utcOffsetMinutes, viewport
レスポンス:Advanced
料金:0.020 USD per request (0~100,000 requests / month) フィールド:currentOpeningHours, currentSecondaryOpeningHours, internationalPhoneNumber, nationalPhoneNumber, priceLevel, rating, regularOpeningHours, regularSecondaryOpeningHours, userRatingCount, websiteUri
レスポンス:Preferred
料金:0.025 USD per request (0~100,000 requests / month) フィールド:allowsDogs, curbsidePickup, delivery, dineIn, editorialSummary, evChargeOptions*, fuelOptions*, goodForChildren, goodForGroups, goodForWatchingSports, liveMusic, menuForChildren, parkingOptions*, paymentOptions, outdoorSeating, reservable, restroom, reviews, servesBeer, servesBreakfast, servesBrunch, servesCocktails, servesCoffee, servesDesserts, servesDinner, servesLunch, servesVegetarianFood, servesWine, takeout
Photo Search(New) の料金
料金:0.007 USD per request (0~100,000 requests / month)
おわりに
ここまでの記事でほぼGoogle Map Place API (New)についてはかなり理解できたのではないでしょうか。レストランなどの場所の名前一覧からGoogle Mapの評価・評価数を取得できるだけでかなりできることが増えると思いますし、生活が楽になるかと思います。ぜひ使ってみてください!
また、お仕事のご依頼はいつでもお待ちしております。企業様の案件を夜間稼働にて受けることも多々あります。少しでも興味が湧きましたら、Twitter DMもしくはお問い合わせフォームよりご連絡ください。
Twitter アカウント
まっきー | デジタル推進課 (@makkynm) | Twitter
お問い合わせフォーム
Google Forms
python を使用したサンプルコードは公式ドキュメントに載っていなかったりします。そこで下記にPlace API (New)のリクエス トサンプルコード、及びレスポンス分解のサンプルコードを公開したいと思います。こちらのコード、かなり丁寧に作り込みました。
関数でお渡ししているので、このままコピペすれば使える ようになっております。
料金ごとにコメントアウト しているので、レスポンスとして使用したい料金レンジの部分だけコメントアウト を外せばすぐにお使いできます。また、optional parameterの例も載せているので、それらを使いたい場合も使い方がすぐ分かると思います。
レスポンス例も追加したので、レスポンスの分解やどんなフィールドを使用すべきかを検討する際にもご使用いただけると思います。
Google Map API の仕様変更がある可能性がありますので、そちらには十分ご留意いただいた上でお使いください。