PostGISで地理空間情報を管理してみた！

#本記事について
PostGISは、オープンソースDBMSであるPostgeSQLの拡張モジュールで、地理空間情報を管理することができます。
この記事では、地理空間情報のデファクトスタンダードであるESRI社のシェープファイルをPostGISで取り込む方法を紹介します。
これから地理空間情報を複数人に共有・一元管理したい人にお薦めの記事です！

#PostGISのインストール
先ずはPostgreSQLをインストールしましょう。
[こちら](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows)から、PostgreSQLのバージョンとインストールするOSのバージョンを指定して、インストールexeをダウンロードして下さい。
少し古い記事ですが、[WindowsでPostgreSQLを使ってみよう](https://lets.postgresql.jp/documents/tutorial/windows/)の「インストール・ウィザードでの手順」の通り進めれば問題ないかと思います。
※本記事ではPostgreSQL 10.3でOSはWindows7前提です。

PostgreSQLをダウンロードできたら、スタックビルダ（Application Stack Builder）を起動してPostGISインストール作業を進めます。
こちらも少し古い記事ですが、[PostGISのインストール](https://lets.postgresql.jp/documents/tutorial/PostGIS/2)の記事の手順通りで問題ないかと思います。
※本記事ではPostGIS 2.4前提です。

もし、インストールがうまくいかない場合はお気軽にコメント下さい！
#データベースの作成
地理空間情報を格納するデータベースを作成します。
ここでは、「geodb」なんてデータベース名にしましょうか！

コマンドプロンプトで以下のコマンドを実行します。

```
psql -U （ユーザ名） -c "create database geodb"
```

※コマンド解説※
psql：postgreSQLを操作するコマンド
-U：ログインするユーザ名 ※私はスーパーユーザでログインしています。
-c：単一のSQLコマンドを一つ実行

データベース作成後に、接続します。

```
psql -U （ユーザ名） -d geodb
```

※コマンド解説※
-d：接続するデータベース

接続できたら、作成したデータベース（geodb）にPostGISの拡張機能を付与します。
エクステンションの追加とも言います！

```
geodb=# create extension postgis;
```

正しく追加できたら、以下のコマンドで必要なテーブルとビューが作成されているか確認しましょう。

```
geodb=# \d
```

※作成されたテーブル・ビュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/b45fb4a5-d84e-f88c-ebe5-e718ba246711.png)

これでデータベース作成完了です。


#シェープファイルの取り込み
本記事ではesri ジャパンの[全国市町村界データ](https://www.esrij.com/products/japan-shp/)を取り込んでみます。
取り込みにはPostGISのshp2pgsqlコマンドを使います。
shp2pgsqlコマンドの詳細は[こちら](http://www.bostongis.com/pgsql2shp_shp2pgsql_quickguide.bqg)を参照して下さい。

コマンドプロンプトで以下のコマンドを実行すると、データベースに取り込む用のSQLファイルを作成します。

```
shp2pgsql -W cp932 -D -I -s 4612 （シェープファイルのパス） （テーブル名） > （作成SQLファイルのパス）
```

※コマンド解説※
shp2pgsql：シェープファイルからPostGISで実行可能なクエリを作成するコマンド
-W：文字コードの指定
-D：ダンプ形式での実行　※指定なしだとINSERT形式
-I:空間インデックスの作成
-s：座標系の指定　※指定は[EPSGコード](http://d.hatena.ne.jp/tmizu23/20091215/1260868350)

※例

```
shp2pgsql -W cp932 -D -I -s 4612 C:\Work\Postgres\Geodb\Data\japan_ver81.shp japancity > C:\Work\Postgres\Geodb\Query\japancity.sql
```
作成できたら、SQLファイルをテキストエディタで開いてみましょう！
テーブルを作成するCREATE文と、属性を取り込むCOPY文が確認できると思います。

それでは、作成したSQL文をgeodbに流します！

コマンドプロンプトで以下のコマンドを実行します。

```
psql -U （ユーザ名） -d geodb -f （SQLファイルのパス）

```

※コマンド解説※
-f：ファイルからコマンドを読み込み、実行

成功したらデータベースに接続して、SQL文でデータを確認してみましょう！

※例

```
geodb=# select count(*) from japancity;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/6336817a-a4ae-dfd7-4678-fb20843eb173.png)

```
geodb=# select SIKUCHOSON,P_NUM,H_NUM from japancity where KEN = '奈良県';
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/91d6106d-c4f0-ef71-4349-5add4f1a450a.png)

```
geodb=# select SIKUCHOSON,P_NUM,H_NUM from japancity where P_NUM >= 500000 order by P_NUM DESC;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/c6b3ffe2-5f32-d4cf-652e-2dc09ef5e677.png)

PostGISならではの関数を使ってみるのも非常に楽しいですが、まずは一般的なSQL文で取り込んだデータを確認してみました！

#GISアプリケーションとの連携
シェープファイルと同様にGISアプリケーションを使えば、PostGISに取り込んだデータを視覚的に確認することができます。
フリーデスクトップGISである[QGIS](https://qgis.org/ja/site/forusers/download.html)を使って紹介します。

QGISのブラウザ（下図だと右中央）の「PostGIS」を右クリックして「New Connection」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/e020bed0-bd8c-9a21-a980-308e3990a842.png)

「新しいPostGIS接続を作成する」にて接続情報を入力してOKをクリックして接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/e5bd27e7-63ec-0c00-647a-01090f331681.png)

接続に成功すると、先ほど取り込みした「japancity」がブラウザに表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/0b2b6c2c-c136-f2e3-72a5-07c10d1ba5d4.png)

「japancity」をレイヤー画面やマップ画面にドラッグ＆ドロップすると、データが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/62ed70c7-0c6c-777f-0099-0df0b5edadda.png)

このように、データ自体はPostGISで管理しつつも、閲覧はGISアプリケーションで行うことができます。

ちなみにQGISのプロセシングツールにPostGISにデータを取り込むツールも含まれるので、前項のコマンド以外での取り込みは可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/2c0f9d3f-28a6-74d7-d0f6-860ff268399c.png)

もっと言えば、PostGISインストール時に「PostGIS 2.0 Shapefile and DBF Loader Exporter」もインストールされているのと思いますので、こちらを使ってもGUIでPostGISにインストールができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/250196/afd18cbb-5574-4a58-dfd4-9ef4b9cb05a7.png)

#おわりに
PostGISいかがでしたでしょうか！？
EXCELやCSVのデータをDBMSで管理するのと同様、シェープファイルもDBMSで管理することで、一気に利活用の幅が広がりますね！
今回は入門的な内容でしたが、PostGISの機能の紹介も今後していければと思います。