osmnxとfoliumを活用したGISデータの効果的な可視化手法

## はじめに

はじめまして！データサイエンティストの高桑です。株式会社GEOTRA([@GEOTRA](https://qiita.com/GEOTRA) )にてGIS（Geographic Information System：地理情報システム）データを用いた分析、機械学習モデルの構築等を行っています。

## 背景

都市計画や地理情報システム（GIS）を扱う際、土地利用データの取得と可視化は非常に重要です。OpenStreetMap（OSM）を利用することで、無料で豊富な地理情報を取得できますが、これを効果的に可視化するには適切なツールが必要です。`osmnx`はOSMデータの取得に優れたライブラリで、`folium`はインタラクティブな地図を簡単に作成できます。本記事では、`osmnx`を使って土地利用データを取得し、`folium`でカテゴリ別に色分けをして可視化する方法を紹介します。

## やること

1. `osmnx`で土地利用データを取得する。
2. 土地利用データをカテゴリに分類する。
3. `folium`でカテゴリ別に色分けして地図上に可視化する。

---

### 必要なライブラリのインポート

まずは、`osmnx`を使って地図データを取得し、`folium`で可視化を行います。

```python
import osmnx as ox # 1.9.2
import folium # 0.16.0
```

---

### 土地利用情報の取得と前処理

次に、`osmnx`を使って土地利用に関するデータを取得します。`landuse`や`building`、`leisure`といったタグを使って情報を抽出し、カテゴリ別に分類します。

```python
# 土地利用情報を取得
# ロンドンの中心地点を指定
london = (51.50104794797349, -0.1263409881437541)
tags = {'landuse': True, 'building': True, 'leisure': True}
landuse_data = ox.geometries_from_point(london, tags, dist=1000).reset_index()

# 'element_type'が'node'（ポイントデータ）でないデータのみを残す
landuse_data = landuse_data[landuse_data['element_type'] != 'node'].reset_index(drop=True)

# 不要なノードを除外し、土地利用、建物、レジャーの情報をマージ
landuse_data['landuse'].fillna(landuse_data['building'], inplace=True)
landuse_data['landuse'].fillna(landuse_data['leisure'], inplace=True)
landuse_data = landuse_data.drop(columns=['building', 'leisure'])
landuse_data = landuse_data[landuse_data['landuse'].notnull()].reset_index(drop=True)

```

この部分では、指定した地点（ロンドンの中心部）から1km以内の土地利用情報に関するデータを取得し、`landuse`タグがないデータについては`building`や`leisure`の情報を利用して欠損値を補完しています。

---

### カテゴリの定義と分類

次に、土地利用データをいくつかのカテゴリに分類する関数を作成します。

```python
# 土地利用をカテゴリに分類する関数
def categorize_landuse(landuse):
    public = {'school', 'university', 'library'}
    residential = {'residential', 'house', 'apartments'}
    commercial = {'commercial', 'retail', 'shop'}
    leisure = {'park', 'garden'}

    if landuse in public:
        return 'Public'
    elif landuse in residential:
        return 'Residential'
    elif landuse in commercial:
        return 'Commercial'
    elif landuse in leisure:
        return 'Leisure'
    else:
        return 'Other'

# カテゴリを割り当て
landuse_data['category'] = landuse_data['landuse'].apply(categorize_landuse)
landuse_data = landuse_data[landuse_data['category'] != 'Other'].reset_index(drop=True)

```

この関数では、土地利用データを`Public`、`Residential`、`Commercial`、`Leisure`のカテゴリに分類しています。それ以外のデータは`Other`として分類されますが、`Other`カテゴリのデータは可視化の際に除外します。

---

### Foliumでの可視化

最後に、`folium`を使って土地利用データを地図上にプロットします。各カテゴリに色を割り当て、地図をインタラクティブに表示します。

```python
# 地図の初期設定
map = folium.Map(location=london, zoom_start=14)

# カテゴリごとの色を定義
colors = {
    'Public': '#e6194b',
    'Residential': '#3cb44b',
    'Commercial': '#ffe119',
    'Leisure': '#0082c8'
}

# スタイル関数を定義
def get_style(category):
    return {
        'fillColor': colors.get(category, '#aaaaaa'),
        'color': colors.get(category, '#aaaaaa'),
        'weight': 1,
        'fillOpacity': 0.7
    }

# GeoJsonを使って土地利用データを地図にプロット
for idx, row in landuse_data.iterrows():
    folium.GeoJson(
        row['geometry'],
        style_function=lambda feature, category=row['category']: get_style(category),
        tooltip=row['category']
    ).add_to(map)

# 地図を表示
map

```

この部分では、土地利用カテゴリごとに色を指定し、`folium`を使って地図にプロットしています。各カテゴリの土地利用情報が異なる色で視覚的に区別され、ツールチップでカテゴリ名が表示されます。

---

### 出力

ロンドン中心部の土地利用状況を地図上にPublic(赤)、Residential(緑)、Commercial(黄)、Leisure(青)の属性に区別して可視化できます。この図はスクリーンショットですが、実際にnotebook上で実行することでズーム、描画した図の詳細を確認することが出来ます。

![スクリーンショット 2024-10-19 192218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338226/4b264666-0ea8-5a37-b74c-2e219928427b.png)

### 結論

この手法を使うことで、`osmnx`を利用した土地利用情報の取得と`folium`を使ったインタラクティブな可視化が簡単に実現できます。これにより、都市計画や地理情報システムの分析がより効果的に行えるようになります。

## おわりに

最後までお読みくださりありがとうございました。

また、こちらの記事を読んでGEOTRAに興味を持ってくださった方は、是非[Wantedly](https://www.wantedly.com/stories/s/geotra_introduction)から会社紹介記事もご覧ください！GEOTRAは、学生インターンを含め、現在一緒に働く仲間を募集しております。興味をお持ちの方は、Wantedly上の募集ページやストーリー、各種サイトをご確認ください！

**企業HP：** https://www.geotra.jp/

**note：** https://note.com/2022geotra/

**Wantedly：** https://www.wantedly.com/stories/s/geotra_introduction

**LinkedIn：** https://www.linkedin.com/company/%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEgeotra/

GEOTRAのQiitaでは、引き続き地理空間情報に関する情報を中心に技術系のテクニックを発信していきます。今後も皆さんのお役に立てるコンテンツを配信できればと思っておりますので、皆様のいいね・フォローをお待ちしています！