Db2地理空間分析: DBeaverでDb2の地理空間情報を表示してみる

`Db2地理空間分析`シリーズ


当記事は「6. DBeaverでDb2の地理空間情報を表示してみる」です。

1. [Db2の地理空間分析機能](https://qiita.com/nishikyon/items/2f8bc4858e2d54bf9b1a)
1. [地理空間分析機能を有効にする](https://qiita.com/nishikyon/items/4cd0430e4ebb7d541a82)
1. [JGD2011座標系の設定](https://qiita.com/nishikyon/items/fc97391f02b4e9e4bb9c)
1. [SHAPEファイルのインポート](https://qiita.com/nishikyon/items/fd6d166fdbf6523930d4)
1. [緯度・経度情報をインポート](https://qiita.com/nishikyon/items/cf90796a13fa7d2cf769)
1. [**DBeaverでDb2の地理空間情報を表示してみる**](https://qiita.com/nishikyon/items/60e23324b1ec1f65deb5)
1. [空間処理変数を使ってみる](https://qiita.com/nishikyon/items/7eeb7ee541e7d4f76a7f)

# 1. DBeaver
OSSのDB Tool [DBeaver](https://dbeaver.io/)はDb2を含む各種データベースに対してもSQLを発行したり、テーブルの一覧を出したり、いろいろできる便利なツールです。
今回はこの[DBeaver](https://dbeaver.io/)を使ってDb2に空間データタイプの列に入れたデータを地図で表示する方法を説明します。

なお、当記事ではバージョン22.2.1.202209251341を使用しました。

# 2. 前提
### 前提1: データの準備
以下でDb2のテーブルに入れたものを使用します:
- [4. SHAPEファイルのインポート](https://qiita.com/nishikyon/items/fd6d166fdbf6523930d4)
- [5. 緯度・経度情報をインポート](https://qiita.com/nishikyon/items/cf90796a13fa7d2cf769)

### 前提2: DBeaverでDb2への接続作成
前提1で準備したデータの入っているDb2への接続を DBeaverで作成しておきます。
設定方法は[DBeaverからDb2 on Cloudにアクセスする](https://qiita.com/nishikyon/items/d0b0e57b72e0996c331c)を参考にしてください。
SSL接続ではない場合は、[ドライバのプロパティ](https://qiita.com/nishikyon/items/d0b0e57b72e0996c331c#%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%BF%E3%83%96)の`sslConnection`　の設定は不要です。

# 3. SQL準備
空間データタイプの列はバイナリーで情報が入っています。
これを人の読めるWKT形式に変換して、VARCHARにCASTするとDBeaverで表示可能です。

**WKT形式に変換**
 - [ST_AsText 関数](https://www.ibm.com/docs/ja/db2/11.5?topic=sf-st-astext) を使います
     例えば、[4. SHAPEファイルのインポート](https://qiita.com/nishikyon/items/fd6d166fdbf6523930d4)で作成した`CITY_SHAPE`テーブルの`GEO`列は`ST_MultiPolygon`のデータタイプで定義された空間データタイプの属性を持つ列です。これをWKT形式に変換します。
```sql
ST_AsText(GEO) 
```
となります。
さらにVARCHARにCASTします。VARCHARのサイズはWKT形式に変換したときに全ての文字列が入る必要があります。Polygonの場合は長めにしておきます。以下は30000byteとしています。
```sql
CAST(ST_AsText(GEO) AS VARCHAR(30000)) 
```
このように変換して、SELECTで取得するようにSQLを書きます。
例えば、千代田区と中央区と港区の市区町村境界を取得するSQLの例は以下のようになります：
```sql
SELECT OBJECTID ,N03_001 ,N03_002 ,N03_003, N03_004, N03_007, 
CAST(ST_AsText(GEO) AS VARCHAR(30000)) LOC  
FROM CITY_SHAPE WHERE N03_004 IN ('中央区', '千代田区', '港区')；
```
`CAST(ST_AsText(GEO) AS VARCHAR(30000)) `だけSELECTしても良いのですが、属性情報も一緒にSELECTすると、地図上でマウスをクリックするとその情報が表示されるようになるので、表示したい情報も一緒にSELECTします。

# 4. SQLの実行と結果列のformat変更
### 4.1 SQLを実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/41de913c-ea74-2414-5455-a5098e4796a7.png)

### 4.2 結果パネルに表示された空間情報列のformatを変更

空間情報列のformatを`Geometry`にセットします。
ここではLOC列が空間情報列なので、この列のformatを`Geometry`にセットします。

LOC列の列名を右クリックし、
`View/Format`→ `Set "LOC" format`を`Geometry`にセットしてください
(V22.2.3で`View/Format`→ `Set "LOC" transform`になっています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b3f3a547-b138-0e6d-0c38-169d6d1ff995.png)

以下のようなダイアログが出てくるので、「OK」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/62485cb1-7b2c-9083-e321-fee388dea5d5.png)


# 5. Spatialビューの表示

結果パネルの左側「Spatial」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9d176e7c-c43e-27d1-c6e3-150effeca964.png)

地図上にデータがマッピングされました:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9eeedaf4-f397-6d4f-c560-c26b1ef53cf7.png)

拡大表示や結果パネルの最大化も可能ですので、やってみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a25c74ae-5d4f-899c-cde8-669cc0b2145f.png)

地図上のマッピングされたデータのエリアをクリックすると属性情報が吹き出しで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9db484ef-bbc9-024f-3c9b-d36eefdc1ad6.png)

# 6. 同様にPointも表示してみる

[5. 緯度・経度情報をインポート](https://qiita.com/nishikyon/items/cf90796a13fa7d2cf769)で作成した`SHAREBIKE_STATION`テーブルの`GEO`列は`GEO_POINT`のデータタイプで定義された空間データタイプの属性を持つ列です。これをWKT形式に変換し,
VARCHARでCASTしたSQLを作ります。
```sql
SELECT STATION_ID, REGION_ID, CAPACITY, NAME, ADDRESS, URL, COMPANY,
CAST( ST_AsText(GEO_POINT)AS VARCHAR(50) ) AS LOC
FROM SHAREBIKE_STATION;
```
DBeaverで実行して、LOCのformatを`Geometry`にセットし、Spatial　ビューの表示すれば以下のように表示されます.
ただし、DBeaver　のデフォルトFETCHサイズは200ですので、全レコードを表示させたい場合はこのFETCHサイズを変更する必要があります。

日本全体（ちょっと狭いですが）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/66d87fd4-74f1-e45d-62b8-14259fffb4b7.png)

東京付近を拡大し、1個点をクリック：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0ad26081-d383-d8ce-9169-43b988863d43.png)

なお、選択した情報のみ見たい場合は行（またはセル)を選択後「値ビューアー」で見ることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/405d5409-7723-ae59-5b67-9c83f03fdcd1.png)


以上です。