乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

Folium

今回はGeoPandasとFoliumによる
地理データの取り扱い方です。


解説動画はこちら


 
Pythonで地理データを取り扱う方法


今回は地理データを取り扱う方法として
2つのライブラリをご紹介します。


GeoPandas

Pandasライブラリに
空間(Geometry)を実現したライブラリ

Pandasの DataFrame を拡張
各行に 1つのジオメトリ(形状) を持つ
GIS(地理情報システム)向けの演算が可能
静的なplotが行える


Folium

Leaflet.js を
Python から操作する描画用ライブラリ

出力は HTML
OpenStreemMapをタイルレイヤとして表示できる
Jupyter / Web / 静的ファイルで使える
インタラクティブな描画が行える

ということでこの2つを用いて
地理データを描画していきましょう。



GeoPandasを用いた地理描画

最初はGeoPandasを用いた描画です
Google colabで実行できるコードになっていますが
Google colabでは日本語が取り扱えないので
別途ライブラリが必要です。


ライブラリのインストール

日本語を使用するため
japanize-matplotlib
をインストールしておきます。
pip install japanize-matplotlib


架空のデータを読み込んで描画する


まず初めは、何もない状態から
架空のデータを使っていきます。

pandasに読み込んだ後
GeoPandasに緯度経度として読み込みします。
# -----------------
# 1. データの準備 (架空のオープンデータ)
# -----------------

# (A) 地理データ: 都道府県庁所在地のポイントデータ (GeoJSONを想定)
# 緯度・経度と都道府県名が含まれるGeoDataFrameを作成
data_geo = {
    'city': ['Sapporo', 'Sendai', 'Tokyo', 'Nagoya', 'Osaka', 'Fukuoka'],
    'prefecture': ['北海道', '宮城', '東京', '愛知', '大阪', '福岡'],
    'latitude': [43.06, 38.27, 35.69, 35.18, 34.69, 33.59],
    'longitude': [141.35, 140.87, 139.69, 136.91, 135.50, 130.40]
}
df_geo = pd.DataFrame(data_geo)

# GeoDataFrameに変換
# 'geometry'カラムを作成し、緯度・経度からポイント(点)の地理情報を持たせる
gdf_city = gpd.GeoDataFrame(
    df_geo,
    geometry=gpd.points_from_xy(df_geo.longitude, df_geo.latitude),
    crs="EPSG:4326"
)
print("GeoDataFrameの確認:\n", gdf_city.head())
GeoDataFrameの確認:
       city prefecture  latitude  longitude              geometry
0  Sapporo        北海道     43.06     141.35  POINT (141.35 43.06)
1   Sendai         宮城     38.27     140.87  POINT (140.87 38.27)
2    Tokyo         東京     35.69     139.69  POINT (139.69 35.69)
3   Nagoya         愛知     35.18     136.91  POINT (136.91 35.18)
4    Osaka         大阪     34.69     135.50   POINT (135.5 34.69)


データに少し加工を加え、情報を足します。
# (B) 属性データ: 都道府県ごとの人口データ
# 都道府県ごとの人口属性データフレーム
data_attr = {
    'prefecture': ['北海道', '宮城', '東京', '愛知', '大阪', '福岡'],
    'population_mil': [5.2, 2.3, 14.0, 7.5, 8.8, 5.1], # 単位: 百万人
    'density_class': ['Low', 'Mid', 'High', 'High', 'High', 'Mid']
}
df_attr = pd.DataFrame(data_attr)

# -----------------
# 2. データの結合 (Merge)
# -----------------
# 'prefecture'カラムをキーにしてGeoDataFrameと属性データを結合
gdf_merged = gdf_city.merge(df_attr, on='prefecture')
print("\n結合後のGeoDataFrameの確認:\n", gdf_merged[['prefecture', 'population_mil', 'geometry']].head())
結合後のGeoDataFrameの確認:
   prefecture  population_mil              geometry
0        北海道             5.2  POINT (141.35 43.06)
1         宮城             2.3  POINT (140.87 38.27)
2         東京            14.0  POINT (139.69 35.69)
3         愛知             7.5  POINT (136.91 35.18)
4         大阪             8.8   POINT (135.5 34.69)


次のコードで簡易なプロットを行えます。
# 結合したデータを基にGeoPandasで簡易プロット
gdf_merged.plot(column='population_mil', legend=True, figsize=(5, 5),
                markersize=gdf_merged['population_mil'] * 10)
