Python 日本地図や、指定した都道府県の地図を描く「geopandas」

 本記事では、下図のように地図を描く雛形コードを載せました。

 日本地図のデータは下記リンク先にある「全国」より取得できます。都道府県の地図データは「全国」から抽出することができますし、個別に「都道府県名」より取得することもできます。

nlftp.mlit.go.jp

 上記よりダウンロードしたファイル形式は、geojson と shp(dbf, prj, shx, xml)の2種類が同梱されていて、どちらもライブラリ「geopandas」で使用可能です。

■「geopandas」のインストール方法

# pipの場合
pip install geopandas

# anaconda環境の場合

conda install geopandas

 本雛形コードの途中でマップデータと連結することで、市町村別の数値データを地図上に描くことができます。例えば、冒頭の右図には東海3県の市町村別の米の収穫量を色分けで図示しました。さらに、そのトップ10の市町村名を地図上に記載しています。(使用したデータはネットから探してきた「出典:令和2年生産農業所得統計」を元に事前に成形したものを使いました。

■本プログラム

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

# GeoJSON形式のファイルを読み込む
geojson_path = 'N03-20210101_GML/N03-21_210101.geojson'
gdf_japan = gpd.read_file(geojson_path)
gdf_japan


# In[2]:


# GeoDataFrameをプロット
gdf_japan.plot(column='N03_001', legend=False, figsize=(10, 10))


# In[3]:


# 都道府県名一覧
my_group = gdf_japan.groupby("N03_001").groups.keys()
my_group


# In[4]:


# 必要な県名だけ抽出(ここでは東海3県)
target_list = ['愛知県', '岐阜県', '三重県']
gdf = gdf_japan.query('N03_001 in @target_list')
gdf


# In[5]:


# GeoDataFrameをプロット
gdf.plot(column='N03_001', cmap='viridis', legend=True, figsize=(10, 10))

# 結合した地図データをファイルに保存する
gdf.to_file('tokai3ken.shp') # shp形式
gdf.to_file('tokai3ken.geojson', driver='GeoJSON') # geojson形式


# In[6]:


file_path = '出典_令和2年生産農業所得統計.xlsx'
sheet_list = ['愛知県','岐阜県','三重県']
df_list = []
for sheet in sheet_list:
    _df = pd.read_excel(file_path,
                       sheet_name = sheet, # シート名 
                       #index_col = 0, # インデックスにする列名
                       #header = None # ヘッダーにする行がない場合
                       #usecols = [0, 1, 3], # 読み込む列番号 
                       #skiprows = [0,1,3], # スキップする行
                       engine = "openpyxl"
    )
    df_list.append(_df)
df = pd.concat(df_list)
df


# In[7]:


# 市町村名をキーにしてデータフレームを結合する。この時、左側のデータフレームの行は残す
new_gdf = gpd.GeoDataFrame(pd.merge(gdf, df, left_on='N03_004', right_on='市区町村名', how='left'))
new_gdf.isna().sum()


# In[8]:


# 重複業を削除
new_gdf2 = new_gdf.drop_duplicates(subset="市区町村名", keep='last') 
new_gdf2


# In[9]:


# トップ10を抽出
target_col_name = '米 の収穫量(t/年)'
top10 = new_gdf2.nlargest(10, target_col_name)
top10


# In[10]:


# 地図をプロット
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
new_gdf.plot(column=target_col_name, cmap='cool', linewidth=0.8, ax=ax, edgecolor='0.8', legend=True)

# トップ10の市町村をプロット
plotted_cities = set()
for index, row in top10.iterrows():
    label = row['N03_004']
    if label not in plotted_cities:
        geometry = row['geometry']
        x, y = geometry.centroid.x, geometry.centroid.y
        ax.text(x, y, label, fontsize=8, ha='center', va='center', color='black', bbox=dict(facecolor='white', alpha=0.7))
        plotted_cities.add(label)
plt.title(target_col_name)
plt.show()

以上

<広告>