PostGISを使ってSQLだけで面積按分:準備編（QGISを使ってCSVデータとShapeデータ結合してPostgreSQLに投入）

#はじめに
この記事は、FOSS4G 2015年アドベントカレンダーの前準備用の記事です。
面積按分をするために、e-Statから3次メッシュの人口統計情報をダウンロードし、PostgreSQLにデータを登録するまでの手順について説明します。

##必要なソフトウェア
今回用いるソフトは以下の2つです。

+ QGIS：最新版は[こちら](http://qgis.org/ja/site/forusers/download.html "QGIS Download")からダウンロードできます。
+ PostgreSQL：PostGISがSQL1文で導入できる比較的新しいバージョン9.1以上がおすすめです。ダウンロードは[こちら](http://www.enterprisedb.com/products-services-training/pgdownload "PostgreSQL ダウンロード")

 WindowsOSなら、どちらのソフトもGUIのインストーラーがあるので導入はそれほど難しくないと思います。また、PostGISはPostgreSQLのインストール後に別途インストール作業が必要です。[こちら](http://www.finds.jp/docs/pgisman/2.0.0/postgis.html#PGInstall "PostGIS 2.0.0マニュアル日本語訳")で手順をご確認下さい。

##データの入手
e-StatのWebサイトから「統計情報」を「メッシュ形状」をダウンロードします。
###ダウンロード
+ ダウンロードサイト「e-Stat 政府統計の総合窓口」
[e-Stat](http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do?method=init "e-Stat 政府統計の総合窓口") → [地図で見る統計（統計GIS）](http://www.e-stat.go.jp/SG1/estat/toukeiChiri.do?method=init "地図で見る統計（統計ＧＩＳ）")→ [データダウンロード](http://e-stat.go.jp/SG2/eStatGIS/page/download.html  "統計表検索（ダウンロード用）")
+ Step1: 統計調査（集計）を選択データ
 + 調査名：国勢調査
 + データ：平成２２年国勢調査（国勢調査ー世界測地系１ｋｍメッシュ）
+ Step2：統計表を選択（複数選択可能）
 + 「 男女別人口総数及び世帯総数」を選択
 + 「統計表各種データダウンロードへ」ボタンをクリック
+ Step3：地域選択
 + 市区町村：「097：M5339」 たくさんのメッシュがありますが、都心の5339を選択します。
 + 「検索」ボタンを押下
+ Step4：データダウンロード
 + 統計データのダウンロード （「M5339」と書かれたリンクをクリックします）
 + 境界データのダウンロード（しばらくすると境界データのリストが表示されます。「世界測地系緯度経度・Shape形式をダウンロード」）

## QGISで読込
ダウンロードしたデータをQGISで読み込みます。
データは統計データと境界データの２つに分かれているので、QGISで１つに結合し、結合したデータをPostgreSQLに投入します。

| ファイルの集類 | ファイル名称 |
|:-----------:|:------------:|
| 統計データ   | tblT000608S53390.zip |
| 境界データ   | S002005112009DDSWS05339.zip |

### データの加工
統計データはtblT000608S53390.zipを解凍するとテキストファイルが１つ得られます。
先頭行に英語の列名がが、2行目に日本語のが入っています。

QGISのCSVデータの読込機能では、複数行のカラム名に対応していないので、1行目のKEY_CODE以降を削除して上書き保存します。
### 境界データで読込
- 
境界データを解凍して、shapeデータ「MESH05339.shp」をダブルクリックします。
<img width="258" alt="スクリーンショット 2015-12-06 18.58.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/453db280-6e93-1afb-4b9c-b06d3beca688.png">


- QGISで表示されます
![スクリーンショット 2015-12-06 18.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/53918/c7a16cd5-c3d0-d7cd-d14a-1230fdf54320.png)

### 統計データの読込
- デリミテッドテキストレイヤの読込
QGISでレイヤ → レイヤの追加 → デリミテッドテキストレイヤの追加　を選択します。
<img width="35" alt="スクリーンショット 2015-12-06 19.14.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/8cb24ef1-7d2f-7368-b2b4-788b9c41c2d6.png">

- 加工済みの統計データの選択
 先頭行を編集したtblT000608S53390.txtを読み込みます。
<img width="730" alt="スクリーンショット 2015-12-06 19.22.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/efa4e1d5-e777-76a8-e8a8-6f061a674d2f.png">
 - ファイル形式：CSV（コマンドで区切られた値）
 - レコードオプション:最初のレコードはフィールド名を保持している［チェック］
 - ジオメトリ定義：ジオメトリなし（属性のみのテーブル）［チェック］
上手く行くと、QGISに属性のみのテーブルが読み込まれます
<img width="274" alt="スクリーンショット 2015-12-06 19.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/3ea71c16-682a-ecdb-493c-11c70fc72218.png">
 
### 境界データと統計データの結合
- 境界データのプロバティを表示
 レイヤウインドウの境界データ「MESH05339」をダブルクリックして、プロバティを表示
<img width="819" alt="スクリーンショット 2015-12-06 18.48.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/d58a33c5-e15e-81dc-6c9a-53c35238deee.png">

- データの結合
 - 結合タブをクリック → 右下の「＋」ボタンをクリック
 - 統計データと境界データの2つのデータを結合する列名を指定
  <img width="518" alt="スクリーンショット 2015-12-06 18.49.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/fc6fe9ad-6cf5-7643-5adf-f24b8f659d45.png">
  - 結合するレイヤ：統計データの名称
  - 結合フィールド：KEY_CODE
  - ターゲットフィールド：KEY_CODE
  上記の設定で、統計情報のメッシュコードと境界データのメッシュコードが同一の行が結合し、１つのテーブルのように扱えます

### shape形式で保存
+ レイヤを名前をつけて保存
レイヤウインドウの境界データ「MESH05339」を右クリックして、「名前をつけて保存」を選択します。
名称は特に拘る必要はありませんが、今回は「mesh5339.shp」という名称にしました。
<img width="373" alt="スクリーンショット 2015-12-06 19.44.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/458e3e14-6f86-b2ed-9220-205e7662cb66.png">

+ 形式を指定する
 ファイルの形式を「ESRI Shapefile」と指定して下さい。
 ![スクリーンショット 2015-12-06 19.46.25.png](https://qiita-image-store.s3.amazonaws.com/0/53918/171074a9-1c4b-675b-d49d-1f0ad9e38bac.png)
+ ファイル名を指定
 「ブラウズ」ボタンをクリックし、ファイルの保存場所とファイル名を指定して下さい。
+ 保存
  「OK」ボタンをクリックして保存します。

#データベースへ投入
QGISの拡張機能である「SPIT」を使って、shapeデータをPostGISに投入します。
SPITがインストールされていれば、象さんのアイコンが表示されています。
<img width="39" alt="スクリーンショット 2015-12-06 20.52.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/9d73541d-9674-607b-4404-b2c573d9963b.png">

- SPITの起動
 象のアイコン沢山有るかもしれませんが、SPITのアイコンを探しだしてクリック
- データベースの接続の選択または新規作成
 PostgreSQLに接続する為の設定が必要になります。
 予め、PostgreSQLにPostGISを導入済みのデータベースを作成する必要があります。
![スクリーンショット 2015-12-06 20.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/53918/be65575b-1a55-a2cc-10a0-e780537caacc.png)
 - 名称：任意の名称を付けて下さい
 - ホスト：データベースの接続先です。同じPCでしたら「localhost」
 - データベース：PostGISが導入されているデータベースの名称を指定して下さい
- インポートオプション
 ![スクリーンショット 2015-12-06 20.57.16.png](https://qiita-image-store.s3.amazonaws.com/0/53918/5419a740-59e5-654a-1239-d4cd0f7e6c10.png)
 設定のポイント
 - SRID:「デフォルトのSRIDを使う」のチェックボックスを外し、作成したshapeデータのSRIDを入力します。(4612）
- データの追加
 - 「追加」ボタンをクリックしてshapeファイルを選択します
  DBリレーション名：作成されるテーブルの名称です。
 - 「OK」をクリックして入力データのPostgreSQLに読込
  エラーメッセージが出なければ、データベースへの登録は完了です。

+ 作成されたテーブル
SPITが自動的に作成したテーブルを観察してみます。
 + テーブル構造

```sql:CREATETABLE
CREATE TABLE mesh5339
(
  gid serial NOT NULL, --ID
  "MESH1_ID" character varying(4), --1次メッシュコード
  "MESH2_ID" character varying(2), --2次メッシュコード
  "MESH3_ID" character varying(2), --3次メッシュコード
  "OBJ_ID" integer, --メッシュ形状のID
  "KEY_CODE" character varying(8), --メッシュコード
  "tblT000608" integer, --人口
  "tblT0006_1" integer, --男性人口
  "tblT0006_2" integer, --女性人口
  "tblT0006_3" character varying(254), --世帯数
  the_geom geometry(Polygon,4612),--メッシュ形状：測地系（新日本測地系）
  CONSTRAINT mesh5339_pkey PRIMARY KEY (gid)
)
WITH (
  OIDS=FALSE
);
```

 + データ例
  <img width="1130" alt="スクリーンショット 2015-12-07 0.43.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/10ad68eb-802c-f2b2-1047-b096e907cf8a.png">

お疲れ様でした。ここまで来れば準備OKです！