今回の記事の背景
TableauでGISデータを活用したダッシュボードを作成しようと思い立ちました。しかし、これまでGISデータを利用したことがなかったため、まずはデータを探すところから始めました。そこで、e-Stat 政府統計の総合窓口の地域メッシュデータを見つけ、このデータを利用することにしました。しかし、このデータは1次メッシュごとにファイルが分かれており、ファイルを一括ダウンロードすることができませんでした。そのため、一括ダウンロードする方法を検討し、実装したので共有します。GISデータの素人が書いた記事だと思って読んでいただけると嬉しいです。
地域メッシュデータとは
メッシュデータとは、国土数値情報ダウンロードサイトによると「地図上の情報をデジタル化したり各種統計情報をとるために地図上の経緯度方眼として定められた地域メッシュのこと」を言います。
そして、メッシュの大きさによって1次メッシュ、2次メッシュなどに分けられています。
下記がメッシュのそれぞれの説明になります。
メッシュ | 区画の種類 | 区分方法 | 緯度の間隔 | 経度の 間隔 | 一辺の長さ | 地図との関係 |
---|---|---|---|---|---|---|
第1次メッシュ | 第1次地域区画 | 全国の地域を偶数緯度及びその間隔(120 分)を3等分した緯度における緯線並びに 1度ごとの経線とによって分割してできる 区域 | 40分 | 1度 | 約80km | 20万分の1地勢図 の1図葉の区画 |
第2次メッシュ | 第2次地域区画 | 第1次地域区画を緯線方向及び経線方向 に8等分してできる区域 | 5分 | 7分30秒 | 約10km | 2 万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秒 |
詳しくはhttps://www.e-stat.go.jp/pdf/gis/chiiki_mesh_toukei.pdfに記載されていますので、参考にしてみてください。
e-Statsの地域メッシュデータ
今回は4次メッシュ(500mメッシュ)をダウンロードしようと思います。
e-Statsの地域メッシュデータはこちらからダウンロードできます。スクショの赤く掛かったところを押していくと地域メッシュデータをShapefileでダウンロードすることできます。
ただ、実際のダウンロード画面までいくと最後のスクショのように一括選択できず一次メッシュごとのファイルをそれぞれダウンロードする必要があります。
地域メッシュデータの一括ダウンロード
第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を参照