デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

初心者でもok! Google Map Places API(New)の使い方 - Pythonコード付きで完全解説

 

はじめに

こんにちは、デジタル推進課 まっきーです。今回は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 Place APIの使用例

まずどんなことができるかを想像してもらうため、実際にGoogle Map APIとその他の情報を組み合わせて作ったものをまずはじめにご紹介します。Dinersダッシュボードの2024年版がPlace API(New)を使用したものになります。

ダイナース エグゼクティブダイニング のGoogle評価検索

ダイナースクラブカードで使用できる、エグゼクティブダイニングですが、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の種類(新旧比較)

 

Text Search(New)

検索キーワードを与えると、それに関連する場所のリストを返します

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 で指定したタイプに一致する場所のみが返される)

Nearby Search(New)

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")

PlaceDetail (New)

Place IDを与えると、その場所の詳細情報を返します

https://places.googleapis.com/v1/places/PLACE_ID

input parameter

  • FieldMask(レスポンスの種類の指定)*必須

  • placeId(場所を一意に識別する ID。Text Search(New)または Nearby Search(New)の結果に含まれている)*必須

  • languageCode(言語 eg. "ja")
  • regionCode (国コード e.g. "JP")

 

PlacePhoto(New)

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

 

Google Map Place APIの使い方 (pythonサンプルコード)

pythonを使用したサンプルコードは公式ドキュメントに載っていなかったりします。そこで下記にPlace API(New)のリクエストサンプルコード、及びレスポンス分解のサンプルコードを公開したいと思います。こちらのコード、かなり丁寧に作り込みました。

関数でお渡ししているので、このままコピペすれば使えるようになっております。

料金ごとにコメントアウトしているので、レスポンスとして使用したい料金レンジの部分だけコメントアウトを外せばすぐにお使いできます。また、optional parameterの例も載せているので、それらを使いたい場合も使い方がすぐ分かると思います。

レスポンス例も追加したので、レスポンスの分解やどんなフィールドを使用すべきかを検討する際にもご使用いただけると思います。

Google Map APIの仕様変更がある可能性がありますので、そちらには十分ご留意いただいた上でお使いください。

 

この続きはcodocで購入