🛣️

【Google Maps Platform】Street View Static APIで特定の場所と視点のパノラマ画像をダウンロードする

2024/07/27に公開

概要

Google Maps上のあるポイントで特定視点のパノラマ画像をダウンロードできれば、個人開発などでアプリ内で色々有効活用ができそうだなと思い、Street View Static API を使ってパノラマ画像をダウンロードする方法やコスト面を色々調査してみました。

Street View Static API

https://developers.google.com/maps/documentation/streetview/overview?hl=ja

Street View Static API では、JavaScript を使用せずに、静的(非インタラクティブ)なストリートビュー パノラマやサムネイルをウェブページに埋め込むことができます。標準の HTTP リクエストを介して送信される URL パラメータを使って、ビューポートを定義します。このリクエストにより、静止画像が返されます。

このAPIを使用するには課金登録したGCPのプロジェクトで、Street View Static APIを有効にする必要があります。

https://developers.google.com/maps/documentation/streetview/cloud-setup?hl=ja

APIキーの作成

  1. こちらのリンクからGoogle Maps Platformページに移動します
  2. プロジェクトを選択します
  3. API一覧から「Street View Static API」を探し「Keys」を選択します
    image1.png
  4. 「認証情報を作成」>「API キー」を選択します
    image2.png
    image3.png
  5. 作成したAPIキーの任意の名前、APIの制限 (Street View Static API)を設定します
    image4.png
    image5.png

これでAPIキーの設定は完了です。

作成したAPIキーで早速👇のURLを叩いてみると

(YOUR_API_KEYの部分に作成したAPIキーを設定)

https://maps.googleapis.com/maps/api/streetview?size=400x400&location=47.5763831,-122.4211769&fov=80&heading=70&pitch=0&key=YOUR_API_KEY

👇の様な画像が表示されていればOKです。

image6.png

リクエストパラメータ

https://developers.google.com/maps/documentation/streetview/request-streetview?hl=ja

指定できるパラメータは👆に詳細が載っています、今回は実際に色々試しながらどんな挙動になるのか確認してみたいと思います。

https://maps.googleapis.com/maps/api/streetview?parameters

👆の ?parameters の部分に色々設定します。

必須パラメータ

  • location
    • テキスト文字列 (City Hall, New York, NY )や緯度と経度の座標ペア (40.457375,-80.009353)
    • URLエンコードする必要がある
  • pano
    • 特定のパノラマ ID
    • このIDは変更される可能性がある
  • size
    • 画像の出力サイズをピクセル単位で指定
    • {width}x{height} として指定

省略可能なパラメータ

  • signature
    • デジタル署名
  • heading
    • カメラのコンパス方位
    • 指定できる値は 0360
  • fov
    • 画像の水平画角を度数で指定 (デフォルト90)
      • 要はズーム率 (少ない値ほど拡大される)
    • 指定できる値は 0120
  • pitch
    • カメラの上下の角度
    • 90 度は真上、-90 は真下、デフォルト 0
  • radius
    • パノラマを検索する半径(メートル単位)
    • デフォルトは 50
  • return_error_code
    • falseの場合: エラー時にグレー画像
    • trueの場合: エラーコードを返す (404 or 400)
  • source
    • default: ストリートビューのデフォルトのソース
    • outdoor: 屋外のパノラマのみに限定

試しに東京タワーを見上げる画像を表示させる

https://maps.googleapis.com/maps/api/streetview?size=600x600&location=35.659006,139.745694&heading=210&pitch=50&key=YOUR_API_KEY

image7.png

どうでしょうか、ちょっと近すぎかもですが、、東京タワーを見上げる画像が表示されました。

デジタル署名

https://developers.google.com/maps/documentation/streetview/digital-signature?hl=ja

リクエストの認証

リクエストの認証は、使用状況に基づいて以下の2パターンになります。

  1. 1 日あたり 25,000 件以下のリクエストには API キーが必要
  2. 1 日あたり 25,000 件を超えるリクエストには、API キーとデジタル署名が必要

大規模なアプリで 2. の制限を超えるようなアプリだけデジタル署名が必要そうでが、ドキュメントには

使用状況にかかわらず、API キーとデジタル署名の両方を使用することを強くおすすめします。

とあるので、デジタル署名はやっておいた方が良いかと思います。

仕組み

  • デジタル署名は、Google Cloud コンソールで取得できる URL 署名シークレットを使用して生成される
  • このシークレットは基本的に秘密鍵

リクエストに署名する

Google Maps Platform の [認証情報] ページ に移動し、「URL 署名シークレット」を確認すると「現在のシークレット」が表示されているかと思います。

image8.png

このURL 署名シークレットを使うか、新たに再生性する事もできます。再生成した場合は、古いシークレットは24 時間で期限切れとなります。

👆のページを下にスクロールすると「URL に署名」が出てくると思います。1回限りの署名の場合はこちらにURLを入力すると署名が付与されたものが返ってきます。

image9.png

試しに

https://maps.googleapis.com/maps/api/streetview?size=600x600&location=35.659006,139.745694&heading=210&pitch=50&key=YOUR_API_KEY

を入力するとURLの末尾に &signature= が付与されたものが表示されます。

試しにわざと間違った値を &signature= に設定してリクエストすると以下の様なメッセージが 403 で返ってきました。

The Google Maps Platform server rejected your request. Unable to authenticate the request. Provided 'signature' is not valid for the provided API key, or the provided 'key' is not valid.
The signature was checked against the URL: /maps/api/streetview?size=600x600&location=35.659006,139.745694&heading=210&pitch=50&key=YOUR_API_KEY&signature=わざと間違った値を入力
If this does not match the URL you requested, please ensure that your request is URL encoded correctly. Learn more: https://developers.google.com/maps/documentation/business/webservices/auth

実際の運用

今回はURL固定のものを署名しましたが、通常の運用では動的にURLが変わるので、サーバー側で署名を付与するような仕組みが必要です。

今回はそこまでは試しませんが必要な場合はこちらを確認して頂けたらと思います。

料金体系

Google Maps Platformでは$200/月の無料枠があります。Street View Static APIの料金は 0~100,000リクエスト までは 1000リクエスト当たり $7 かかります。無料枠内だとおよそ28,571リクエストまで行ける事になります。

その他の使用量上限

  • 1日あたりのリクエスト数に上限はない
  • 1分あたりの最大クエリ数は 30,000

まとめ

色々細かくパラメータも指定できるので、Map上の特定の位置の画像を扱うような用途で使えそうだなという印象でした。

またコスト面でも1日1000リクエスト超えるくらいガンガン使わなければ、無料枠内でも収まりそうなので、アプリ内の特定の用途などで使えたりするんじゃないかと思いました。

参考URL

https://qiita.com/sey323/items/6339767bd289c9be7112

Discussion