Pythonのコードを1行書くだけで誰でも手軽にインタラクティブな地図アプリを作れるLeafmapを使ってみよう

![leafmap_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/709a741e-1998-82d4-8095-6e541b9c1e31.gif)

※公式サイトのデモ映像です。これがPythonのコード1行で作れます。

[https://leafmap.org/](https://leafmap.org/)

## データ確認ってめんどくさくないですか

GISデータってよくわからないな、なんだそれ。っていう方がいきなり上司に「いろんなデータが蓄積されてきたから、地図上に可視化して分析してみよう。」とか「誰でも手軽に閲覧できるように、Web上にサイトを構築しよう」なんていう話をされたら多分キレますよね？

GISデータを日常的に利用していてもそれはさほど変わらず…

GISデータを取り扱う中で、主にデータの前処理などを行っている方は同じような悩みを抱えているんじゃないかなと思うんですが、データの可視化ってめんどくないですか？

いや、QGISとかデスクトップGISでデータ処理しているならサクッと見れちゃいますし、実際頻繁に使うんですが、サーバーで定期的に行うバッチ処理のためにローカルでプログラミングしているときや、とても大きなデータを取り扱うので強めのインスタンスをクラウドで立ち上げて処理している時とか…

そんな時にいちいちファイルを書き出してQGISを立ち上げて…ちょっとだけ修正してまた書き出して…ジオメトリを移動して…って正直やってらんないですよね。

しかも、それをWebGISに載せなきゃいけない時とかは、データ処理しながらフロントエンドのコードをJavaScriptで書いて…という感じで結構忙しい。

そんな時に強力に働いてくれるのが今回紹介するLeafmapです。

## 何がすごいん

今までもデータ分析途中にサクッと可視化できるよ！みたいなライブラリはいくつもありましたが、大抵はグラフ上に幾何学形状を画像で表示してくれるとか、そんな感じのものでした。（それでもめちゃありがたい。）

が、しかし！！！！

leafmapはそれだけにとどまりません。ざっと機能をあげるだけでもこのくらいできます。

- **背景地図を自由に**変えられる
- 初期表示位置やズームレベルなど細かく設定できる
- COGなど、**最新のクラウドネイティブなラスター形式**も読める
- GeoPandasのGeoDataFrameが読めるので、つまり**ほとんどの形式のベクターデータが読める**
- **地物の属性情報は当然みれる**
- **HTMLファイルを書き出せる**
- **地物を画面上で書いて**、出力できる
- mapbox style specっぽい書き方で**スタイリングできる**
- **地図上からベクターデータにクエリ**できる
- **複数のレイヤーを追加できる**
- **WhiteboxToolsを取り込んでおり、高度なGIS処理**ができる
- バックエンドとして**kepler.glやpydeckを選択**することもできる
- **これらをほぼコーディングせずに行える**

つまりコーディングできる人が数行コードを書いて出力してしまえばあとは**誰でもコードを書かずにWhiteboxToolsを利用した地理空間分析や、kepler.glを利用した3D可視化が可能**となります。

すげぇ。

ベクターデータ分析用ツールなどいくつも地理空間分析のパッケージは存在するし、jupyterなどpythonでの分析中にデータ表示を行うことができるパッケージも存在しますが、**地図画面からインタラクティブに、なおかつコーディングをせずにデータ読み込み・出力を行い、なおかつ高度な処理できるツール**は今までほとんどなく、その点でとても画期的なパッケージといえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/95f96f33-7cbc-3dc0-3745-467ffa1548a3.png)
※kepler.glの基盤をleafmapから利用して3行くらいでCSVのデータを立体的に表現できたりする

## いやいや流石に1行ではできんやろ

嘘だと思うなら、ほなやっていきましょ。

公式のインストールに関する情報はこちらになります。

[https://leafmap.org/installation/](https://leafmap.org/installation/)

また例の如く「geospatial」パッケージをインストールするとleafmapもついてきますので、こちらも参考にしてみてください。

- [MacでGISデータ分析を始めるためにサクッとAnacondaとjupyter labをインストールしてみる](https://qiita.com/nokonoko_1203/items/3b5ceb911af6b22a449f)
- [jupyter labで最低限これだけは入れとけっていう拡張機能の紹介！](https://qiita.com/nokonoko_1203/items/edd010616a74468ea531)
- [Pythonで地理空間情報（GIS）やるために必要なパッケージ全部入りの「geospatial」が便利すぎた](https://qiita.com/nokonoko_1203/items/55faf4455f7986080e59)

準備が完了したらインポートしましょう。

```python
import leafmap
```

そしてこんなコードをnotebookに書いて実行してみましょう。

```python
m = leafmap.Map(center=(35, 140), zoom=4)
m
```

すると、ドン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/d0008e21-3641-1054-a0ca-058870f45b7d.png)

1行で地図が出ました。マジですげぇ。

## 地図を操作してみる

画面右にも左にも色々メニューが見えますね。これを操作していきましょう。（全部説明すると大変なので一部だけ…）

地図画面に慣れている方は見覚えがあるかと思いますが、画面左側は基本的には地図に地物を書き込むメニューになります。

試しにポイントを追加してみましょう。ピンのボタン（Draw a marker）をクリックしたのち、どこか適当にクリックしてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/da3afbb4-3fa7-ce33-7863-87324ba242d0.png)

するとこのようにピンが立ちますね。これがいわゆるポイントの地物ですが、これだけで簡単に作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/8d599e44-f584-2419-3c84-1053ddac6af6.png)

削除する際はゴミ箱ボタンクリック後、地物をクリックして削除し、Saveで消えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/38c821fb-d196-ea13-1095-71dcfcc9b0b9.png)

