0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-24

Db2地理空間分析シリーズ

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

  1. Db2の地理空間分析機能
  2. 地理空間分析機能を有効にする
  3. JGD2011座標系の設定
  4. SHAPEファイルのインポート
  5. 緯度・経度情報をインポート
  6. DBeaverでDb2の地理空間情報を表示してみる
  7. 空間処理変数を使ってみる

前提

「3. JGD2011座標系の設定」が実施済みとします。
未実施の場合は、実施の上、進んでください。

0. 前準備 Docker版Db2 の導入

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

こちらの
Db2 docker から Db2 on CloudのDBに接続
を参考に、無料のDocker版Db2 Community Editionをどこかに導入して使えるようにしておいてください。

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

1.  国土交通省国土数値情報ダウンロードサービスの東京都の行政区域データ

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

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

以下はDb2+DBeaverでの表示例です。
image.png

ただそのまま使えると思いきや、DB2のコマンドのせいかもしれませんが、事前にJGD2011座標系を設定したり、文字コードをUTF8に変換したりの処理が必要です。当記事では変換部分はpythonで行います。
変換後、CLPPlusのIDA LOADGEOSPATIALDATA コマンドでSHAPEファイルの内容をインポートします。

2. 国土交通省国土数値情報ダウンロードサービスから東京都の行政区域データをダウンロード

この内容はこちらのjupyter notebookの2.1から2.3の内容です。

2-1. 国土交通省国土数値情報ダウンロードサービスにアクセスします

国土交通省国土数値情報ダウンロードサービス
https://nlftp.mlit.go.jp/ksj/index.html

2-2. ダウンロード

「2.政策地域」の中の「行政区域(ポリゴン) 」をクリック

image.png

ここにSHAPEファイルの属性情報も載ってます。
image.png

「ダウンロードするデータの選択」 から 東京都をクリック

image.png

東京で一番新しいものをダウンロードしたいところですが、令和4年版はなぜかうまく動かなかったので、令和3年版をダウンロードしてください。
東京 世界測地系 令和3年 14.27MB N03-20210101_13_GML.zip
image.png

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

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

この内容はこちらのjupyter notebookの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ファイル名をパス付きでセット
してから実行してください。

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というコンテナで動作しているとします:
/にコピー

docker cp tokyo.zip mydb2:/

コンテナに入って、

docker exec -ti mydb2 bash 

解凍と誰でも読めるように設定

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でログイン

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名>

コマンド例

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

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

db2 terminate

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

例:

db2 connect to bludb user nishito using xxxxxxx

4.3 docker コンテナ内でShapeファイルをインポートします

db2se import_shapeコマンドを使います

使い方
パラメータ詳細はこちらを参照ください:

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

コマンド例:
以下は

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サンプルは以下になります :

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

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

以上です。

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?