plt.title("GeoPandasによる簡易プロット (人口規模)")
plt.show()
スクリーンショット 2025-12-13 17.24.29

緯度経度だけを用いて描画していますが
これだけだと、あまり意味がない描画ですね

これをFoliumで描画しなおします。
# Foliumの描画準備 (日本の中心付近にマップを初期化)
map_center = [35.68, 139.69] # 東京の緯度・経度
m = folium.Map(location=map_center, zoom_start=5)

# -----------------
# 1. シンプルなマーカー表示 (庁所在地)
# -----------------
for idx, row in gdf_merged.iterrows():
    # ポップアップに表示する情報をHTMLで作成
    html = f"""
        

{row['prefecture']}庁所在地

人口: {row['population_mil']}百万人

密度区分: {row['density_class']}

""" iframe = folium.IFrame(html) popup = folium.Popup(iframe, min_width=200, max_width=300) # Markerを追加 folium.Marker( location=[row.latitude, row.longitude], popup=popup, icon=folium.Icon(color='blue', icon='info-sign') ).add_to(m) # ----------------- # 2. ヒートマップの追加 (人口密度に応じて色を濃く) # ----------------- from folium.plugins import HeatMap # HeatMapに必要なデータ形式: [[緯度, 経度, 強度], ...] # 強度として人口(百万)を使用 heat_data = [[row.latitude, row.longitude, row.population_mil] for idx, row in gdf_merged.iterrows()] HeatMap(heat_data).add_to(m) # ----------------- # 3. GeoPandasとFoliumを組み合わせた応用描画 # Foliumでは、CircleMarkerを使って、データを視覚的に表現できます。 def get_color(density): if density == 'High': return 'red' elif density == 'Mid': return 'orange' else: return 'green' for idx, row in gdf_merged.iterrows(): folium.CircleMarker( location=[row.latitude, row.longitude], radius=row['population_mil'] * 1.5, # 人口規模に応じて円の大きさを変更 color=get_color(row['density_class']), fill=True, fill_color=get_color(row['density_class']), fill_opacity=0.7, tooltip=f"{row['prefecture']}: {row['population_mil']}M" ).add_to(m) # マップをHTMLファイルとして保存 m.save("interactive_map.html") print("\nFoliumマップオブジェクトを作成しました。")

Foliumでは作った地図を
静的なHTMLとして保存ができます。

Google Colabでは
デフォルトのフォルダに
HTMLファイルが出力されると思います。

変数 m を実行すると
中身を描画することもできます。

スクリーンショット 2025-12-13 17.21.28

こんな感じで、架空のデータですが
地図上に描画できました。

Foliumはインタラクティブに操作できるので
色々遊べます。



500キロメートル圏内を描画する


GeoPandasで緯度経度から少し計算して
描画用のデータを作ることができます。

まずは距離を測るためのCRSというデータへ変換します。
# -----------------
# 1. CRSの変換 (距離計算のため)
# -----------------
# 緯度・経度 (4326) からメートル単位のCRS (3857) へ変換
gdf_projected = gdf_merged.to_crs("EPSG:3857")
print("\nCRS変換後のGeoDataFrame (EPSG:3857):\n", gdf_projected.head())
       city prefecture  latitude  longitude                          geometry  \
0  Sapporo        北海道     43.06     141.35  POINT (15735010.024 5321108.922)   
1   Sendai         宮城     38.27     140.87  POINT (15681576.668 4617638.286)   
2    Tokyo         東京     35.69     139.69  POINT (15550219.669 4258049.263)   
3   Nagoya         愛知     35.18     136.91  POINT (15240751.485 4188369.409)   
4    Osaka         大阪     34.69     135.50  POINT (15083791.002 4121832.777) 



これで計算する用意ができたので
Foliumにデータを加えます。
# -----------------
# 2. バッファリング (空間分析)
# -----------------
# 東京、大阪、名古屋の庁所在地から「500km圏内」のバッファを作成
# 単位はメートルなので 500 * 1000 = 500,000メートル
buffer_distance = 500 * 1000

# GeoPandasのbuffer()メソッドでバッファを作成
# わかりやすさのため、東京の行(index=2)のみを抽出
tokyo_buffer = gdf_projected.iloc[[2]].buffer(buffer_distance)

