日本の行政区域データをPostgreSQLにインポートするメモ

日本の行政区域データをPostgreSQLにインポートするメモです。行政区域や町の境界データは、国土交通省および、政府統計の総合窓口（ｅ－Ｓｔａｔ）から取得することができます。

初めにPostgreSQLのデータベースを作成します。以前投稿した以下の記事も参考にして下さい。

[僕の地球を作って！そろそろOpenStreetMapタイルサーバは数秒で構築できるようにしようよ](https://qiita.com/kekekekenta/items/b620613e76a79e741468)

これから紹介するスクリプトで使用する環境変数を設定しておきます。環境にあわせて変更してください。

```
export PSQL_HOST=localhost
export PSQL_PORT=5432
export PSQL_USERNAME=postgres
export PSQL_PASSWORD=postgrespassword
export PSQL_DBNAME=gis
```

PostgreSQLのデータベースします。

```
echo $PSQL_HOST:$PSQL_PORT:$PSQL_DBNAME:$PSQL_USERNAME:$PSQL_PASSWORD > ~/.pgpass
chmod 600 ~/.pgpass
psql --host=$PSQL_HOST --port=$PSQL_PORT --username=$PSQL_USERNAME --dbname=postgres --command="CREATE DATABASE $PSQL_DBNAME ENCODING = UTF8;"
psql --host=$PSQL_HOST --port=$PSQL_PORT --username=$PSQL_USERNAME --dbname=$PSQL_DBNAME --command="CREATE EXTENSION postgis;"
psql --host=$PSQL_HOST --port=$PSQL_PORT --username=$PSQL_USERNAME --dbname=$PSQL_DBNAME --command="CREATE EXTENSION hstore;"
```

# 行政区域をPostgreSQLにインポート
行政区域データは、国土交通省のGISホームページから入手することができます。
「GISホームページ」、「GML（JPGIS2.1）シェープファイル」、「行政区域（ポリゴン）」の順にページを移動してください。

[TOP / 国土数値情報 / 行政区域データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_4.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/d58c2362-3bbd-c780-edaf-18cfd6c0c314.png)

各地域のデータをダウンロードして、1つのディレクトリにまとめます。まとめたディレクトリに移動したら以下のスクリプトを実行することでPostgreSQLのSQLを作成することができます。

```sh:create_table_admarea_estat.sh
#!/bin/sh
APPEND=0
FILE_SQL=admarea_mlit.sql
TABLE=admarea_mlit
for FILE in *.zip
do
echo unzip $FILE
unzip -u $FILE
done
for FILE in *.shp
do
echo shp2pgsql $FILE
if test $APPEND -eq 0
then
shp2pgsql -s 4612 -D -i -I -W cp932 $FILE $TABLE > $FILE_SQL
APPEND=1
else
shp2pgsql -a -s 4612 -D -i -I -W cp932 $FILE $TABLE >> $FILE_SQL
fi
done
```

作成されたSQLを実行することによりインポートします。

```sh
psql --host=$PSQL_HOST --port=$PSQL_PORT --username=$PSQL_USERNAME --dbname=$PSQL_DBNAME -f admarea_mlit.sql
```

QGISで確認するとインポートされていることを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/a18ae3c5-5091-f311-82df-6a774e66e9e7.png)

# 町の境界データをPostgreSQLにインポート
町の境界データは、各府省等の参画の下、総務省統計局が整備し、独立行政法人統計センターが運用管理している、政府統計の総合窓口（ｅ－Ｓｔａｔ）から入手することができます。

「e-Stat」、「地図で見る統計(統計GIS)」、「境界データダウンロード」、「小地域」、「国勢調査」、「2015年」、「小地域（町丁・字等別）」、「世界計地系緯度経度・Shapefile」の順にページを移動してください。

[政府統計の総合窓口（ｅ－Ｓｔａｔ）/トップページ / 地図で見る統計(統計GIS) / 境界データダウンロード](https://www.e-stat.go.jp/gis/statmap-search?page=1&type=2&aggregateUnitForBoundary=A&toukeiCode=00200521&toukeiYear=2015&serveyId=A002005212015&coordsys=1&format=shape)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/c3bd4ae2-fc04-81c8-5ff5-595812b94aa7.png)

各地域のShapefileをダウンロードして、1つのディレクトリにまとめます。まとめたディレクトリに移動したら以下のスクリプトを実行することでPostgreSQLのSQLを作成することができます。

```sh:create_table_admarea_estat.sh
#!/bin/sh
APPEND=0
FILE_SQL=admarea_estat.sql
TABLE=admarea_estat
for FILE in *.zip
do
echo unzip $FILE
unzip -u $FILE
done
for FILE in *.shp
do
echo shp2pgsql $FILE
if test $APPEND -eq 0
then
shp2pgsql -s 4612 -D -i -I -W cp932 $FILE $TABLE > $FILE_SQL
APPEND=1
else
shp2pgsql -a -s 4612 -D -i -I -W cp932 $FILE $TABLE >> $FILE_SQL
fi
done
```

作成されたSQLを実行することによりインポートします。

```sh
psql --host=$PSQL_HOST --port=$PSQL_PORT --username=$PSQL_USERNAME --dbname=$PSQL_DBNAME -f admarea_estat.sql
```

QGISで確認するとインポートされていることを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/35f4e8ce-9ee1-3d74-a264-2afb58fc73f4.png)