
龍勝院ちゃんの追っかけ、俗に言う研究をしている中で、滋賀県の地図が欲しかったのでPython×GeoJSONで図を作ってみたのでその備忘録です。
龍勝院:武田勝頼の妻にして、織田信長の娘。関連記事はこちら
・龍勝院(遠山夫人)
・龍勝院研究会発足!! 11/13は龍勝院ちゃんの結婚記念日でした
龍勝院ちゃんと近江水口の関係性を探る研究
・龍勝院ちゃんの収入源~近江水口龍勝院化粧料仮説~
・龍勝院ちゃんの収入源~近江水口龍勝院化粧料仮説~
目次
滋賀県を図示する
まずは滋賀県を図示してみる。データはGeoJSONという形式で、国土地理院のウェブサイトからダウンロードできる[1]。
今回はjupyter notebookを使用する。
import geopandas as gpd
import matplotlib.pyplot as plt
#data path
input_path_oumi = '/path/to/data/N03-20230101_25_GML/N03-23_25_230101.geojson'
df_oumi = gpd.read_file(input_path_oumi)
#figure size
plt.rcParams['figure.figsize'] = (18.0, 18.0)
df_oumi.plot(color='lightgreen', edgecolor='none')
plt.axis('off')
#dpi-> resolution
plt.savefig("./shiga1.jpg", dpi=300)
plt.show()
"/path/to/data"の部分は適宜調整してほしい。このコードを走らせると、shiga1.jpgが生成される。ちなみにブログにアップできるように画像のdpiを300にしているが、高解像度が欲しい場合は600とかにもできるので好きなようにいじると良い。

甲賀市を図示する
次は甲賀市をプロットしてみよう。データは先ほどと同じgeojsonで良い。このgeojsonは行政区域データであるため、データ内の「甲賀市」を取り出してあげることで図示できる。
import geopandas as gpd
import matplotlib.pyplot as plt
#data path
input_path_oumi = '/path/to/data/N03-20230101_25_GML/N03-23_25_230101.geojson'
df_oumi = gpd.read_file(input_path_oumi)
#抜き出したい市町村名(郡はgunsで指定可能)
Target_oumi=['甲賀市']
Target_oumi_guns=['']
Toumi_df = df_oumi[df_oumi['N03_004'].isin(Target_oumi) |
df_oumi['N03_003'].isin(Target_oumi_guns)].reset_index(drop=True)
#figure size
plt.rcParams['figure.figsize'] = (18.0, 18.0)
#順番は後のやつが上にプロットされるので注意
ax1 = df_oumi.plot(color='lightgreen', edgecolor='none',label="滋賀県")
Toumi_df.plot(markersize=50, color='violet', edgecolor='darkviolet', ax=ax1, label="甲賀市")
plt.axis('off')
#dpi-> resolution
plt.savefig("./shiga2.jpg", dpi=300)
plt.show()
少し複雑になってきたが、これでできる図は以下のものである。

水口町を図示する
それでは次に「水口」をプロットしよう。旧甲賀郡水口町は2004年に周辺の町と合併し、現在は「甲賀市」となっているため、最新の行政区域データには含まれていない(甲賀市でまとめられている)。そこで今回は平成12年の滋賀県の行政区域データを使う。同じように国土地理院のウェブサイトからダウンロードできる[2]。
import geopandas as gpd
import matplotlib.pyplot as plt
#data path
input_path_oumi = '/path/to/data/N03-20230101_25_GML/N03-23_25_230101.geojson'
input_path_oumi_detail = '/path/to/data/N03-001001_25_GML/N03-001001_25-g_AdministrativeBoundary.shp'
df_oumi = gpd.read_file(input_path_oumi)
df_oumi_detail = gpd.read_file(input_path_oumi_detail)
#抜き出したい市町村名(郡はgunsで指定可能)
Target_oumi=['甲賀市']
Target_oumi_guns=['']
Toumi_df = df_oumi[df_oumi['N03_004'].isin(Target_oumi) |
df_oumi['N03_003'].isin(Target_oumi_guns)].reset_index(drop=True)
Target_oumi_detail=['水口町']
Target_oumi_detail_guns=['']
Toumi_detail_df = df_oumi_detail[df_oumi_detail['N03_004'].isin(Target_oumi_detail) |
df_oumi_detail['N03_003'].isin(Target_oumi_detail_guns)].reset_index(drop=True)
#figure size
plt.rcParams['figure.figsize'] = (18.0, 18.0)
#順番は後のやつが上にプロットされるので注意
ax1 = df_oumi.plot(color='lightgreen', edgecolor='none',label="滋賀県")
ax2 = Toumi_df.plot(markersize=50, color='violet', edgecolor='darkviolet', ax=ax1, label="甲賀市")
Toumi_detail_df.plot(markersize=50, color='pink', edgecolor='red', ax=ax2, label="水口町")
plt.axis('off')
#dpi-> resolution
plt.savefig("./shiga3.jpg", dpi=300)
plt.show()
これでできる図がshiga3.jpgである。