# バッファを元のCRS (4326) に戻し、Foliumで表示できるようにする
tokyo_buffer_wgs84 = tokyo_buffer.to_crs("EPSG:4326")

# -----------------
# 3. Foliumでの分析結果の可視化
# -----------------

# 新しいFoliumマップを作成
m_analysis = folium.Map(location=map_center, zoom_start=5)

# バッファリング結果 (Polygon) をFoliumに描画
folium.GeoJson(
    tokyo_buffer_wgs84.__geo_interface__, # GeoPandasオブジェクトをGeoJSON互換の形式に変換
    name='500km Buffer from Tokyo',
    style_function=lambda x: {
        'fillColor': 'purple',
        'color': 'purple',
        'weight': 2,
        'fillOpacity': 0.3
    }
).add_to(m_analysis)

# マーカーとヒートマップも再表示 (任意)
for idx, row in gdf_merged.iterrows():
    folium.Marker(
        location=[row.latitude, row.longitude],
        popup=f"{row['prefecture']} - {row['population_mil']}M"
    ).add_to(m_analysis)

# マップにレイヤー切り替え機能を追加して見やすくする
folium.LayerControl().add_to(m_analysis)
m_analysis.save("analysis_map.html")

今度は m_analysis という変数の中身を見てみると
スクリーンショット 2025-12-13 17.22.35

こんな感じで東京から500キロメートル圏内を
塗ることができました。



CSVファイルを読み込みして描画する


今度は架空ではなく
実際のデータで描画してみましょう。

地震のデータがあるので
これを用います。

地震データの取得先
https://www.data.jma.go.jp/eqdb/data/shindo/

このサイトから検索して
CSVファイルにして
Google Colabのファイル置き場に配置します。

CSVを読み込みします。
import pandas as pd
import folium
from folium.plugins import MarkerCluster
from io import StringIO
import re

# ----------------------------------------------------
# 1. データ準備
# ----------------------------------------------------
csv_data = """地震の発生日,地震の発生時刻,震央地名,緯度,経度,深さ,M,最大震度
2025/12/10,23:52:24.1,青森県東方沖,40°50.1′N,142°45.3′E,36 km,6.0,震度4
2025/12/09,18:09:45.9,青森県東方沖,41°16.0′N,142°25.1′E,47 km,5.3,震度3
2025/12/09,06:52:42.7,青森県東方沖,40°56.6′N,143°18.0′E,15 km,6.6,震度4
2025/12/09,03:56:29.5,青森県東方沖,40°57.0′N,143°07.6′E,19 km,6.1,震度3
2025/12/08,23:33:39.2,青森県東方沖,40°53.0′N,142°35.2′E,42 km,5.9,震度3
2025/12/08,23:15:10.1,青森県東方沖,40°58.0′N,142°17.2′E,54 km,7.5,震度6強
2025/12/05,12:11:24.1,熊本県阿蘇地方,32°58.5′N,131°06.8′E,4 km,3.3,震度3
"""
# df = pd.read_csv(StringIO(csv_data))
df = pd.read_csv('地震リスト.csv')
df.head(3)<
地震の発生日 地震の発生時刻 震央地名 緯度 経度 深さ 最大震度
0 2025/12/10 23:52:24.1 青森県東方沖 40°50.1′N 142°45.3′E 36 km 6.0 震度4
1 2025/12/09 18:09:45.9 青森県東方沖 41°16.0′N 142°25.1′E 47 km 5.3 震度3
2 2025/12/09 06:52:42.7 青森県東方沖 40°56.6′N 143°18.0′E 15 km 6.6 震度4


緯度経度などのデータが
そのままでは使えないので加工します。

def convert_dms_to_decimal(dms_str):
    """ '40°50.1′N' のような文字列を十進数形式に変換する関数 """
    match = re.match(r"(\d+)°(\d+\.?\d*)′([NSEW])", dms_str)
    if not match:
        return None
    
    degrees = float(match.group(1))
    minutes = float(match.group(2))
    direction = match.group(3)
    decimal = degrees + minutes / 60
    
    # 南緯(S)と西経(W)はマイナスにする
    if direction in ('S', 'W'):
        decimal *= -1  
    return decimal

# 緯度と経度を数値に変換
df['緯度_dec'] = df['緯度'].apply(convert_dms_to_decimal)
df['経度_dec'] = df['経度'].apply(convert_dms_to_decimal)

