CUI で GIS(3)

by

in

 前回、今時の GIS データは DBMS 用のファイルになっている、というお話をしましたが、今回はそれの続きです。
 神奈川県内の特定の流域内の人口を集計します。

手 順

  1. 原データの取得
  2. 対象流域のデータの抽出
  3. 対象流域内の 5 次メッシュの抽出
  4. 流域内の人口の集計

原データの取得

 使用する原データは以下の 3 点です。後 2 者については 1 次メッシュ毎のアーカイブになっています。今回は 5239 と 5339 データを取得しました。

対象流域のデータの抽出

対象流域を構成する小流域の選択

 流域界・非集水域データの属性にはインテリジェンスがないので、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 の用途としては主題図の作成が日常的であると思われますが、可視化した情報から何が言えるか、を説明することが重要です。そうでないならば見た人に「綺麗な絵でしょ。ご自由に解釈ください」になってしまいます。