CentOS7にPostGIS2.5.5をインストールする

## はじめに
ちょっと詳細な地図情報を扱う事になって、PostJISを使用することになりました。
色々なインストール方法を見ながら作業していたのですが、ちょっと詰まったとこもあったので備忘録を兼ねて記載します。
## PostGISとは
インストールすると使えるようになる専用のデータ型（ジオメトリ型など）を使用して、緯度や経度、領域などを保存出来るようになります。
これを使って位置情報の計算やGISオブジェクトというのを使用して地図のオブジェクトが扱えるようになります。

詳しくはこちらを参照：
https://lets.postgresql.jp/documents/tutorial/PostGIS/1
## 環境
CentOS 7.6
## PostGISを利用するに必要なもの
PostGISは使うのに色々必要なものがあります。
下記をインストールしていきます。

* PostgreSQL 11
* GEOS 3.7.2
* Proj4 4.8
* GDAL 2.4.0
* PostGIS 2.5.5

## 事前準備
#### PostgreSQL 11 をインストール
先に実際に使用するDBを用意しておきます。

```
### リポジトリをインストール
$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

### PostgreSQLをインストール
$ sudo yum install postgresql11
$ sudo yum install postgresql11-server

### 出来たか確認
$ id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres) 
$  ls /usr/pgsql-11
bin  lib  share

### パスワード設定、2回聞かれるので同じパスワードを入力してあげる
$ sudo su - postgres -c '/usr/pgsql-11/bin/initdb -E UTF8 --locale=C -A scram-sha-256 -W'

### アカウントをpostgresに切り替える
sudo su - postgres

### pgsql_profileを開いて下記を記載する
vi ~/.pgsql_profile
PATH=/usr/pgsql-11/bin:$PATH
MANPATH=/usr/pgsql-11/share/man:$MANPATH
PGDATA=/var/lib/pgsql/11/data
export PATH MANPATH PGDATA

### bash_profileを再読み込みしてからpostgresを抜ける
$ . ~/.bash_profile
$ exit

### postgresql-11を起動する、無事起動出来れば完了
$ sudo systemctl start postgresql-11.service
```

#### その他各種パッケージをインストール
その他にこの後実施する作業を円滑に進めるために必要なパッケージをインストールしておきます。
ご自身の環境によっては既にインストール済みなものをあるかもしれませんが、その際はコマンド飛ばしてください。

```
### wgetを使用可能にする
$ sudo yum install wget
### postgres11が LLVM 関連のパッケージの依存関係で怒られるのを防ぐ
$ sudo yum install epel-release centos-release-scl
### gccのコンパイルを使用可能にする
$ sudo yum install gcc-c++
### 開発用ヘッダファイルとライブラリ
### epel-releaseとcentos-release-sclを入れていないと依存関係でインストール出来ないことがあるのでインストールしておく
$ sudo yum install postgresql11-devel
### XMLを扱うライブラリ
$ sudo yum install libxml2-devel
### python3を使用可能にする
sudo yum install python36
```

## PostGISインストール
事前準備が終わったところでPostGISのインストールをしていきます。
PostGISを利用する為のモジュールをインストールしてからPostGISをインストールしていく流れになります。

####  GEOS 3.7.2をインストール
```
$ cd /tmp/
$ wget http://download.osgeo.org/geos/geos-3.7.2.tar.bz2
$ tar xf geos-3.7.2.tar.bz2
$ cd geos-3.7.2/
$ ./configure
$ make
$ sudo make install
$ cd ../
$ rm -rf geos-3.7.2
```

####  Proj4 4.8をインストール
```
$ sudo yum install proj-devel.x86_64
```

####  GDAL 2.4.0をインストール
```
$ sudo yum install libstdc++.so.6
$ cd /tmp/
$ wget https://download.osgeo.org/gdal/2.4.0/gdal-2.4.0.tar.gz
$ tar xzf gdal-2.4.0.tar.gz
$ cd gdal-2.4.0
$ ./configure
$ make
$ sudo make install
$ cd ../
$ rm -rf gdal-2.4.0
```

####  PostGIS 2.5.5をインストール
```
$ sudo yum install llvm-toolset-7
$ /tmp/
$ wget https://download.osgeo.org/postgis/source/postgis-2.5.5.tar.gz
$ tar xvzf postgis-2.5.5.tar.gz
$ cd postgis-2.5.5
$ ./configure --with-pgconfig='/usr/pgsql-11/bin/pg_config' 
$ make
$ sudo make install
$ cd ../
$ rm -rf postgis-2.5.5
```
PostGISのインストールで./configureのオプションで 「--with-pgconfig='/usr/pgsql-11/bin/pg_config' 」が無いと下記のエラーが発生することがあります。

```
configure: error: could not find pg_config within the current path. You may need to re-run configure with a --with-pgconfig parameter.
```
pg_configが見つからないので指定してくれ～って言われてるのでオプションを設定してあげればOK

####  シンボリックリンクを作る
```
$ ls -l /usr/pgsql-11/lib/libgdal.so.20
```
恐らくですが、「/usr/pgsql-11/lib/libgdal.so.20」は見つからないと思います。
そこで下記でシンボリックリンクを作成してあげます。