# 震度を強度順に数値化するための辞書
shindo_mapping = {
    '震度1': 10,
    '震度2': 20,
    '震度3': 30,
    '震度4': 40,
    '震度5弱': 51,
    '震度5強': 55,
    '震度6弱': 61,
    '震度6強': 65,
    '震度7': 70,
}

# 震度を数値に変換
df['shindo_value'] = df['最大震度'].map(shindo_mapping)

def get_shindo_color(shindo):
    # 震度値 (30, 40, ..., 70) を利用
    if shindo >= 65:  # 震度6強, 震度7
        return 'darkred'
    elif shindo >= 55: # 震度5強, 震度6弱
        return 'red'
    elif shindo >= 51: # 震度5弱
        return 'orange'
    elif shindo >= 40: # 震度4
        return 'lightred'
    elif shindo >= 30: # 震度3
        return 'green'
    else:
        return 'gray' # その他

描画を行います。
# ----------------------------------------------------
# 1. Folium マップの作成
# ----------------------------------------------------
# 日本の中心付近を初期位置とする
map_center = [df['緯度_dec'].mean(), df['経度_dec'].mean()]
m = folium.Map(location=map_center, zoom_start=5)

# ----------------------------------------------------
# 2. 震度ごとに FeatureGroup (レイヤー) を作成
# ----------------------------------------------------

# 震度レベルごとの FeatureGroup を格納する辞書
shindo_layers = {}

# 震度マッピングのキー(例: '震度7', '震度6強')を降順でソート
sorted_shindo_levels = sorted(shindo_mapping.keys(), key=lambda x: shindo_mapping[x], reverse=True)

for shindo_level in sorted_shindo_levels:
    # レイヤー名を設定 (LayerControlに表示される名前)
    layer_name = f"最大震度: {shindo_level}"
    # FeatureGroupを作成し、マップに追加
    fg = folium.FeatureGroup(name=layer_name, show=True).add_to(m)
    shindo_layers[shindo_level] = fg

# ----------------------------------------------------
# 3. データの反復処理と適切なレイヤーへのマーカー追加
# ----------------------------------------------------
for idx, row in df.iterrows():
    datetime_full = f"{row['地震の発生日']} {row['地震の発生時刻'][:8]}"
    
    # ポップアップ情報
    popup_html = f"""
        **最大震度: {row['最大震度']}**
発生日時: {datetime_full}
震央地名: {row['震央地名']}
深さ: {row['深さ']}
マグニチュード(M): {row['M']}
""" marker_color = get_shindo_color(row['shindo_value']) current_shindo_level = row['最大震度'] # 該当する震度の FeatureGroup を取得 target_fg = shindo_layers.get(current_shindo_level) if target_fg is not None: # マーカーを対応する FeatureGroup に追加 folium.Marker( location=[row['緯度_dec'], row['経度_dec']], popup=popup_html, icon=folium.Icon(color=marker_color, icon='flash', prefix='fa') ).add_to(target_fg) # ---------------------------------------------------- # 4. LayerControl (表示切り替えボックス) を追加 # ---------------------------------------------------- folium.LayerControl(collapsed=False).add_to(m) # ---------------------------------------------------- # 5. マップの保存と表示 # ---------------------------------------------------- m.save("earthquake_layer_control_map.html") print("震度別表示切り替え機能付きFoliumマップの作成が完了しました。")

変数 m を表示してみると
スクリーンショット 2025-12-13 17.21.43


震度ごとに表示を切り替えすることができます。





まとめ

GeoPandasで計算して、Foliumで描画すると
以下のような分析が簡単に行えます。

商圏分析
人口ヒートマップ
配送ルート可視化
不動産マップ
災害・危険区域表示

これらの分析を行う際に
このライブラリの組み合わせは
非常に捗ります。

かなり便利なので
使ってみると面白いと思います
それでは。


リモートも増えて来たので
会社から2時間以内で行ける駅を
探してみようと思いました。

解説動画はこちら




今回は会社から2時間圏内の場所を
探してみようということで
いい感じのものは無いかなーと探していたら
NAVITIMEのAPIが使えるみたいですね。

これは起点となる駅からXX分以内で
行ける駅と緯度経度を取得できるという
素敵なAPIでした。

ここら辺から参照してね

これを使って
NAVITIMEのAPIから該当する駅を取得するコードを
書いていきましょう。

なおこのコードを動かすには
APIキーが必要です。

