【Python, Google Map API】住所を入力したらその場所の写真をダウンロードするプログラム

Google Map APIを使用する機会があり、勉強したのでコードを残しておきます。

仕様としては住所を入力すると、その住所の緯度経度を取得し、その緯度経度からStreet Viewにおけるその場所の写真をダウンロードしてくるというものになります。

このコードを使用する前にGoogle Map APIのAPIキーを取得しておいてください。ユーザー情報登録後、Google Maps Platformの「鍵と認証情報」にて確認ができます。

基本有料のようですが、1か月あたり200$分までは無料枠みたいです。

早速コードです。

import requests
import dotenv
import os
dotenv.load_dotenv()

# 建物情報保存用クラス
class Building:
    def __init__(self, address: str) -> None:
        # 住所
        self.address = address
        # 経度経度
        self.latitude = 35.0
        self.longitude = 135.0
        # 屋外の画像を取得する場合は"outdoor"
        self.source = "default" 
        # ズーム 0~120 狭い←→広い
        self.fov = 120
        # 向き 0~360 で北から時計回り
        self.heading = 0 
        # 上下の角度
        self.pitch = 0
        # 画像サイズ
        self.width = 600
        self.height = 600

# 住所から緯度経度を取得する関数
def address_to_location(building: Building, api_key):
    url = "https://maps.googleapis.com/maps/api/geocode/json"
    params = {
        "address": building.address,
        "key": api_key
    }
    response = requests.get(url, params=params)
    result = response.json()
    # 成功判定
    if result["status"] == "OK":
        location = result["results"][0]["geometry"]["location"]
        building.latitude = location["lat"]
        building.longitude = location["lng"]
        print(f'緯度: {building.latitude}, 経度: {building.longitude}')
        return True
    else:
        print("Geocoding failed:", result["status"])
        return False

# 緯度経度からストリートビュー画像を取得する関数
def location_to_image(building: Building, api_key):
    params = {
        'location': f'{building.latitude},{building.longitude}',
        'key': api_key,
        'pitch': building.pitch,
        'fov' : building.fov,
        'heading': building.heading,
        'size': f'{building.width}x{building.height}',
        'souce': building.source,
    }

    response = requests.get('https://maps.googleapis.com/maps/api/streetview', params=params)
    return response

def save_image(response):
    # 成功判定
    if response.status_code == 200:
        # 画像データをバイナリ形式で取得
        image_data = response.content

        # 画像データをファイルに書き込み(バイナリモードで書き込む)
        with open('street_view_image.jpg', 'wb') as f:
            f.write(image_data)
        print("画像を保存しました。")
    else:
        print("リクエストが失敗しました。ステータスコード:", response.status_code)


# ここに住所を入力
address = "***"
api_key = os.environ.get('GOOGLE_MAP_API_KEY')
# インスタンス化
building = Building(address)

# 緯度経度の取得に成功すれば
if address_to_location(building, api_key):
   save_image(location_to_image(building, api_key)) 

APIキーはプログラムに直で書いてもらってもいいと思います。私は.envを使って別の場所で管理しています。

addressという変数に住所を入力します。

それを基にGeoCoderというAPIを利用してその住所の緯度経度を取得しています(address_to_location関数)。

その後得られた緯度経度情報からストリートビューAPIでその位置の画像情報を取得します(location_to_image関数)。

画像情報が得られたら、最後にそれをローカルのフォルダにダウンロードします(save_image関数)。

ストリートビューの画像をとってくる際の引数は

  • location: 緯度経度
  • pitch: 上下の角度
  • fov: ズーム(0~120)
  • heading: 向き(0~360 で北から時計回り)
  • size: 画像サイズ({width}x{height})

になります。

このコードではカメラの向きはプログラム内で指定しいます。ですので、場所に応じて向きを変えるということはできていないコードになっています。。

必要に応じてコードを書き換えてみてもらえたらと思います。

ここまでお読みいただきありがとうございました。

簡単ではありましたが、Google Map APIを用いて住所からその場所の画像をとってくるプログラムをご紹介しました。

参考になりましたら幸いです。

コメント

タイトルとURLをコピーしました