Python Folium

Folium は、Python のデータ操作機能と JavaScript の地図描画ライブラリ Leaflet.js を組み合わせたパッケージで、Python 上でデータを整形しつつ、対話的な地図を簡単に生成・表示できます。データに基づくチャート的な可視化(コロプレスマップ)や、GeoJSON/TopoJSON の重ね合わせ、カスタムアイコン付きマーカーなど、多彩な機能を備えています (python-visualization.github.io).

インストール方法

pip install folium

または Conda を利用している場合は

conda install folium -c conda-forge

とするだけで、branca、Jinja2、NumPy、Requests といった依存も自動的に組み込まれます (python-visualization.github.io).

基本の地図作成

import folium

m = folium.Map(location=(45.5236, -122.6750))
# Jupyter Notebook なら m と入力するだけで地図が表示されます
# HTML ファイルとして保存する場合
m.save("index.html")

Maplocation で中心座標、zoom_start で初期ズームレベルを指定できます (python-visualization.github.io).

タイルセットの切り替え

デフォルトは OpenStreetMap ですが、以下のように他の組み込みタイル(例:CartoDB Positron)や、任意のタイル URL を指定できます。

folium.Map((45.5236, -122.6750), tiles="cartodb positron")
# カスタムタイルの例
folium.Map(
    (45.5236, -122.6750),
    tiles='https://{s}.tiles.example.com/{z}/{x}/{y}.png',
    attr='My Data Attribution'
)
``` :contentReference[oaicite:3]{index=3}.

## マーカーの追加  
ポップアップやツールチップ付きのマーカーを地図上に配置できます。アイコンの色や形もカスタマイズ可能です。  
```python
m = folium.Map([45.35, -121.6972], zoom_start=12)

folium.Marker(
    location=[45.3288, -121.6625],
    tooltip="Click me!",
    popup="Mt. Hood Meadows",
    icon=folium.Icon(icon="cloud")
).add_to(m)

folium.Marker(
    location=[45.3311, -121.7113],
    tooltip="Click me!",
    popup="Timberline Lodge",
    icon=folium.Icon(color="green")
).add_to(m)
``` :contentReference[oaicite:4]{index=4}.

## 線状要素(PolyLine)  
登山ルートや道路などを線で強調表示できます。  
```python
m = folium.Map(location=[-71.38, -73.9], zoom_start=11)
trail_coordinates = [
    (-71.3518, -73.6559),
    (-71.3741, -73.7198),
    # …他の座標…
]
folium.PolyLine(trail_coordinates, tooltip="Coast").add_to(m)
``` :contentReference[oaicite:5]{index=5}.

## グループ化とレイヤ制御  
複数の要素を `FeatureGroup` でまとめ、`LayerControl` を加えることで、表示・非表示を切り替えられます。  
```python
m = folium.Map((0, 0), zoom_start=7)
group1 = folium.FeatureGroup("Group 1").add_to(m)
folium.Marker((0, 0), icon=folium.Icon("red")).add_to(group1)

group2 = folium.FeatureGroup("Group 2").add_to(m)
folium.Marker((0, 1), icon=folium.Icon("green")).add_to(group2)