無料で取得できますんで、ここは自分で
取得して下さいね!!!

コードはこんな感じです
import requests

# NAVITIMEのAPI
url = "https://navitime-reachable.p.rapidapi.com/reachable_transit"

# 基点の緯度経度(今回は新橋駅)
base_loc = "35.667272,139.758786"

# かかる分数
term = "120"

## API_KEY (登録が必要) 
# api_key # ここは自分で取得して設定してね

query_str = {
    "start":base_loc,
    "term":term,
    "term_from":"0",
    "walk_speed":"5",
    "transit_limit":"3",
    "offset":"0", 
    "limit":"2000",
    "datum":"wgs84",
    "coord_unit":"degree",
}

headers = {
    'x-rapidapi-host' : "navitime-reachable.p.rapidapi.com",
    'x-rapidapi-key' : api_key # ここは自分で取得して設定してね
}

res = requests.request("GET", url, headers=headers, params=query_str)

 今回は起点となる駅を新橋駅にしています。
日本のサラリーマンの中心ですからね。

ここら辺に勤めている人も多いはず
変えたい方は緯度経度の指定の部分(base_loc)を
変えてください。

なお3時間でも良いという方は
term(120)を180に変えてくださいね。

さてこのコードを動かすと、120分以内の
駅群が取得出来ます。

APIから取得した駅をデータフレームにして
使えるようにしましょう。
# データ化
items = res.json()['items']

data = []
for item in items:
    time = item['time']
    lat = item['coord']['lat']
    lon = item['coord']['lon']
    name = item['name']
    node_id = item['node_id']
    transit_count = item['transit_count']
    tmp = [name,node_id,time,transit_count,lat,lon]
    data.append(tmp)

# データフレームの作成
import pandas as pd
df = pd.DataFrame(data,columns=['駅名','駅ID','時間','乗換回数','緯度','経度'])
df.head()
スクリーンショット 2021-06-05 16.56.19

綺麗な表形式のデータフレームに直しました。
これで使いやすくなります。

これを眺めるのも良いですが
やはり緯度経度が有るので
地図にプロットしたいですよね。

Foliumを使えば
簡単に地図にプロッティングできます
早速コードを書いていきましょう。

なおFoliumはデフォルトのライブラリには無いので
インストールが必要です。

入れていない無い方、エラーが出る方は
インストールしてください。

Foliumを使って可視化する
import folium
from folium.features import CustomIcon

# マーカー用の関数
def make_maker(r,color):
    tmp = folium.Marker(
        location = [r['緯度'],r['経度']],  
        popup    = '{0} : {1}分'.format(r['駅名'],r['時間']),
        icon     = folium.Icon(color=color))
    return tmp

# 地図生成
lat,lon = float(base_loc.split(',')[0]),float(base_loc.split(',')[1])
plot_map = folium.Map(location=[lat,lon] ,  zoom_start=8)

group1 = folium.FeatureGroup(name="60分以内").add_to(plot_map)
group2 = folium.FeatureGroup(name="120分以内").add_to(plot_map)

# 起点マーカーの書き込み
folium.Marker(
        location = [lat,lon],  
        popup    = '{0} : {1}分'.format('新橋駅',0),
        icon     = folium.Icon(color='green')).add_to(plot_map)

# マーカーの書き込み
for i, r in df[df['時間']<=60].iterrows():    
    group1.add_child(make_maker(r,'blue'))
for i, r in df[(df['時間']>60)].iterrows():    
    group2.add_child(make_maker(r,'red'))

# 判例コントローラー表示
folium.LayerControl().add_to(plot_map)

# HTMLファイルへ書き込み
plot_map.save("eki_maps.html")

なおこのコードは起点が新橋駅なので
変えたい方は関係するコード部分を
書き換えてくださいね。

これを実行すると
HTMLファイルが作成されます。

早速見ていきましょう。
スクリーンショット 2021-06-05 16.56.50

青マーカーが1時間以内
赤マーカーが2時間以内の駅です

右上のマーカーから絞り込みが出来ます。
スクリーンショット 2021-06-05 16.57.15



60分以内のみ

スクリーンショット 2021-06-05 16.57.38


61-120分のみ
スクリーンショット 2021-06-05 16.57.27

緑色のマーカーが起点の新橋駅です。

これで見ると
結構遠くまで行けますねえ

