500mメッシュの境界データの一括ダウンロード方法について実装してみた話

やってみた

今回の記事の背景

TableauでGISデータを活用したダッシュボードを作成しようと思い立ちました。しかし、これまでGISデータを利用したことがなかったため、まずはデータを探すところから始めました。そこで、e-Stat 政府統計の総合窓口の地域メッシュデータを見つけ、このデータを利用することにしました。しかし、このデータは1次メッシュごとにファイルが分かれており、ファイルを一括ダウンロードすることができませんでした。そのため、一括ダウンロードする方法を検討し、実装したので共有します。GISデータの素人が書いた記事だと思って読んでいただけると嬉しいです。

地域メッシュデータとは

メッシュデータとは、国土数値情報ダウンロードサイトによると「地図上の情報をデジタル化したり各種統計情報をとるために地図上の経緯度方眼として定められた地域メッシュのこと」を言います。

そして、メッシュの大きさによって1次メッシュ、2次メッシュなどに分けられています。
下記がメッシュのそれぞれの説明になります。

メッシュ区画の種類区分方法緯度の間隔経度の 間隔一辺の長さ地図との関係
第1次メッシュ第1次地域区画全国の地域を偶数緯度及びその間隔(120 分)を3等分した緯度における緯線並びに 1度ごとの経線とによって分割してできる 区域40分1度約80km20万分の1地勢図 の1図葉の区画
第2次メッシュ第2次地域区画第1次地域区画を緯線方向及び経線方向 に8等分してできる区域5分7分30秒約10km2 万5千分の1地勢 図の1図葉の区画
第3次メッシュ基準地域メッシュ (第3次地域区画)第2次地域区画を緯線方向及び経線方向 に10等分してできる区域30秒45秒約1km
第4次メッシュ2分の1地域メッシュ (分割地域メッシュ)基準地域メッシュ(第3次地域区画)を緯線 方向,経線方向に2等分してできる区域15秒22.5秒約500m
第5次メッシュ4分の1地域メッシュ (分割地域メッシュ)2分の1地域メッシュを緯線方向、経線方 向に2等分してできる区域7.5秒11.25秒11.25秒
e-Stat 政府統計の総合窓口のメッシュ統計資料を加工して作成

詳しくはhttps://www.e-stat.go.jp/pdf/gis/chiiki_mesh_toukei.pdfに記載されていますので、参考にしてみてください。

e-Statsの地域メッシュデータ

今回は4次メッシュ(500mメッシュ)をダウンロードしようと思います。
e-Statsの地域メッシュデータはこちらからダウンロードできます。スクショの赤く掛かったところを押していくと地域メッシュデータをShapefileでダウンロードすることできます。

e-Statの境界データダウンロード画面
e-Statの境界データダウンロード画面
e-Statの境界データダウンロード画面

ただ、実際のダウンロード画面までいくと最後のスクショのように一括選択できず一次メッシュごとのファイルをそれぞれダウンロードする必要があります。

地域メッシュデータの一括ダウンロード

第4次メッシュデータの場合、ファイル数が176もあります。そのため、全国のデータを利用したい人にとっては結構大変な作業になります。そのため、自分は人力で実施するのは避けたいと思い、ファイルを一括ダウンロードするpythonコードを作成しました。pythonのコードを書くのが得意な訳ではないため、ツッコミどころはあると思いますが、ご容赦ください。

ファイルを一括ダウンロードするスクリプト

import os
import zipfile
import io
import requests
import numpy as np

# ダウンロードするファイルの基本URL
base_url = 'https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=H&code={}&coordSys=1&format=shape&downloadType=5'

# 第1次メッシュコードの一覧
codelist=np.unique([
       3036, 3622, 3623, 3624, 3631, 3641, 3653, 3724, 3725, 3741, 3823,
       3824, 3831, 3841, 3926, 3927, 3928, 3942, 4027, 4028, 4040, 4042,
       4128, 4129, 4142, 4229, 4230, 4328, 4329, 4429, 4440, 4529, 4530,
       4531, 4540, 4629, 4630, 4631, 4728, 4729, 4730, 4731, 4739, 4740,
       4828, 4829, 4830, 4831, 4839, 4928, 4929, 4930, 4931, 4932, 4933,
       4934, 4939, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5038,
       5039, 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138,
       5139, 5229, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239,
       5240, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5432,
       5433, 5435, 5436, 5437, 5438, 5439, 5440, 5531, 5536, 5537, 5538,
       5539, 5540, 5541, 5636, 5637, 5638, 5639, 5640, 5641, 5738, 5739,
       5740, 5741, 5839, 5840, 5841, 5939, 5940, 5941, 5942, 6039, 6040,
       6041, 6139, 6140, 6141, 6239, 6240, 6241, 6243, 6339, 6340, 6341,
       6342, 6343, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6540, 6541,
       6542, 6543, 6544, 6545, 6546, 6641, 6642, 6643, 6644, 6645, 6646,
       6647, 6740, 6741, 6742, 6747, 6748, 6840, 6841, 6842, 6847, 6848
])
# for文でcodeを変更してファイルをダウンロード
for code in codelist:
    url = base_url.format(code)
    response = requests.get(url)
    zip_file = zipfile.ZipFile(io.BytesIO(response.content))
    # 解凍先のディレクトリのパス
    extract_path = 'shp_folder'
    zip_file.extractall(extract_path)
    zip_file.close()

また、一括ダウンロードしたファイルをすべてマージしたかったため、マージするためのスクリプトも作成しました。

import geopandas as gpd

# マージしたいShapefileのファイルパス
shp_files = os.listdir(extract_path)
shp_files = [i for i in shp_files if i.endswith('.shp') == True]
# 最初のShapefileを読み込む
os.chdir(extract_path)
merged_data = gpd.read_file(shp_files[0])

# 残りのShapefileを読み込んでマージ
for shp_file in shp_files[1:]:
    print(shp_file)
    data = gpd.read_file(shp_file)
    merged_data = gpd.pd.concat([merged_data,data])

# マージしたデータをShapefileとして保存
os.chdir('..')
merged_data.to_file('merged.shp')

最後になりますが、スクリプトの使用は自己責任でお願いします。

(参考)Shapefile

Shapefileとは、Wikipediaによると以下のように説明されています。私自身の理解も不十分なため、詳しく知りたい方は調べてみてください。

シェープファイル (英語: Shapefile) は、 地理情報システム(GIS)間でのデータの相互運用におけるオープン標準として用いられるファイル形式である[1]。例えば、井戸などの空間要素がベクター形式であるポイントラインポリゴンで示され、各要素に固有名称や温度などの任意の属性を付与できる。また、データ変換ツールを用いると、Google Earthなどで用いられているKML形式に変換することもできる。

Wikipediaを参照