folium.LayerControl().add_to(m)
``` :contentReference[oaicite:6]{index=6}.

## GeoJSON/TopoJSON のオーバーレイ  
URL、ファイルパス、辞書オブジェクトいずれでも読み込み可能で、地理情報データを地図上にそのまま重ね合わせられます。  
```python
import requests
m = folium.Map(tiles="cartodbpositron")
geojson_data = requests.get(
    "https://raw.githubusercontent.com/python-visualization/folium-example-data/main/world_countries.json"
).json()
folium.GeoJson(geojson_data, name="Countries").add_to(m)
folium.LayerControl().add_to(m)
``` :contentReference[oaicite:7]{index=7}.

## コロプレス(Choropleth)マップ  
Pandas の DataFrame/Series と Geo/TopoJSON のジオメトリを結びつけ、塗り分け地図を作成できます。  
```python
import pandas as pd
state_geo = requests.get(
    "https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_states.json"
).json()
state_data = pd.read_csv(
    "https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_unemployment_oct_2012.csv"
)
m = folium.Map(location=[48, -102], zoom_start=3)
folium.Choropleth(
    geo_data=state_geo,
    name="choropleth",
    data=state_data,
    columns=["State", "Unemployment"],
    key_on="feature.id",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="Unemployment Rate (%)",
).add_to(m)
folium.LayerControl().add_to(m)
``` :contentReference[oaicite:8]{index=8}.

---

上記は入門的な機能の概要です。さらに詳細を知りたい場合は、User guide、Advanced guide、API reference を参照してください :contentReference[oaicite:9]{index=9}.
::contentReference[oaicite:10]{index=10}

leafmapとの違いや使い分け

以下、主に機能面とユースケースの観点から、Folium と Leafmap の相違点と使い分けをまとめます。


1. パッケージの位置づけと依存関係

  • Folium
    • Python から Leaflet.js を呼び出して地図を描画する薄いラッパー。
    • 地図描画に特化し、依存するのは Leaflet(JavaScript)、branca、Jinja2 などの最小限のライブラリのみ .
  • Leafmap
    • Folium や ipyleaflet をはじめ、WhiteboxTools/whiteboxgui、ipywidgets、segment-geospatial など多数の OSS を統合した “地理情報分析+可視化” 用の高レベル・ツールセット。
    • Jupyter 上での GUI 操作や、バックエンドでの空間解析(500+ の WhiteboxTools 処理が可能)をワンストップで提供する (leafmap.org).

2. インタラクティビティと双方向通信

  • Folium
    • 地図描画後は静的。マウス操作でズーム・パンはできるが、Python 側でそのイベントを直接ハンドリングすることはできない (leafmap.org).
  • Leafmap
    • デフォルトで ipyleaflet バックエンドを使うと、ipywidgets 経由の双方向通信が可能(クリック位置取得、動的レイヤ切り替えなど)。
    • Google Colab では ipyleaflet に未対応のため自動で folium バックエンドにフォールバックするが、ローカル Jupyter 環境では ipyleaflet が優先され、高度なインタラクションを実現する (leafmap.org).

3. 空間解析機能の有無

  • Folium
    • 地図生成とジオデータの重ね合わせ(GeoJSON、TopoJSON、コロプレスなど)は容易だが、空間統計やハイドロロジー解析、LiDAR 処理などの機能は持たない。
  • Leafmap
    • WhiteboxTools(地形解析、流域解析、数学統計処理など500以上のツール)や、深層学習によるリモートセンシング画像のセグメンテーション機能をマップ GUI 上からノーコードで呼び出せる (leafmap.org).

4. 利用環境とプラットフォーム適性

  • Folium
    • 生成された地図は単一の HTML として保存・配布可能。Jupyter だけでなく任意の Web サーバーやスタンドアロン・アプリにも組み込みやすい。
  • Leafmap
    • Jupyter Notebook/Lab、Google Colab、Marimo などインタラクティブ環境向けに最適化。
    • 複数の描画バックエンド(folium、ipyleaflet、HERE、Kepler.gl、Pydeck など)を切り替え可能で、環境や目的に応じて柔軟に利用できる (leafmap.org).

5. 使い分けのポイント

FoliumLeafmap
地図だけサッと作る◯(簡潔なコードで HTML 生成)△(Leafmap をインストールする手間あり)
詳細な GIS 処理や解析×◯(GUI で高度解析ツールを即利用可)
イベント取得など双方向インタラクション×◯(ipywidgets/ipyleaflet により実現)
Jupyter 以外の環境で配布△(Notebook 前提の機能が多い)

まとめ

  • シンプルに地図を描きたい → Folium
  • Jupyter 上で GUI 操作と地理空間解析を手軽に行いたい → Leafmap

自身の用途に合わせて使い分けてみてください!