pythonでGoogle MapのPlaces APIを使用して新宿駅周辺のゲーセン情報を取得してヒートマップをマッピングする

スポンサーリンク
tech系(python)
スポンサーリンク

はじめに

アイキャッチ画像が今回の実装の結果です。

Google map apiにて、Places APIというものがあり、それを使うと、Google Mapの情報を取得できます。

今回は、新宿駅周辺のゲーセン情報を取得してみて、最後には地図上にヒートマップとしてマッピングしてみたいと思います。

実装

新宿駅周辺のゲーセン情報取得

まずは、新宿駅周辺のゲームセンターの情報を取得してみます。

半径は5kmまで設定できるようなので、半径5km圏内で情報を取得して表示します。

import googlemaps

gmaps = googlemaps.Client(key='XXXXXXXXXXXXXXX')

response = gmaps.places(
    query='ゲームセンター',
    location=(35.6905, 139.6995),  # 新宿駅の緯度経度
    radius=5000,                   # 半径5000m以内
    language='ja'                  # 日本語で結果を取得
)

for place in response['results']:
    print(place)

結果は以下のように出てきます。

{'business_status': 'OPERATIONAL', 'formatted_address': '日本、〒150-0002 東京都渋谷区渋谷1丁目24−12 東映プラザ', 'geometry': {'location': {'lat': 35.659885, 'lng': 139.701997}, 'viewport': {'northeast': {'lat': 35.66147277989271, 'lng': 139.7034853298927}, 'southwest': {'lat': 35.65877312010727, 'lng': 139.7007856701073}}}, 'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_business-71.png', 'icon_background_color': '#7B9EB0', 'icon_mask_base_uri': 'https://maps.gstatic.com/mapfiles/place_api/icons/v2/generic_pinlet', 'name': 'タイトーステーション 渋谷店', 'opening_hours': {'open_now': True}, 'photos': [{'height': 2976, 'html_attributions': ['<a href="https://maps.google.com/maps/contrib/111867014173243626936">Go Oh</a>'], 'photo_reference': 'AeeoHcLGGd25RcERptVQTNKqB1Mcbr-jKNnG_jphfSw_ZqcLKRuQN0wIM78L9t0p3IretCBEqN4OowBLqwxJLKZb3bxUmbIPKdtuuL_YS6eam4GiNuqDM-uuczUGLnTokLWUnyVSF7bsRZkXYSmoS7poNPXfH8Q-7SYByk-5eWTxz73zCrAW8g70T17jY-GdC6Px6o_9PzQVM-ONJesFnSx-S3pf763rudM-eREKde61xq-nMnyr1jbCWsHm2xqvL5EFMIwNuJI-vXjXioo-EUXoLJIaiNMfbZYxTpJvOabgfI9TGUpq9cM', 'width': 3968}], 'place_id': 'ChIJR9ZvD1iLGGARSkBDXxV-nrQ', 'plus_code': {'compound_code': 'MP52+XQ 渋谷区、東京都', 'global_code': '8Q7XMP52+XQ'}, 'rating': 3.8, 'reference': 'ChIJR9ZvD1iLGGARSkBDXxV-nrQ', 'types': ['point_of_interest', 'establishment'], 'user_ratings_total': 1601}
{'business_status': 'OPERATIONAL', 'formatted_address': '日本、〒160-0022 東京都新宿区新宿3丁目35−8', 'geometry': {'location': {'lat': 35.6899086, 'lng': 139.7022276}, 'viewport': {'northeast': {'lat': 35.69126322989273, 'lng': 139.7035329298927}, 'southwest': {'lat': 35.68856357010728, 'lng': 139.7008332701073}}}, 'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_business-71.png', 'icon_background_color': '#7B9EB0', 'icon_mask_base_uri': 'https://maps.gstatic.com/mapfiles/place_api/icons/v2/generic_pinlet', 'name': 'タイトーステーション 新宿南口ゲームワールド店', 'opening_hours': {'open_now': True}, 'photos': [{'height': 3036, 'html_attributions': ['<a href="https://maps.google.com/maps/contrib/113610891890774395703">Briggs Soria</a>'], 'photo_reference': 'AeeoHcLVMkGnsTchMK7QP_hhcb3l9S8Laz0rduW388f_xQCC6wnWdU0naqVQbGCMOrArfXtUOu-2nK2poCYzyMffM474oefEPNNlaHCHbDAowveFxxfo07Od9wRn0RILqxFYFHMbimFfX7Zj2ujMDFDaZnJov1Gm9Gly7BbI2gDNMuevzPe1vF72MhPYepHs6Ei2DzzLC3DY5HKeA1eTlKC0cVa1SCNkjirr9lkEa0Bd7r2rToGMVu8_q0U-D76UOtS4cT4Km6eZSNCAHvELUhZLoSLC7q6doMroIELLzIC32vhQ7N4BgnU', 'width': 4048}], 'place_id': 'ChIJpai7jtqMGGAR_kpulDewfSU', 'plus_code': {'compound_code': 'MPQ2+XV 新宿区、東京都', 'global_code': '8Q7XMPQ2+XV'}, 'rating': 3.8, 'reference': 'ChIJpai7jtqMGGAR_kpulDewfSU', 'types': ['point_of_interest', 'establishment'], 'user_ratings_total': 2277}
...

結構、情報量が多くてびっくりします。

では、本題のヒートマップのマッピングです。

上記のコードを以下のように書き換えました。

import folium
from folium.plugins import HeatMap
import googlemaps
from branca.colormap import LinearColormap

gmaps = googlemaps.Client(key='XXXXXXXXXXXXXXX')

response = gmaps.places(
    query='ゲームセンター',
    location=(35.6905, 139.6995),  # 新宿駅の緯度経度
    radius=5000,                   # 半径5000m以内
    language='ja'                  # 日本語で結果を取得
)

### 以下からマッピングの部分 ###
    
m = folium.Map(location=[35.6812, 139.7671], zoom_start=5, tiles='OpenStreetMap')

values = [d['rating'] for d in response['results']]
min_val = min(values)
max_val = max(values)

# カラーマップ作成(緑→黄→赤)
colormap = LinearColormap(['green', 'yellow', 'red'], vmin=min_val, vmax=max_val)
colormap.caption = '値の凡例(ヒートマップ)'

def normalize(value):
    return (value - min_val) / (max_val - min_val) if max_val != min_val else 0.5

# 色マッピング関数(0〜1の値を色に変換)
def value_to_color(value):
    norm = normalize(value)
    red = int(255 * norm)
    green = int(255 * (1 - norm))
    return f'#{red:02x}{green:02x}00'

# 各点にマーカーを追加
for point in response['results']:
    color = value_to_color(point['rating'])
    folium.CircleMarker(
        location=[point['geometry']['location']['lat'], point['geometry']['location']['lng']],
        radius=8,
        color=color,
        fill=True,
        fill_color=color,
        fill_opacity=0.7,
        popup=f"値: {point['rating']}"
    ).add_to(m)

# カラーマップ(凡例)を追加
colormap.add_to(m)
    
# 地図を表示
m

結果は以下のように出力されました。

Google mapの点数が高いゲーセンが可視化されました。

最後に

Google map apiかなり可能性を秘めていますね。

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