Db2地理空間分析: SHAPEファイルのインポート

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


当記事は「4. SHAPEファイルのインポート」です。

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)

- - -
# 前提
[「3. JGD2011座標系の設定」](https://qiita.com/nishikyon/items/fc97391f02b4e9e4bb9c)が実施済みとします。
未実施の場合は、実施の上、進んでください。

# 0. 前準備　Docker版Db2  の導入

現状、Db2**サーバー**podにしかないコマンド`db2se import_shape`でしかSHAPEファイルがインポートできません。
尚、このコマンドはDb2 on Cloudに対してはエラーになりますので、実行できません。

こちらの
[Db2 docker から Db2 on CloudのDBに接続](https://qiita.com/nishikyon/items/8b2cbbe3846b75ba5103)
を参考に、無料のDocker版Db2 Community Editionをどこかに導入して使えるようにしておいてください。

またはお手持ちのDb2サーバーがあれば、そこで実行でもOKです。



# 1. 　国土交通省国土数値情報ダウンロードサービスの東京都の行政区域データ
なんと(?)、　国土交通省が行政区域などのSHAPEファイルを作成して公開しています。
これを利用すると、例えば中央区の境界SHAPEデータ(Polygonデータ）などを入手することができます。
当記事ではこの[国土交通省国土数値情報ダウンロードサービス](https://nlftp.mlit.go.jp/ksj/index.html)の東京都の行政区域データをDb2にインポートする方法を説明します。

これを使うと、緯度・経度と中央区の境界を組み合わせて、中央区内の「何かの」一覧などをビジュアルに表示できるようになります（ただしビュジュアルに表示するには別ツールが必要です).

以下はDb2+DBeaverでの表示例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1813aaf2-1858-ade9-eb4d-78b1fbb09477.png)

ただそのまま使えると思いきや、DB2のコマンドのせいかもしれませんが、事前にJGD2011座標系を設定したり、文字コードをUTF8に変換したりの処理が必要です。当記事では変換部分はpythonで行います。
変換後、CLPPlusの[`IDA LOADGEOSPATIALDATA` コマンド](https://www.ibm.com/docs/ja/db2woc?topic=commands-ida-loadgeospatialdata)でSHAPEファイルの内容をインポートします。


# 2. 国土交通省国土数値情報ダウンロードサービスから東京都の行政区域データをダウンロード
この内容は[こちらのjupyter notebook](https://github.com/kyokonishito/Db2_Spatial_Analysis/blob/main/notebooks/Data_Setup.ipynb)の2.1から2.3の内容です。

### 2-1. 国土交通省国土数値情報ダウンロードサービスにアクセスします
国土交通省国土数値情報ダウンロードサービス
https://nlftp.mlit.go.jp/ksj/index.html


### 2-2. ダウンロード
#### 「2.政策地域」の中の「行政区域（ポリゴン） 」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/2a96513f-9f87-f372-2043-a970d95ee03d.png)

ここにSHAPEファイルの属性情報も載ってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e357fb20-7cc3-a40c-2628-7ad3c8eb9457.png)

#### 「ダウンロードするデータの選択」　から　東京都をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c42048f3-bcfd-c305-d469-2ffba61cc989.png)

東京で一番新しいものをダウンロードしたいところですが、令和4年版はなぜかうまく動かなかったので、**令和3年版**をダウンロードしてください。
東京	世界測地系	令和3年	14.27MB	N03-20210101_13_GML.zip
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/bba4aeb5-b24b-b0f3-149a-6b16f2a0936a.png)


ダウンロードしたら、zipファイルを解凍してください。



# 3. SHAPEファイルの文字コード変換

この内容は[こちらのjupyter notebook](https://github.com/kyokonishito/Db2_Spatial_Analysis/blob/main/notebooks/Data_Setup.ipynb)の2.4から2.9の内容です。

---

SHAPEファイル内の文字コードはSJISです。
DbをUTF-8で作成している場合(Db2 Warehouse on CloudのデフォルトはUTF-8)は、文字コードを変換しておきます。

SJISのDbを使用する場合はこのステップは省略できます(おそらく、未確認)。

変換はpythonのgeopandasライブラリで行います。

geopandasのライブラリがない場合は導入してから実施してください。
```
pip install geopandas
```

以下のコードをpythonで実行
`file_path`にSHAPEファイル名をパス付きでセット
`out_path`に変換後のSHAPEファイル名をパス付きでセット
してから実行してください。
```python
import pandas as pd
import geopandas as gpd

file_path = r"./N03-20220101_13_GML/N03-21_13_210101.shp" #SHAPEファイル名をパス付きでセット
geo_df =gpd.read_file(file_path, encoding='shift-jis')


out_path = r"./N03-20220101_13_GML/tokyo.shp" #UTF-8変換後のSHAPEファイル名をパス付きでセット
geo_df.to_file(out_path, encoding='utf-8')
```
上記を実行すると、以下の5つのファイルが作成されます：

`tokyo.cpg`  `tokyo.dbf` `tokyo.prj` `tokyo.shp` `tokyo.shx`

これをまとめて1つのファイルにzipします:
```
zip -r tokyo.zip tokyo.*
```

# 4. SHAPEファイルのインポート
「0. 前準備　Docker版Db2  の導入」で準備したDocker版Db2 を使います。またはDb2サーバー上の実行でもよいです。

### 4.1 docker コンテナに＃3で作成したtokyo.zipをdb2inst1が読める場所にコピー
(Db2サーバー上でも可)
以下`mydb2`というコンテナで動作しているとします:
/にコピー
```shell-session
docker cp tokyo.zip mydb2:/
```
コンテナに入って、
```shell-session
docker exec -ti mydb2 bash 
```
解凍と誰でも読めるように設定
```shell-session
cd /
mkdir tokyo
cd tokyo
unzip ../tokyo.zip
cd ..
chmod o+rx tokyo
chmod o+r tokyo/*.*
exit
```

### 4.2 docker コンテナ内で、nodeとdbを登録
(Db2サーバー上でも可)
mydb2コンテナにdb2inst1でログイン
```shell-session
docker exec -ti mydb2 bash -c "su - db2inst1"
```

コマンド：
`db2 catalog tcpip node <任意のnode名> remote <ホスト名> server <ポート番号> security ssl`

`db2 catalog db <データベース名> as <任意のDB別名> at node <任意のnode名>
`

コマンド例

```sh
db2 catalog tcpip node BLUNODE remote xxxxx.yyyyy.databases.appdomain.cloud server 50001 security ssl
db2 catalog db bludb as bludb at node BLUNODE
```

最後にキャッシュをリフレッシュするため、以下のコマンドを実行します。

```sh
db2 terminate
```

Db2に接続して接続に問題がないことを確認します
`db2 connect to <DB別名> user <userid> using <password>`

例：

```sh
db2 connect to bludb user nishito using xxxxxxx
```
### 4.3 docker コンテナ内でShapeファイルをインポートします

`db2se import_shape`コマンドを使います

使い方
パラメータ詳細は[こちら](https://www.ibm.com/docs/ja/db2/11.5?topic=commands-db2se-import-shape-command)を参照ください:
```
db2se import_shape <DB別名> -userId <userid> -pw <password> -sa 1 -fileName   <shapeファイルのパスと名前> -createTableFlag 1 -srsName GCS_JGD_2011 -tableSchema <テーブルのスキーマ名> -tableName <テーブルの名前> -spatialColumn <空間情報列名> -idColumn OBJECTID -idColumnIsIdentity 1 -commitScope 200 -client 1
```

コマンド例:
以下は
<DB別名>
```
db2se import_shape bludb -userId bluadmin -pw xxxxxxx -sa 1 -fileName   /tokyo/tokyo.shp -createTableFlag 1 -srsName GCS_JGD_2011 -tableSchema bluadmin -tableName CITY_SHAPE -spatialColumn geo -idColumn OBJECTID -idColumnIsIdentity 1 -commitScope 200 -client 1
```

出力例:
```
GSE0000I  The operation was completed successfully.
```





これでロードできました!
上記コマンド例でロードされたテーブルはスキーマ名bluadmin、テーブル名は`CITY_SHAPE`です。

中身を確認するSQLサンプルは以下になります :
```sql
SELECT N03_001, N03_002, N03_004, N03_007, OBJECTID, CAST( ST_AsText(GEO) AS VARCHAR(50) ) AS GEO from CITY_SHAPE FETCH FIRST 10 ROWS ONLY
```

DBeaverでの出力はこんな感じです：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/399e354d-1b33-b170-8dea-a0f6a28badf2.png)

地図での出力は「6. DBeaverで地理空間情報を表示してみる」で説明します。

以上です。