最北端や最西端は新幹線でしょうねえ
流石にここら辺は厳しいかもしれませんが
千葉や埼玉、神奈川は結構行けるところありますね。

ここら辺から引越しの候補が
見つかるかもしれません。

伊東辺りまで行けそうなので
温泉街に住むのもアリかもしれません!!

APIをうまく使えば
もう少し絞り込めるので
色々と遊んでみると良いと思います。

今回はこれまでです
それでは。


グランメゾン東京をみているので
ミシュランの三つ星店が気になってしまいました。

ミシュランの星のついたお店群を
いい感じのライブラリがあったので
可視化してみました。

解説動画はこちら



さて今回使用する可視化のライブラリは
Foliumです。

緯度経度を使用して
いい感じに地図にマッピングできます。

foliumを使うにはインストールしないといけません

まずはインストールしておきましょう。

pip install folium

可視化するにはデータが必要です。

次のようなデータを作りました。
スクリーンショット 2019-12-29 20.31.33

必要な項目としては
お店の名前、星の数、ジャンル、住所、緯度経度などが必要です。

データを集めたら
Foliumを使って可視化です。

地図にマッピングした
HTMLファイルを作成することができます。

実際に作成したコードを貼っておきます。
import folium
from folium.features import CustomIcon
import pandas as pd

stars = {
'一つ星'        :'star1.png',
'二つ星'        :'star2.png',
'三つ星'        :'star3.png',
'ビブグルマン'  :'starbib.png'
}

def makeicon(icon_image):
    icon = CustomIcon(
    icon_image=icon_image,
    icon_size=(30, 30),
    icon_anchor=(30, 30),
    shadow_image='',
    shadow_size=(5, 5),
    shadow_anchor=(4, 4),
    popup_anchor=(-3, -3))
    return icon

def make_maker(r):
    tmp = folium.Marker(
        location = [r['longitude'],r['latitude']], 
        popup    = r['name'] + ' : ' + r['genre'],
        tooltip  = r['name'] + ' : ' + r['genre'] + ' : ' + r['address'].replace('東京都',''),
        icon     = makeicon(stars[r['star']]))
    return tmp

michelin_data = pd.read_table('michelin_data_2020.csv')

plot_map = folium.Map(location=[35.6725175,139.7210145] ,  zoom_start=12)

star1_group = folium.FeatureGroup(name="一つ星").add_to(plot_map)
star2_group = folium.FeatureGroup(name="二つ星").add_to(plot_map)
star3_group = folium.FeatureGroup(name="三つ星").add_to(plot_map)
bib_group   = folium.FeatureGroup(name="ビブグルマン").add_to(plot_map)

for i, r in michelin_data[michelin_data['star']=='一つ星'].iterrows():
    star1_group.add_child(make_maker(r))
for i, r in michelin_data[michelin_data['star']=='二つ星'].iterrows():
    star2_group.add_child(make_maker(r))
for i, r in michelin_data[michelin_data['star']=='三つ星'].iterrows():
    star3_group.add_child(make_maker(r))
for i, r in michelin_data[michelin_data['star']=='ビブグルマン'].iterrows():
    bib_group.add_child(make_maker(r))

folium.LayerControl().add_to(plot_map)
plot_map.save("mishelin_all_maps.html")

コードの説明ですが
まず星を出し分けるためにカスタムアイコンを用います。

CostomIconをインポートしておきます。

folium.Mapで初期マップを作ります。
緯度経度とズーム値を指定して
どこの地点から始めるのかを指定できます。

この初期マップにお店を一軒ずつ加えていきます。

グループ化しておくと
アイコンを点けたり消したり出来るので
星の種別ごとにグループ化しておきます。

グループごとにお店を加えて
LayerControlで出し分けをするための
パーツを作れます。

最後saveでHTMLファイルに出力をして
おしまいです。

出来上がりはこんな感じです。
スクリーンショット 2019-12-29 20.39.52

3つ星のお店だけ表示させました。

Foliumでは星ごとに出し入れ出来るので
右上のパーツを押してみてください。


出来上がりをリンクしておきますね。
ミシュランの3つ星のお店

400店舗ほどあるので
行きたい方はぜひ使ってみてください。

さて
緯度経度を用いた可視化も
Pythonを使えば簡単にできます。

ぜひ試してみてくださいね

グランメゾン東京の最終回も楽しみですね!!!

それでは
 

このページのトップヘ