Foliumを使って国土数値情報を地図上に表示する

# はじめに
<!---->
[国土数値情報](https://nlftp.mlit.go.jp/index.html"国土数値情報")などから得られるShapeファイルをJupyter notebookで加工する必要があった。<br>期待通りの結果になっているかを地図上で確認するために、加工結果を再度Shapeファイルにして、QGISでに読み込ませて表示する、ということをやっていたが面倒だった。<br>Foliumというライブラリを使えば、Jupyter notebook上で地図表示が可能だということを知ったので本記事を書いた。<br>
# 国土数値情報のダウンロード
<!---->
[国土数値情報](https://nlftp.mlit.go.jp/index.html)から適当なデータをダウンロードする。
ここではポイントデータとして[東京都の避難施設](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P20.html#prefecture13)とする。
# ライブラリのインストール
<!---->
```python
pip install shapely
pip install folium
```

# ポイントデータの読み込みと表示
<!---->
ポイントデータのShapeファイルを読み込む関数を定義する。
```python:read_shape_point.py
import shapefile
import pandas as pd
def read_shape_point(path):
    src = shapefile.Reader(path, encoding='cp932') 
    shps = src.shapes()
    recs = src.records()
    result = {}
    for i, (shp, rec) in enumerate(zip(shps, recs)):
        result[i] = rec.as_dict()
        result[i]['lon'] = shp.points[0][0]
        result[i]['lat'] = shp.points[0][1]
    return pd.DataFrame(result).T
```
<br>
shpファイルを読み込む。

```python
import glob
path = 'data\P20-12_13_GML'
shp_paths = glob.glob(path + '\?????????.shp')
hinan = read_shape_point(shp_paths[0])
```

<br>
読み込んだデータを表示。

```python
hinan
```
<br>
先頭2行だけを表示した。
施設名称の列名が[P20_002]、住所が[P20_003	]となっている。

|      |   P20_001 | P20_002                                                                      | P20_003                                               | P20_004                                |   P20_005 |   P20_006 |   P20_007 |   P20_008 |   P20_009 |   P20_010 |   P20_011 |   P20_012 |   レベル | 備考                   |    緯度 |    経度 |   NO |     lon |     lat |
|-----:|----------:|:-----------------------------------------------------------------------------|:------------------------------------------------------|:---------------------------------------|----------:|----------:|----------:|----------:|----------:|----------:|----------:|----------:|---------:|:-----------------------|--------:|--------:|-----:|--------:|--------:|
|    0 |     13101 | いきいきプラザ一番町                                                         | 東京都千代田区一番町12-2                              | 指定避難所、二次避難所                 |        -1 |        -1 |         0 |         0 |         0 |         0 |         0 |         1 |        1 |                        | 35.6869 | 139.74  |    1 | 139.74  | 35.6869 |\n|    1 |     13101 | お茶の水小学校                                                               | 東京都千代田区猿楽町1-1-1                             | 指定避難所、地区救援センター           |        -1 |        -1 |         0 |         0 |         0 |         0 |         0 |         1 |        1 |                        | 35.6973 | 139.76  |    2 | 139.76  | 35.6973 |
|    2 |     13101 | ちよだパークサイドプラザ                                                     | 東京都千代田区神田和泉町1                             | 指定避難所、地区救援センター           |        -1 |        -1 |         0 |         0 |         0 |         0 |         0 |         1 |        3 |                        | 35.6993 | 139.779 |    3 | 139.779 | 35.6993 |\n|    3 |     13101 | 岩本町ほほえみプラザ                                                         | 東京都千代田区岩本町2-15-3                            | 指定避難所                             |        -1 |        -1 |         0 |         0 |         0 |         0 |         0 |         1 |        3 |                        | 35.6945 | 139.778 |    4 | 139.778 | 35.6945 |

<br>
緯度経度を指定し地図に読み込ませていく。
重たくなるので先頭500個だけ。

```python
folium_map = folium.Map(location=[hinan.loc[0]['lat'], hinan.loc[0]['lon']], zoom_start=10)
for i in range(500):
    folium.Marker(
        location=[hinan.loc[i]['lat'], hinan.loc[i]['lon']],
        popup = hinan.loc[i]['P20_002'] + "\n" + hinan.loc[i]['P20_003']
    ).add_to(folium_map)
folium_map
```
<br>
地図を表示する。

```python
folium_map
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605106/62c54b8f-8908-546f-0a0d-edd1dd611dd7.png)