pgAdmin4 v3.3＋PostGISがすごい！

# はじめに
2018/9/6にpgAdmin4 v3.3がリリースされました！
本記事では **新機能（geometry viewer）**について紹介します。

- v3.3の新機能（リリースノート全文は[コチラ](https://www.pgadmin.org/docs/pgadmin4/dev/release_notes_3_3.html)）
  - Feature #1407 - Add a geometry viewer that can render PostGIS data on a blank canvas or various map sources.
  - Feature #3503 - Added new backup/restore options for PostgreSQL 11. Added dump options for ‘pg_dumpall’.
  - Feature #3553 - Add a Spanish translation.

1点目を御覧ください。PostGISデータ向けのビュワーを標準実装したとのこと！これは試さずにはいられないですね！

PostGISとは、GIS（Geographic Information System）つまり、地理情報をPostgreSQL上に格納するためのEXTENSIONです。詳細は Let's Postgres 等で紹介されているので詳しくはそちらをご参照ください。

# 1. Setup
- 環境情報
    - DBサーバ：VirtualBox　CentOS7　PostgreSQL10.5　PostGIS2.4
    - クライアント：Windows10(64bit)　pgAdmin4 v3.3

## 1.1. PostgreSQL10+PostGIS
### 1.1.1. 環境構築
今回の環境では、VirtualBox上でコンテナを立ち上げ、ポートフォワーディングさせて使用します。もちろん、VMに直接環境を構築してもOKです。

参考ですが、以下のような内容を記載すれば、必要なものは入ります。

```dockerfile
# install and setting for PG
ENV PATH /usr/pgsql-10/bin:$PATH
ENV PGDATA /var/lib/pgsql/10/data
RUN set -ex && \
    rpm -ivh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm && \
    yum install -y postgresql10 postgresql10-contrib postgresql10-libs postgresql10-server postgresql10-devel && \
    su -c "initdb -D $PGDATA --no-locale -E utf-8" postgres
# Install PostGIS
RUN yum install -y epel-release.noarch
RUN yum install -y gdal proj proj-devel proj-epsg
RUN yum install -y postgis24_10
```

今回は以下の手順でcontainerを起動させています。

```console
# docker build -t image01 -f Dockerfile.03_pg10_postgis .
...（略）...
# docker run -d --privileged --net=dnw01 --ip=192.168.1.100 -p 15432:5432 --name contener01 image01 /sbin/init
f2e2ca915c41b01fde29a27e563fd554e044ce81d8ab4431b4a6955a383e9b63
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
f2e2ca915c41        image01             "/sbin/init"        38 minutes ago      Up 38 minutes       0.0.0.0:15432->5432/tcp   contener01
```

### 1.1.2. PostGISを有効にする
yumで入れただけではPostgreSQL上でPostGISは有効にはなりません。
以下、PostGISを有効にして、GISのサンプルデータを入力するまでの手順を記載します。

```console
// PG10起動
[postgres@f2e2ca915c41 ~]$ pg_ctl -D 10/data start
waiting for server to start....2018-09-11 23:53:13.499 JST [140] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2018-09-11 23:53:13.499 JST [140] LOG:  listening on IPv6 address "::", port 5432
2018-09-11 23:53:13.501 JST [140] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2018-09-11 23:53:13.504 JST [140] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2018-09-11 23:53:13.514 JST [140] LOG:  redirecting log output to logging collector process
2018-09-11 23:53:13.514 JST [140] HINT:  Future log output will appear in directory "log".
 done
server started

// PostGISを有効にする
[postgres@f2e2ca915c41 ~]$ psql postgres -c "CREATE EXTENSION postgis"
CREATE EXTENSION

// PostGISのバージョン確認
[postgres@f2e2ca915c41 ~]$ psql postgres -c "SELECT postgis_version()"
            postgis_version            
---------------------------------------
 2.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
```

### 1.1.3. 動作確認
サンプルデータを入力し、PostgreSQLに地理データが格納できるか確認します。
サンプルとして、best_placeテーブルを作成し、POINT型のデータを1点追加しています。

```console
// best_placeテーブルを作成
[postgres@f2e2ca915c41 ~]$ psql postgres -c "CREATE TABLE best_place (id int primary key);"
CREATE TABLE

// best_placeテーブルにPOINT型のカラムを追加
[postgres@f2e2ca915c41 ~]$ psql postgres -c "SELECT addGeometryColumn('best_place', 'fp', 4326, 'POINT', 2);"
                 addgeometrycolumn                 
---------------------------------------------------
 public.best_place.fp SRID:4326 TYPE:POINT DIMS:2 
(1 row)

// サンプルデータとしてある座標を挿入
[postgres@f2e2ca915c41 ~]$ psql postgres -c "INSERT INTO best_place VALUES (1, ST_GeomFromText('POINT(139.697800 35.270089)',4326));"
INSERT 0 1
```

参照してみると、ちゃんとデータが入っていることは確認できます。

```console
[postgres@f2e2ca915c41 ~]$ psql postgres -c "SELECT * FROM best_place;"
 id |                         fp                         
----+----------------------------------------------------
  1 | 0101000020E6100000C364AA60547661403201BF4692A24140
(1 row)
```

これで下準備は完了です。
いよいよメインディッシュ！

## 1.2. pgAdmin4
今回の環境では、ホストマシンからVM上で起動しているPostgreSQLにアクセスさせるので、Windows10にインストールします。ダウンロード先は[コチラ](https://www.pgadmin.org/download/)

### 1.2.1. インストール
環境に合わせてポチポチしていく。
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/e98ea19b-6047-bfdf-f031-a2ac8d5a971b.png)

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/d2a79486-0cdd-3ce9-e809-a19b95edc7a3.png)