旧水口町は赤い領域。
琵琶湖を図示する
ここまでで大体目的は達成した。しかし、この緑色の図を見て「滋賀県」と理解するのは難しい。なぜなら、滋賀県といえば「琵琶湖」なのにそれがない。「滋賀県ってこんなに広かったけ?」と感じてしまうので、琵琶湖を図示しよう。
湖のデータは国土地理院の「水域」データの中の「湖沼」データに含まれている[3]。
import geopandas as gpd
import matplotlib.pyplot as plt
input_path_oumi = '/path/to/data/N03-20230101_25_GML/N03-23_25_230101.geojson'
input_path_oumi_detail = '/path/to/data/N03-001001_25_GML/N03-001001_25-g_AdministrativeBoundary.shp'
input_path_biwako = '/path/to/data/W09-05_GML/W09-05-g_Lake.shp'
df_oumi = gpd.read_file(input_path_oumi)
df_oumi_detail = gpd.read_file(input_path_oumi_detail)
df_lake = gpd.read_file(input_path_biwako)
Target_oumi=['甲賀市']
Target_oumi_guns=['']
Toumi_df = df_oumi[df_oumi['N03_004'].isin(Target_oumi) |
df_oumi['N03_003'].isin(Target_oumi_guns)].reset_index(drop=True)
Target_oumi_detail=['水口町']
Target_oumi_detail_guns=['']
Toumi_detail_df = df_oumi_detail[df_oumi_detail['N03_004'].isin(Target_oumi_detail) |
df_oumi_detail['N03_003'].isin(Target_oumi_detail_guns)].reset_index(drop=True)
biwako = df_lake[df_lake['W09_001'].str.contains('琵琶湖', na=False)]
plt.rcParams['figure.figsize'] = (18.0, 18.0)
ax1 = df_oumi.plot(color='lightgreen', edgecolor='none',label="滋賀県")
ax2 = biwako.plot(markersize=50, color='skyblue', edgecolor='none', ax=ax1, label="琵琶湖")
ax3 = Toumi_df.plot(markersize=50, color='violet', edgecolor='darkviolet', ax=ax2, label="甲賀市")
Toumi_detail_df.plot(markersize=50, color='pink', edgecolor='red', ax=ax3, label="水口町")
plt.axis('off')
plt.savefig("./shiga4.jpg", dpi=300)
plt.show()
これでできるのがshiga4.jpgです。

やはり琵琶湖がないと滋賀じゃないね。
ラベルを図示する
さて、残された問題はラベルである。このままplt.legend()を追加すればいいかと思ったがうまくいかなかったので、最終的にはmatplotlibのpatchを使った。完成コードはこちら。
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
input_path_oumi = '/path/to/data/N03-20230101_25_GML/N03-23_25_230101.geojson'
input_path_oumi_detail = '/path/to/data/N03-001001_25_GML/N03-001001_25-g_AdministrativeBoundary.shp'
input_path_biwako = '/path/to/data/W09-05_GML/W09-05-g_Lake.shp'
df_oumi = gpd.read_file(input_path_oumi)
df_oumi_detail = gpd.read_file(input_path_oumi_detail)
df_lake = gpd.read_file(input_path_biwako)
Target_oumi=['甲賀市']
Target_oumi_guns=['']
Toumi_df = df_oumi[df_oumi['N03_004'].isin(Target_oumi) |
df_oumi['N03_003'].isin(Target_oumi_guns)].reset_index(drop=True)
Target_oumi_detail=['水口町']
Target_oumi_detail_guns=['']
Toumi_detail_df = df_oumi_detail[df_oumi_detail['N03_004'].isin(Target_oumi_detail) |
df_oumi_detail['N03_003'].isin(Target_oumi_detail_guns)].reset_index(drop=True)
biwako = df_lake[df_lake['W09_001'].str.contains('琵琶湖', na=False)]
plt.rcParams['figure.figsize'] = (18.0, 18.0)
ax1 = df_oumi.plot(color='lightgreen', edgecolor='none',label="滋賀県")
ax2 = biwako.plot(markersize=50, color='skyblue', edgecolor='none', ax=ax1, label="琵琶湖")
ax3 = Toumi_df.plot(markersize=50, color='violet', edgecolor='darkviolet', ax=ax2, label="甲賀市")
Toumi_detail_df.plot(markersize=50, color='pink', edgecolor='red', ax=ax3, label="水口町")
plt.axis('off')
legend_elements = [
Patch(facecolor='lightgreen', edgecolor='none', label='滋賀県'),
Patch(facecolor='skyblue', edgecolor='none', label='琵琶湖'),
Patch(facecolor='violet', edgecolor='darkviolet', label='甲賀市'),
Patch(facecolor='pink', edgecolor='red', label='水口町'),
]
plt.legend(handles=legend_elements, loc='upper left', fontsize=22)
plt.savefig("./shiga5.jpg", dpi=300)
plt.show()
完成した図はこちら。

しっかりラベルもついて「かっこいい」図になった。
まとめ
普段の「宇宙論」研究ではいつもjupyter notebookで図を作っているので、今回は歴史研究に使う図をjupyter notebookで作ってみた。
国土地理院のデータは商用利用可能なものもたくさんあるので、ぜひ有効活用していきたい。
参考文献
[1]国土地理院, 国土数値情報ダウンロードサイト, 行政区域データ「令和5年滋賀県」 https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html
[2]国土地理院, 国土数値情報ダウンロードサイト, 行政区域データ「平成12年滋賀県」 https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html
[3]国土地理院, 国土数値情報ダウンロードサイト, 湖沼データ https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-W09-2005.html