久しぶりに国土数値情報の河川データに戻り、データ取得の効率化を図ります。
これまでは国土数値情報の河川データをLocalPCにダウンロードして解凍したデータをGoogleDriveにUploadするというまどろっこしい操作をしていましたが、APIやWebScreipingを学習する中で、Webから直接zipFileを取得してPython上で解凍し、必要なデータを取得することができるということがわかってきたので、今後、使用頻度が高いと思われる河川データをWeb上で直接取得する方法を検討しました。
ChatGPT先生に相談しながら、まずは国土数値情報の河川データを取得するコードを作成しました。
作成したコードは以下のとおりです。
最初、「国土数値情報の河川データから河川データのshpファイルを取得」という指示をChatGPT先生に与えたところ、冒頭の図にあるような流路(LineString)ではなく、接続点=Node情報(Point)を取得していました。これは各県別の河川データのzipFileの中に2種類のshpFileがあり、1つはNode情報、1つはFlowPath情報になっているためでした。
shpFileNameを指定せずにデータを取得した場合に、なぜNode情報を見に行くのかまでは解明しておりません。
ですので、河川データを一度GoogleColabのドライブにDownLoadして、解凍し、所定のファイルを読み込んだ後、gdf_shikoku_riverに追加していくという流れでコードを作っています。なお、以下のコードではFlowPath情報が含まれているFileNameのTailが'-g_Stream.shp'を指定して取得しています。
import urllib.request
import zipfile
import geopandas as gpd
def download_map_data(url, zip_file_name, shp_file_name):
#url = 'https://nlftp.mlit.go.jp/ksj/gml/data/W05/W05-06/W05-06_36_GML.zip'
#zip_file_path = 'W05-06_36_GML.zip'
zip_file_path = 'unzipped_data/' + zip_file_name
# URLからデータをダウンロード
urllib.request.urlretrieve(url, zip_file_name)
# ZIPファイルを解凍
with zipfile.ZipFile(zip_file_name, 'r') as zip_ref:
zip_ref.extractall('unzipped_data') # 解凍先のディレクトリを指定
# Shapefileを読み込む
#shapefile_path = 'unzipped_data/W05-06_36-g_Stream.shp'
shp_file_path = 'unzipped_data/' + shp_file_name
gdf = gpd.read_file(shp_file_path)
return gdf
# ダウンロード対象ファイル名をリスト形式で指定
download_file_list = [
['W05-06/', 'W05-06_36'], #Tokushima
['W05-06/', 'W05-06_37'], #Kagawa
['W05-06/', 'W05-06_38'], #Ehime
['W05-06/', 'W05-06_39'] #Kochi
]
# データフレームを格納するリスト
gdf_shikoku_river = gpd.GeoDataFrame()
# ダウンロードとデータ読み込みのループ
for filename in download_file_list:
# url = f'https://nlftp.mlit.go.jp/ksj/gml/data/W05/W05-06/W05-06_{number:02d}_GML.zip'
url = 'https://nlftp.mlit.go.jp/ksj/gml/data/W05/' + filename[0] + filename[1] + '_GML.zip'
zip_file_name = filename[1] + '_GML.zip'
shp_file_name = filename[1] + '-g_Stream.shp'
# データをダウンロードして読み込む
gdf = download_map_data(url, zip_file_name, shp_file_name)
gdf_shikoku_river = gdf_shikoku_river.append(gdf)
#url = 'https://nlftp.mlit.go.jp/ksj/gml/data/W05/W05-06/W05-06_36_GML.zip'
#zip_file_name = 'W05-06_36_GML.zip'
#shp_file_name = 'W05-06_36-g_Stream.shp'
#gdf_river_36 = download_map_data(url, zip_file_name, shp_file_name)
# データを表示する例
gdf_shikoku_river.head()
print(gdf_shikoku_river)
これを何も考えずにColorMapで図化すると冒頭のような都道府県別に河川が塗り分けられた図になります。
import matplotlib.pyplot as plt
# Create the Figure
fig, ax = plt.subplots(figsize=(10,10))
# Plot the GeoDataFrame
colormap = plt.cm.get_cmap('viridis')
gdf_shikoku_river['geometry'].plot(ax=ax, cmap='viridis',
linewidth=0.5) #, edgecolor='0.8')
# Set the title
plt.title('Shikoku Rivers')
# Hidden the axis
ax.axis('off')
# Show the plot
plt.show()
せっかくなので、水系別で色分けしてみようと考えました。これはChatGPT先生に全面的に協力いただき、試行錯誤を繰り返して、たどり着くことができました。
import matplotlib.pyplot as plt
# Create the Figure
fig, ax = plt.subplots(figsize=(10, 10))
# Plot the GeoDataFrame, specifying the column for colors
#colormap = plt.cm.get_cmap('viridis')
gdf_shikoku_river.plot(column='W05_002', ax=ax, cmap='jet', linewidth=0.5)
# Set the title
plt.title('Shikoku Rivers by Water System')
# Add a legend
#legend = ax.get_legend()
#legend.set_title('Water System')
# Hidden the axis
ax.axis('off')
# Show the plot
plt.show()
おおむね橙色から緑色が1級河川、青色から水色あたりが2級から普通河川くらいの分類になっているように見えます。
高知県の物部川と徳島県の那賀川が同系色になっていて区別しづらいですね。
あと、吉野川から北に向かって茶色系の河川が見えますが、これは吉野川からの分流ではなく、香川県の土器川です。理学系の先生が以前セミナーで語っていたところでは、土器川は昔は吉野川とつながっていたという説があるようです。あと、中央構造線の活動によって、土器川の流路は海側にいくほど西に向かっているんだったかなぁ。。。
コメント
コメントを投稿