インストーラーをダウンロードできるので、内容に従ってポチポチしていくとrebootを求められるのでVMを落として再起動しましょう。

pgAdminを起動するとこのような画面になります。
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/471676ac-d815-0cd1-f61b-f47f67f176f8.png)

### 1.2.2. PostgreSQLへの接続
Seversを右クリックし、Server...をクリックします。
![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/9ef20ae8-0b98-006e-0be7-c54381ebc700.png)

すると、Serverのプロパティウィンドウが出力されるので、適宜必要事項を埋めます。不足があれば、pgAdminから怒られます。
今回の環境ではVMが192.168.56.1で動いており、Containerの5432ポートとは15432でフォワーディングしているので以下のような設定になります。
![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/1ab91e3a-a6a5-f281-ebcb-94ddf116524d.png)

以下のようにDBが追加されていることが確認できればOKです。
![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/8563b6cb-a8ff-4fdf-5f87-a99b945362e7.png)

ちなみにグループ化されている項目を開いていくと先程作成したbest_placeテーブルとカラムの情報も確認できます。
![07.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/767f6acd-ed4a-98a1-d33c-191fb215df3b.png)


# 2. 新機能のちから
「1.1.3. 動作確認」で入力した情報をpgAdminから確認することで新機能を確かめられます。

pgAdmin4のタブ「Tools」から「Query Tool」を選択します。
![08.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/a11cf01a-41eb-9054-e21c-e01c37b418b0.png)

先程、実行したクエリ "SELECT * FROM best_place;"をここで実行します。F5か図の稲妻マークをクリックすることで実行できます。
![09.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/9df90154-9b65-b694-7472-32d628c2bb40.png)

実行結果が下のウィンドウに出力されます。新機能はカラム名の横の「目のマーク」をクリックすることで使用することができます。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/e17a1a68-630b-d12c-7f10-f8b98ae7db9b.png)

ドンッ！！
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/06825e8a-7ea8-5570-b08b-bf809d15964e.png)

Geometry Viewerタブが開かれ、さきほどプロットした点をOpenStreetMap背景上に表示してくれます。
これまではPostGISのデータを描画する際は描画用のソフトウェア（QGIS等）を別途利用する必要がありましたが、pgAdminだけでできるようになってしまいました！

# さいごに
今回は新機能紹介ということで、これで終わります。
pgAdminはこれまであまり使うことがなかったので、試す良いきっかけになりました。せっかくなので、いろいろ試してみようと思います。


ちなみにプロットした場所は・・・
![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/125929/83b068e2-b0ec-a536-d3ad-8c5a419d64ac.png)
鯛が釣れるポイントでした。（釣れたことがあるとは言っていない）
ぜひ、釣りに行くときはPostgreSQL10+PostGIS+pgAdmin4を持参してみてください。