PostGISデータベースを作成する

# はじめに
PostGISからデータを取得して、それをベクトルタイルに変換するということを実施したいのですが、その前段階の準備としてPostGISの理解のために、自身でPostGISデータベースを作成し、簡単にデータ表示等をやってみたいと思います。
私はUdemyの[こちらのコース(英語)](https://www.udemy.com/course/introduction-to-spatial-databases-with-postgis-and-qgis/)で学びましたので、動画で紹介されているやり方を参考にしています。


### PostGISとは？
PostGIS は、地理情報システム（Geographic Information Systems 、GIS）を実現するための PostgreSQL の拡張モジュールです。

### PostgreSQLとは？
PostgreSQL（ポストグレスキューエル）は、オープンソースソフトウェア（OSS）のリレーショナルデータベース管理システム（RDBMS）です。MySQLもオープンソースだが、少し機能が違うらしいです。それに対して、Oracle Databaseは有償です。

### SQLとは？
SQLはデータベースを操作、定義、アクセス制御するためのプログラミング言語です。SQLは国際標準化されているため、さまざまなデータベースで利用可能です。


## 環境
macOS Sonoma 14.6.1（チップ：Apple M3)
zsh 5.9 
PostgreSQL 16.4
PostGIS 3.4.2


# PostGISのインストール
[PostgreSQLのダウンロードページ](https://www.postgresql.org/download/)に行き、ダウンロードします。
セットアップ時にパスワードを設定しますが、ローカルでしか使わない、かつサンプルデータしか扱わないので、「postgres」としました。Portはデフォルトの「5432」とします。その他はデフォルトの設定のままで、PostgreSQLをインストールします。その後続けて、Stack Builderを用いてPostGISをインストールします。

![スクリーンショット 2024-09-16 12.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/9d62f75a-af36-195b-8716-64a527eaa8cb.png)

その他は、デフォルトの設定のままインストールをしました。

※
最初は、Homebrewを使ってインストールした方が管理が楽そうだったので、そうしようと考えていました。[Homebrewのこちらのページ](https://formulae.brew.sh/formula/postgresql@16#default)を見てみると、Apple SiliconのSonomaでも問題ないことは確認しました。しかし、Homebrewを使用してダウンロードしてもアプリケーションフォルダにはPostgreSQLが存在せず、どうしたら良いのか分からなかったので、この方法はあきらめました。


# PostGISの設定
pgAdminとは、PostgreSQLの管理ツールの一つで、ネットワークを通じて遠隔のデータベースサーバをグラフィカルな表示・操作体系（GUI）で管理することができるものです。オープンソースとして公開されています。

pgAdmin4を開いて、Register > Serverで以下のように設定。
General > name: PostgreSQL16
Connection > Host name/address: localhost
Connection > Password: postgres (Save password?をon)

こうすると、PostgreSQL16というサーバが作成されます。これを右クリックして、
Create > Datebase
として、
General > Database: sdb_course
としてsaveし、sdb_courseというデータベースを作成します。動画では、データベース名は小文字で、アンダーバーを使用することが推奨されています。

![スクリーンショット 2024-09-16 13.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/a4f2e66e-6a94-afda-bb3b-51de317b8a38.png)

その後、Query Toolで以下を実行します。

```
CREATE EXTENSION postgis
```

Refreshすると、「Extensions」に「postgis」が加わり、さらにSchemas > public > Functions　にも多くのPostGISの機能が加わっています。

![スクリーンショット 2024-09-16 13.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/732f0cad-ad11-151b-d5a1-2738659f88b4.png)

この関数の中に、今後使用する「ST_AsGeoJSON」も含まれています。

さらにTableにspatial_ref_sysが出来ており、
SELECT * FROM spatial_ref_sys
とすると空間参照（EPSG番号など）が大量に表示されます。

:::note info
Natural Earthのデータも取込みました。
natural_earthという名前でデータベースを作成しました。
:::

# PostGISへのshpデータの取込み
動画で利用されている、sdb_data.zipをPostGISへ取り込みます。まずは、データをローカルに保存します。
その後、以下の通りQGISでデータを表示します。アメリカ中西部辺りのデータです。

![スクリーンショット 2024-09-16 14.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/f3f1a8d0-3184-dc27-a0e5-a76f45c52d14.png)

QGISの中の Browser > PostgreSQLを右クリック > New Connectionとして以下の通り設定します。

![スクリーンショット 2024-09-16 15.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/55142113-f5f8-a396-8f02-fea95491e02e.png)

その後、Database > DB Managerを選択し、Import Layer/Fileをクリックして以下のとおり設定します。EPSGはshpファイルから自動で認識されて4326と設定されている模様です。

![スクリーンショット 2024-09-16 15.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/f53e7a10-b49c-355a-a4c0-abe54fedf937.png)

以下の４つのshpファイルをPostGISにインポートしました。全て、geom属性があります。
〇raptor_nests
点データ
レコード数876

〇baea_nests
点データ
レコード数70

〇linear_projects
線データ
レコード数1109

〇gbh_rookeries
ポリゴンデータ
レコード数55

pgAdmin4を見てみると、データがインポートされたことが確認できます。

![スクリーンショット 2024-09-16 15.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/9c06cb73-11bc-c3db-7053-29645a73aaf6.png)


:::note info
同様に以下のNatural Earthのデータも取込みました。
データベース：natural_earth
スキーマ：public
テーブル：以下の通り
- ne_110m_coastline
- ne_110m_rivers_lake_centerlines
- ne_110m_land
:::


# PostGISデータベースへの接続
ターミナルを使用してPostGISデータベースへの接続を行います。まずは、PostgreSQLに接続するクライアントコマンドであるpsqlのPATHを通します。[こちらの記事](https://reffect.co.jp/windows/full_understanding_mac)を参考にして、PATHを通しました。

その後、ターミナルで以下を記載して、求められるパスワードを入力することでPostGISに接続することが出来ます。
```
psql -U postgres -d sdb_course
```

-h で接続先サーバを、-U でユーザIDを、-d でデータベース名を指定します。psqlコマンドで -h オプションを省略した場合、PostgreSQLはUNIXドメインソケットを使用してローカルマシンに接続します。UNIXドメインソケットでの接続とは、同一マシン上のプロセス間で通信するための特殊な通信方式です。

# PostGISデータベースからのデータ表示
無事にPostGISに接続が出来ると、以下のような表示がされます。

```
sdb_course=# 
```

接続後の表示は以下の２つがあります。
=#　接続したユーザがスーパーユーザであることを示す
⇒　接続したユーザが一般ユーザであることを示す

次に以下のように記載すると、該当テーブルの情報が見られます。最後にセミコロンを付けるのを忘れないようにしてください。セミコロンがないと、コマンドが終わりだと認識されません。

```
sdb_course=# SELECT * FROM baea_nests;
```

![スクリーンショット 2024-09-16 16.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/5a800f3d-f836-b192-523f-25899f069b23.png)

見て分かる通り、PostGISでgeomデータ見ても、バイナリデータなので何も分かりません。geometry field(geom)には、SRID（Spatial Reference ID)、geometry typeなどの情報がバイナリデータとして入っています。

```
SELECT * FROM geometry_columns;
```
とすることで、それぞれのテーブルのSRIDナンバーなどが見られます。

情報の表示が多い時は「q」キーを押すことで、その表示から抜けられます。

:::note info
### psql上でよく使うコマンド
\q : psqlの終了
\du：ユーザーリスト表示
\l：データベースリスト表示
\d : テーブル、インデックス、シーケンス、ビューの一覧を表示
\conninfo : 接続中のデータベースの情報を表示

Mac日本語キーボードの場合、バックスラッシュ「\」の入力方法は、「Option (⌥)」キー を押しながら 「¥」キー を押します。
:::


ちなみに、pgAdmin4でもQuary Toolから「SELECT * FROM baea_nests;」とすればデータを表示することが出来ます。しかし、今後はターミナルを中心に使っていくため、pgAdmin4を使うことは少なそうです。

![スクリーンショット 2024-09-16 16.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/28310830-6ac6-627c-bd51-fc1f4630d0ad.png)


# まとめ
PostGISの理解のために、shpファイルからPostGISデータベースを作成し、データ表示をやってみました。PostGISは地理空間情報業界では広く使わているデータベースだと思うので、今後慣れていきたいと思います。次は、作成したPostGISデータベースを用いて、ベクトルタイルへの変換を試してみます。


# Reference

https://reffect.co.jp/windows/full_understanding_mac

https://e-words.jp/w/pgAdmin.html