前回、今時の GIS データは DBMS 用のファイルになっている、というお話をしましたが、今回はそれの続きです。
神奈川県内の特定の流域内の人口を集計します。
手 順
- 原データの取得
- 対象流域のデータの抽出
- 対象流域内の 5 次メッシュの抽出
- 流域内の人口の集計
原データの取得
使用する原データは以下の 3 点です。後 2 者については 1 次メッシュ毎のアーカイブになっています。今回は 5239 と 5339 データを取得しました。
- 神奈川県の流域界・非集水域データ(世界測地系)
W12-52A-14-01.0a_GML.zip - e-Stat 統計地理情報システム 令和 2 年度国勢調査(神奈川県)
tblT001102Q5239.zip tblT001102Q5339.zip - e-Stat 統計地理情報システム 5 次メッシュ境界データ(神奈川県)
QDDSWQ5239.zip QDDSWQ5339.zip
対象流域のデータの抽出
対象流域を構成する小流域の選択
流域界・非集水域データの属性にはインテリジェンスがないので、QGIS を用いて目視で小流域を選択します。作業のポイントは以下の通りです。
- 原データには .prj が含まれていないので JGD2000(EPSG:4612)を指定
- 「エクスポート」→「新規ファイルに選択地物を保存」で以下を指定
- ファイル型 GeoPackage
- ファイル名 someBasin.gpkg
- レイヤー名 subBasins

対象流域のデータの抽出
以下のコマンドラインで clipsrc.sqlite を作成します。GeoPackage の幾何情報は geom に、地物番号は fid に収録されています。
set SQL=SELECT
set SQL=%SQL% ST_Union(ST_buffer(geom, 0.0001)) as geometry
set SQL=%SQL% FROM subBasins
set SQL=%SQL% WHERE fid ^> 0
ogr2ogr ^
-nln clipsrc ^
-dialect sqlite ^
-sql "%SQL%" ^
clipsrc.sqlite someBasin.gpkg

対象流域内の 5 次メッシュの抽出
2 つの5 次メッシュ境界データから code.sqlite を作成します。code.sqlite の code テーブルには clipsrc の領域内の 5 次メッシュのコード KEY_CODE が出力されます。
ogr2ogr ^
-nln code ^
-sql "SELECT KEY_CODE FROM MESH05239" ^
-clipsrc clipsrc.sqlite ^
code.sqlite /vsizip/QDDSWQ5239.zip
ogr2ogr ^
-nln code ^
-sql "SELECT KEY_CODE FROM MESH05339" ^
-clipsrc clipsrc.sqlite ^
-append -update ^
code.sqlite /vsizip/QDDSWQ5339.zip

実際の code.sqlite には地理情報が含まれない
流域内の人口の集計
7z で国勢調査の zip ファイルを解凍して、QGIS に同梱の sqlite3 で人口を集計します。
7z x -so tblT001102Q5239.zip > population.csv
7z x -so tblT001102Q5339.zip >> population.csv
sqlite3 code.sqlite < code.sql
code.sql は以下の通りです。解凍した population.csv のテーブル名を population とし、これの KEY_CODE と code.sqlite の code テーブルの KEY_CODE を紐づけしたうえで、 5 次メッシュ毎の人口(T001102002)を集計しています。
.mode csv
.import ./population.csv population
.header on
SELECT SUM(p.T001102002) AS population
FROM population AS p
INNER JOIN code AS c ON p.KEY_CODE = c.KEY_CODE;
これによって次の結果が画面に出力されます。
population
45294
バッチファイル
以上のコマンドラインをまとめたバッチファイルは以下の通りです。実際は 33 行目のコメント行(goto :eof)のように途中段階での結果を確認しながらバッチファイルを完成させます。最終的には中間ファイルを削除しますが、再度、バッチファイルを実行すれば済むので、これらを保存しておく必要はありません。
@echo off
setlocal
set OSGEO4W_ROOT=C:\OSGEO4W
set PATH=%OSGEO4W_ROOT%\bin;%PATH%
call %OSGEO4W_ROOT%\etc\ini\gdal.bat
if exist *.sqlite del *.sqlite
set SQL=SELECT
set SQL=%SQL% ST_Union(ST_buffer(geom, 0.0001)) as geometry
set SQL=%SQL% FROM subBasins
set SQL=%SQL% WHERE fid ^> 0
ogr2ogr ^
-nln clipsrc ^
-dialect sqlite ^
-sql "%SQL%" ^
clipsrc.sqlite someBasin.gpkg
ogr2ogr ^
-nln code ^
-sql "SELECT KEY_CODE FROM MESH05239" ^
-clipsrc clipsrc.sqlite ^
code.sqlite /vsizip/QDDSWQ5239.zip
ogr2ogr ^
-nln code ^
-sql "SELECT KEY_CODE FROM MESH05339" ^
-clipsrc clipsrc.sqlite ^
-append -update ^
code.sqlite /vsizip/QDDSWQ5339.zip
@REM goto :eof
7z x -so tblT001102Q5239.zip > population.csv
7z x -so tblT001102Q5339.zip >> population.csv
sqlite3 code.sqlite < code.sql
del *.sqlite *.csv
まとめ
今回は地理情報を含む普通のデータベースから通常のデータベース処理を行う事例を紹介しました。GIS の応用範囲が拡がるのではないでしょうか。
最後に、QGIS の用途としては主題図の作成が日常的であると思われますが、可視化した情報から何が言えるか、を説明することが重要です。そうでないならば見た人に「綺麗な絵でしょ。ご自由に解釈ください」になってしまいます。