ゴミ箱ボタンの上の編集ボタンを押すと地物の移動モードになり、ピンの位置をドラックで変更できます。確定させる場合はどちらもSaveを忘れずに…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/57818617-bef4-5803-f90b-791406e24c03.png)

あとは、ラインを作成できたりポリゴンを作成できたり、地図をズームイン・アウトや全画面モードにできますので、適当に触ってみてください。

## ツールバーを触ってみる

続いて画面右上のツールバーをホバーしてみるとたくさんメニューが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/89297a70-a671-b067-8029-197b769c2a88.png)

クリック後、メニューの表示に時間がかかるものもありますので気長に待ちましょう。

メニューが多い + 高機能すぎるため、詳細は別記事かなんかでまとめるとして…注目の機能は

- ベースマップの変更
- 手持ちのラスター・ベクターデータレイヤー追加
- Whitetoolboxでジオプロセッシング
- HTML及び画像で地図を保存
- XYZタイルを検索してそのまま取り込み
- OSMのデータをダウンロード
- 属性テーブルを開く
- ベクターデータを作成

と、絞ってもこのくらい便利機能があります。

QGISやんこれ。

プロセッシング以外はアイコンとホバー時のメニュー名とUIを見れば使い方がわかると思います。

UIも洗練されていますね。

## で、コードを書くならこんなこともできるで

例えばこんな感じでコントロールを消したり…

```python
m = leafmap.Map(
    draw_control=False,
    measure_control=False,
    fullscreen_control=False,
    attribution_control=True,
)
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/ccd295e7-afff-8fd9-0dbb-fc874fb23756.png)

もちろんコードでもbasemapを変更できます。

```python
m = leafmap.Map()
m.add_basemap("Esri.NatGeoWorldMap")
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/dfdba0c3-1ad8-723f-e573-6de57045256c.png)

国土地理院のラスタータイルも読み込めます。

```python
m = leafmap.Map()
m.add_tile_layer(
    url="https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png",
    name="GSI Basemap Std",
    attribution="<a href=\"https://maps.gsi.go.jp/development/ichiran.html\" target=\"_blank\">地理院タイル</a>",
)
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/19febab8-4868-ead5-3f70-b90e722e24a2.png)

当然、GeoJSONも読めますし、ホバーすると属性情報も出てきます。

```python
m = leafmap.Map()
geojson = "https://raw.githubusercontent.com/giswqs/leafmap/master/examples/data/cable_geo.geojson"
m.add_geojson(geojson, layer_name="Cable lines")
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/8bbda461-330b-dc73-be15-1f094a220fe7.png)

こんな感じでスタイルも当てれます。

```python
m = leafmap.Map()
url = "https://raw.githubusercontent.com/giswqs/leafmap/master/examples/data/countries.geojson"
style = {
    "stroke": True,
    "color": "#0000ff",
    "weight": 2,
    "opacity": 1,
    "fill": True,
    "fillColor": "#0000ff",
    "fillOpacity": 0.1,
}
hover_style = {"fillOpacity": 0.7}
m.add_geojson(url, layer_name="Countries", style=style, hover_style=hover_style)
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/050aced5-035f-2043-b6ba-9e6e2d4e8982.png)

GeoPandasのGeoDataFrameも読み込めるので、「どんなデータが読み込めたっけな？」ってわからなくなったらとりあえずGeoPandasと一緒に使っておけばOK。

```python
import geopandas as gpd

m = leafmap.Map()
gdf = gpd.read_file(
    "https://github.com/giswqs/leafmap/raw/master/examples/data/cable_geo.geojson"
)
m.add_gdf(gdf, layer_name="Cable lines")
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/c9a06dd9-3135-e5fb-68bc-7ecdac4ff4ab.png)

kepler.glの基盤をインポートすればサクッとスタイリッシュな地図が作れちゃいます。

```python
import leafmap.kepler as leafmap

m = leafmap.Map()
url = "https://raw.githubusercontent.com/giswqs/leafmap/master/examples/data/countries.geojson"
style = {
    "stroke": True,
    "color": "#0000ff",
    "weight": 2,
    "opacity": 1,
    "fill": True,
    "fillColor": "#0000ff",
    "fillOpacity": 0.1,
}
hover_style = {"fillOpacity": 0.7}
m.add_geojson(url, layer_name="Countries", style=style, hover_style=hover_style)
m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/153d465b-4450-0574-57fb-020f192df4c1.png)

## 終わりに

これが無料で誰でも使えるんだからほんと恐ろしい時代ですね。
先人に感謝して、なんなら一緒に貢献しつつ、ありがたく使わせていただきましょう。