国土交通省サイトから海岸線の緯度経度データを取得

<h1>概要</h1>

[国土交通省の国土数値情報ダウンロードサイト](https://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-C23.html)から各都道府県の海岸線データ(XML形式)を取得して，緯度経度データを抜き出し，CSVファイルに保存する処理を実行しました．

<h1>使用言語・実行環境</h1>

<ul>
    <li>Python3.8</li>
    <li>OS: Windows11</li>
</ul>
<b>使用ライブラリ</b>
<ul>
    <li>pandas</li>
    <li>os</li>
    <li>xml.etree.ElementTree</li>
    <li>folium</li>
    <li>matplotlib</li>
    <li>tqdm.notebook</li>
</ul>

<h1>実行コード</h1>
以下がすべての実行コードになります．今回は，一例として千葉県の海岸線情報を取得しました．<br>
各処理の詳細は後述．

```
import pandas as pd
import xml.etree.ElementTree as ET
import os

# データ取得関数
# file_path：海岸線データのパス
# prefecture_name: 都道府県名
def get_coastlines_df(file_path, prefecture_name):
    if not(os.path.isfile(file_path)):
        print("file path not found")
        return pd.DataFrame()
        
    #xmlデータを読み込みます
    tree = ET.parse(file_path)
    #一番上の階層の要素を取り出します
    root = tree.getroot()
    
    lat = [] #緯度
    lon = [] #経度

    for value in tqdm(root.iter('DirectPosition.coordinate'), leave=False):
        tmp = value.text
        tmp = tmp.split(' ')
        lat.append(tmp[0])
        lon.append(tmp[1])
        
    df = pd.DataFrame()
    df['緯度'] = lat
    df['経度'] = lon
    
    df.index = [prefecture_name] * len(lat)
    
    return df

# 実行
prefecture_name = "千葉県"
file_path = "C23-06_12\C23-06_12.xml"
Chiba_coastline = get_coastlines_df(file_path, prefecture_name)
```
・結果

![スクリーンショット 2024-02-10 124117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287003/b35c10b7-210f-2d07-a7b5-18a2dac4cd9a.png)


<h1>手順</h1>
<h2>1. 各都道府県データをダウンロード</h2>

[ダウンロードサイト](https://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-C23.html)にアクセスし、必要な都道府県のデータファイル(zip形式)をダウンロードし、展開して任意の場所に置きます。

※zipファイルを自動でダウンロードし、データ取得後に自動削除することも可能ですが今回は省略します。

<h2>2. XML形式から必要なデータを抜き出す</h2>
上記のコードを実行します。
実行する際は、file_pathをxmlファイルがあるパスに、prefecture_nameを都道府県名に変更して実行してください。
xmlファイルの詳細な操作は参考サイトをご覧ください。

※取得後はxmlファイルを削除しても構いません。

<h1>おまけ(マッピング)</h1>
データを取得したので、実際に緯度経度データを地図上にマッピングしてみましょう。<br>
今回は、先ほど取得した千葉県を例にマッピングしてみます。<br>
※本記事では、Foliumを用いてマッピングを行なっています。<br><br>

以下が実行コードになります。
```
import folium
import matplotlib.pyplot as plt
from tqdm.notebook import tqdm

def mapping_coastlines(data, prefecture):
    cm = "jet"
    n_samples = 20
    cmap = plt.get_cmap("jet")
    
    if prefecture=='all':
        return 0
    
    else:
        df = data[data.index==prefecture]

        initial_location = [df.iloc[0, 0], df.iloc[0, 1]]
        # 地図生成
        folium_map = folium.Map(location=initial_location, zoom_start=7)

        for i in tqdm(range(len(df)), leave=False):
            folium.CircleMarker(
                location=[df.iloc[i, 0], df.iloc[i, 1]],
                radius=5,
                #popup=data.hpg_genre_name.iloc[200],
                color='blue',
                fill=True,
                fill_color='blue',
            ).add_to(folium_map)

        return folium_map

maps = mapping_coastlines(Chiba_coastline, '千葉県')
maps
```

作成したデータフレームから、一行ずつデータを取得し、地図上にマッピングする処理を記述しています(Foliumの詳細は、参考サイトの記事をご覧ください)。
実行すると以下のような結果が得られます。

![スクリーンショット 2024-02-10 125333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287003/f6c141af-e38d-d1b9-753e-bee63a37a30f.png)

しっかりと千葉県海岸線の緯度経度データを取得できていることが確認できます。

<h1>まとめ</h1>
以上のようにして、海岸線データの取得を行いました。<br>
これらの処理は、適宜書き換えることにより、複数の都道府県のデータを一括で作成するなど効率化することができるかと思うので、それぞれの使いやすいように書き換えていただければと思います。<br>
つたない文章ですが，最後までご覧いただきありがとうございました！

<h1>参考サイト</h1>

・[Python XMLファイルから特定要素を抽出する方法 メモ](https://qiita.com/KWS_0901/items/bf19d715b12af47bed1a)
・[foliumの基本的な使い方とオープンデータ活用](https://qiita.com/Kumanuron-1910/items/12ce7aa02922927de2f4)