```
$ sudo ln -s /usr/local/lib/libgdal.so.20.5.0 /usr/pgsql-11/lib/libgdal.so.20
```
これが無いと、psqlからEXTENSIONを作成する時に下記エラーが起きてしまいます。

```
test_postgis=# CREATE EXTENSION postgis;
ERROR:  could not load library "/usr/pgsql-11/lib/postgis-2.5.so": libgeos_c.so.1: cannot open shared object file: No such file or directory
```

####  共有ライブラリをキャッシュする
最後に共有ライブラリを再度キャッシュします。
その際に「/etc/ld.so.conf」の最後の行に「/usr/local/lib」を記載してください。
これをやっておかないとEXTENSIONを作成する時にまたエラーが起こるかもしれません。

```
$ sudo vi /etc/ld.so.conf
/usr/local/lib　←この行だけ追加する
$ sudo ldconfig
```
これでインストール作業は完了です。

## DB作成
ちゃんとインストール出来たか確認をする為にDBを作成します。
一応postgresql-11を再起動してから作業します。

```
$ sudo systemctl restart postgresql-11.service
### psqlを起動
$ psql -U postgres
### 確認用のテストDBを作成
postgres=# CREATE DATABASE test_postgis;
CREATE DATABASE
postgres=# \c test_postgis
### EXTENSIONを作成
test_postgis=# CREATE EXTENSION postgis;
CREATE EXTENSION
test_postgis=# \dx
                                     List of installed extensions
  Name   | Version |   Schema   |                             Description
---------+---------+------------+---------------------------------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis | 2.5.5   | public     | PostGIS geometry, geography, and raster spatial types and functions
(2 rows)
```
\dxの返り値が上記のような感じになっていれば成功です。

## テストデータ挿入
確かにインストールは出来てるっぽいけど・・・ってなるかもしれないのでデータを投入して確認してみます。

```
### テーブル作成
test_postgis=# CREATE TABLE station_position
(
  id serial PRIMARY KEY,
  station_name varchar(20),
  position geometry
);
CREATE TABLE
### データを挿入
test_postgis=# INSERT INTO station_position (id, station_name, position) VALUES 
(1, '池袋駅', ST_GeomFromText('POINT(139.710911 35.729660)', 4326)),
(2, '渋谷駅', ST_GeomFromText('POINT(139.701647 35.658252)', 4326)),
(3, '東京駅', ST_GeomFromText('POINT(139.767114 35.681437)', 4326));
### データ確認
test_postgis=# SELECT * FROM station_position;
  1 | 池袋駅       | 0101000020E6100000BCEB6CC8BF7661408599B67F65DD4140
  2 | 渋谷駅       | 0101000020E6100000C5CA68E4737661406743FE9941D44140
  3 | 東京駅       | 0101000020E6100000B8C9A8328C78614066A4DE5339D74140
```
投入が出来たら[pgAdmin](https://www.pgadmin.org/)を使ってデータを確認してみましょう。
pgAdminは入っていなければ下記の方の記事が参考になります。
参考URL：[pgAdmin インストール手順
](https://qiita.com/pyon_kiti_jp/items/01d6150e46bd66be29f0)
pgAdminで作ったテーブルの中身を確認しようとすると下記のような画面が見れると思います。
<img width="500" alt="screencapture-127-0-0-1-55572-browser-2020-10-27-22_19_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792294/ddddf555-ae1b-9e98-5774-a0b19b992c31.png">
赤枠で囲んである目みたいなアイコンがあるかと思います。
それをクリックすると「Geometry Viewer」から地図が表示されて、「＋」ボタンを押して拡大していくと東京駅などで青い点が確認出来ます。そこがDBで設定している場所になります。
![screencapture-127-0-0-1-55572-browser-2020-10-27-22_26_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792294/b3d4215f-cd81-d22a-5dde-ed070f9d8316.png)
最後に距離の計算もしてみましょう。
東京駅と池袋駅がどれくらい離れているかを直線距離で計算する関数を使用します。

```
test_postgis=# SELECT ST_Distance( (SELECT position FROM station_position WHERE station_name = '東京駅')::GEOGRAPHY , (SELECT position FROM station_position WHERE station_name = '池袋駅')::GEOGRAPHY, TRUE);
 7382.264423442
```
単位はメートルなので、約7.38kmですかね。
google mapで距離を確認してみると7.36kmになっているので大体あってます。
<img width="400" alt="screencapture-google-co-jp-maps-place-35-7141559-139-7185288-14z-data-4m5-3m4-1s0x60188d5d4043e0dd-0x213775d25d2b034d-8m2-3d35-7295028-4d139-7109001-2020-10-27-21_36_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792294/a13edb00-8dbe-2b67-1358-c9d0d4932ce9.png">

## 最後に
自分でインストールした時あまり資料も見つけられずエラーが出て色々躓いたので誰かの参考になれば幸いです。
## 参考にさせていただいたURL
[PostgreSQL を CentOS にインストールするには](https://qiita.com/tom-sato/items/e1903cb974fb6c6d5664)
https://medium.com/@basstazz3/install-postgis-2-5-to-centos-7-48bd5b261f1a