QGISでPostGISのジオメトリデータを表示する

## はじめに
先日、PostGISのインストールが無事完了したため、今回は実際に緯度・経度情報からジオメトリデータを作り、GISソフト上で表示させるところまで試してみたので、その手順をまとめてみた。

## 実行環境
【PC環境-OS】
　　・Windows 10 Pro　

【ソフトウェア-バージョン】
　　・PostgresSQL 10.13
　　・PostGIS 2.5
　　・QGIS 3.10.6

## 今回のやる事

１．PostGISに[geom]カラムを持つテーブルを用意する。
２．QGIS上で背景レイヤとポイント(点)レイヤを作成する。


### １．PostGISに[geom]カラムを持つテーブルを用意する

**■テスト用のスキーマを作成**
今回は pgAdmin4 を使って操作。
下図の様にPostGIS-DB内の『Schemas』を右クリックし、スキーマを作成する。
![Qiita-no005_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/88ca6d0f-066b-6f44-7c3a-dc1093867eec.jpeg)
ポップアップが出てくるので、スキーマ名などを入力して『Save』をクリック。
![Qiita-no005_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/8cc3264d-9163-490f-e4c2-650d1741d33f.jpeg)

今回は『qgis_test』というスキーマを作成。


**■データ・テーブルの用意**

・緯度経度情報が含まれているcsvファイルを用意。
（今回のサンプルとしては[国土交通省のHP](https://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgi)の [平成28年-東京都-街区レベル] のデータの内、カラムもレコードも絞ったものを使用。表記の仕方や緯度経度情報がおかしくなければ自分で適当に作ったものでもOK）
　※一応、インポートしたcsvファイルは[Git](https://github.com/Smiler5617/for_qiita/blob/master/sample_point.csv)にアップロードしている。

・テーブルの用意。

```SQL:

-- 元の緯度経度情報を持ったテーブル（csvファイルインポート先）
CREATE TABLE qgis_test.sample_tb1(
	pref varchar(20) not null
	,city varchar(20) not null
	,address varchar(20) not null
	,lat varchar(100)
	,lon varchar(100)
	,primary key(pref, city, address)
)
;

-- ジオメトリ情報を持ったテーブル
CREATE TABLE qgis_test.sample_tb2(
	pref varchar(20) not null
	,city varchar(20) not null
	,address varchar(20) not null
	,geom Geometry(Point, 4301) not null
	,primary key(pref, city, address)
)
;
```

※緯度・経度情報もVARCHAR型にしたが、計算コストは高くなる。どのくらいの精度を求めるかでdouble型でも良いかも。

もしGeometry型が作成できない場合、空間データベースの機能拡張をする必要があるので、[**こちら**](https://qiita.com/smiler5617/items/7bf8a92be75716c5ca27)の記事を参照。


**■ csvファイルのインポート**
　**【pgAdmin4】**を使って上記のcsvファイルをインポート。
インポートしたいテーブルを選択した状態で右クリックし『Import/Export』を選択。
![Qiita-no005_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/e18c5af2-e139-0648-cd38-b42959600690.jpeg)

『**Import**』に設定し、ファイル＆拡張子形式を選択し、最後にHeaderを『**Yes**』にしたら【OK】ボタンをクリック。
![Qiita-no005_img04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/36bd519b-6f13-c4c7-48d8-15d2a7e4e613.jpeg)
　※1)．pgAdmin4 のツールの問題なのか、Filenameのパスのどこかに全角があるとエラーになる。
　※2)．postgre側の文字コード設定の問題なのか、UTF-8(カンマ区切り)としてcsvファイルを保存しないとインポートでエラーが起きる。

[qgis_test.sample_tb1] にデータが入っている事を確認できたら完了！


**■ ジオメトリ情報を持ったテーブルにデータ投入**
以下クエリを実行。

```SQL:
INSERT INTO qgis_test.sample_tb2

SELECT
	pref
	,city
	,address
--	,lon
--	,lat
	,ST_SetSRID(ST_MakePoint(cast(lon as numeric), cast(lat as numeric)), 4301)
     -- 緯度・経度からGeometory型の位置情報（今回は点の情報）をを算出している。
FROM
	qgis_test.sample_tb1
;
```
※1)．今回は点の位置情報のジオメトリを作成しているが、作成の仕方によって表示スピードが異なるらしい。詳しくは[**こちら**](https://gis.stackexchange.com/questions/58605/which-function-for-creating-a-point-in-postgis)を参考に。
※2)．他にもライン型、ポリゴン型[面]、マルチポリゴン型の表示も [geometory] という１つのカラムで表現することができる。
※3)．今回はテストのため日本測地系（SRID：4301）としたため上記の様なクエリとなっている。測地系についてもっと詳しく知りたい方は[**こちら**](https://boiledorange73.qrunch.io/entries/WQUrnoALXaSeon9R)のサイトを参照。


**■空間インデックスをつける**
以下クエリを実行。
おまじないの様なもの。これを付け忘れると表示にものすごく時間がかかってしまう。

```SQL:
-- 空間インデックスの作成
CREATE INDEX idx_geom on qgis_test.sample_tb2 using GIST(geom);

-- インデックスを削除したい時
DROP INDEX IF EXISTS idx_geom;
```

ここまで完了したらデータの準備は完了！




### ２．QGIS上で背景レイヤとポイント(点)レイヤを作成する。
**■背景レイヤの準備**

・『XYZ Tiles』で右クリックをして【新しい接続】を選択。

・以下の様に任意の名前とURLを入力してグーグルマップを追加する。
![Qiita-no005_img05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/28684cee-5927-4fe2-6d37-4665f0ae039f.jpeg)
※URLの部分は：https://mt1.google.com/vt/lyrs=r&x={x}&y={y}&z={z}


**■背景レイヤの作成**
上記で作成した背景レイヤをダブルクリック or ドラッグ＆ドロップ。

**■点レイヤの作成**
・『PostGIS』で右クリックをして【接続の新規作成】を選択し、先程のテーブルがあるDBの接続情報を登録。

・[qgis_test.sample_tb2] をダブルクリック。
![Qiita-no005_img06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/6fa6d303-48b7-0ee0-53da-2c616a1b134d.jpeg)
下図のようなマーカーが表示されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/93e7df3e-6f61-3b6d-7421-cb17b8c70a6c.png)


## まとめ
今回は緯度・経度情報から最もシンプルな点の位置情報を作成し、QGIS上で表示する手順をまとめました。また時間がある時に、マークの加工方法やポリゴンデータの作成＆表示手順を整理したいと思います。

　【追伸】簡単なマーク加工方法はこちらの記事**【[QGISの基本操作](https://qiita.com/smiler5617/items/eab17b75ab98966622bf)**】にまとめました。