オラクルへの空間データの収容1

ご存知の方も多いかと思いますが、多くのRDBMSには点や線、面などの幾何的なデータを座標系(空間参照系)を付与して収容できます。ネット上ではPostGISの事例が多く紹介されていますが、オラクルでも可能です。
今回は、シェープファイルをオラクルデータベースに収容する方法ご紹介したいと思います。

作業内容の確認と必要物件のダウンロード

今回は、オラクル社の提供するMapBuilderを使ってシェープファイルをオラクルデータに変換します。
MapBuilderは、実行可能なjarファイルの形式で提供されます。
シェープファイルは、国勢調査の小地域を使用します。
早速、必要物件をダウンロードしましょう。

国勢調査の小地域データのダウンロード

以前の記事でも取り扱ったことのある2015年版国勢調査の小地域(町丁・字等別)データを使用します。
ダウンロードは、こちらから行います。以下の画面が表示されますので、東京都全域を指定します。

データの仕様を以下に列挙します。

  • 丁目(小字)までの領域をがポリゴン化
  • 住所名や住所コードを付与
  • 2018年に公開された最新版
  • 選択したデータ
    • データ形式はシェープファイルを選択(KMLなどもあり)
    • データの範囲は東京全域を選択(島しょ部を含む)
    • 座標系は世界測地系の緯度経度を選択(平面直角もあり)

オラクルMapBuilderのダウンロード

次に、MapBuilderをダウンロードします。
ダウンロードは、ここから行います。オラクルのアカウント(無料)が必要ですので、登録してください。
ダウンロード画面は、以下で”Map Builder and Tools”を指定してダウンロードします。

変換作業

変換作業は非常に簡単です。以下の手順で行います。

  1. MapBuilderの起動
  2. オラクルデータベースへの接続
  3. シェープファイルの指定と登録の実行
  4. データの確認

1.MapBuilderの起動
ダウンロードしたMapBuilderの.zipファイルを解凍し、下記ファイルをダブルクリックして実行します。
map_builder-12.2.1.3.0.jar
起動が成功すると、下記画面が表示されます。失敗する場合は、Java(JRE)が導入されていない可能性が高いので、別途導入してください。

2.オラクルデータベースへの接続
[ファイル]、[新規接続]を指定しすると、データベース接続先を求める画面が表示されますので、接続情報を入力し、”接続のテスト”ボタンを押下すると接続のテストが行われます。成功した状態が下記画面となります。

”接続の追加”画面のOKボタンを押下するとデータベースへ接続します。

3.シェープファイルの指定と登録の実行
オラクル接続に成功したら、ダウンロードしたシェープファイル(国勢調査の小地域)を読み込みます。
[ツール]、[シェープファイルのインポート]を選択するとインポート用のウィザード画面が表示されます。

1. インポートの初期画面
[ツール]、[シェープファイルのインポート]を選択するとこの画面が表示されます。
2.インポートするシェープファイルを指定
次に、インポートするシェープファイルを指定します。座標のカラムは、デフォルトでgeometryとなっています。(変更できます)
3.座標系を指定
座標系(EPSGコード)を指定します。オラクルはEPSGコードのことをSRID(Spatial Reference Identifier)と呼びますが、値はEPSGコードと同じです。
今回のデータの座標系は、JGD2000ですので、4612を指定します。
4.定義済みのパラメータ
不明です。スルーして問題ありません。
5.Summary画面
これまでに指定したパラメータが表示されますので、”終了”ボタンを押下します。
6.変換の実行
これで変換が実行されます。
今回のデータは6,010件ですが、約5分で終了します。(ネットワークやサーバーの性能によります)

以上でシェープファイルをオラクルデータベース上のテーブルとして取り込みが完了しました。

動作確認

取り込みが完了したところで動作確認していきましょう。
今回は、SQL*Plusにて確認を行います。
まずは、取り込みにより作成されたデータベースオブジェクトの確認です。SQL*Plusにて、以下のコマンドを実行していきます。

SQL> select tname from tab;
 TNAME
 ————————
 KOKUSEI
SQL> select count(*) from kokusei;
 COUNT(*)
 ————————
 6010
SQL> desc kokusei
 GEOMETRY MDSYS.SDO_GEOMETRY
SQL> select index_name from user_indexes;
 INDEX_NAME
 ————————
 SIDX_KOKUSEI

最初のSQLでテーブルKOKUSEIが確認できました。
次にデータ件数、その次がKOKUSEIテーブルのカラムの確認です。カラム数が多いため割愛していますが、GEOMETRYという型に空間情報が収容されます。
最後のSQLは、索引名の確認ですが、SIDX_KOKUSEIという空間索引が作成されています。
これらの意味は、次回以降解説しますが、今回は”空間データがうまく収容された”とご理解ください。

特定場所の住所検索

次に、特定場所の住所を検索(逆ジオコーディング)してみましょう。
今回のデータでは、番地や号までは検索できませんが、町・丁目までの検索ができます。

SQL>SELECT city_name||s_name FROM kokusei k
WHERE
SDO_CONTAINS(
k.geometry,
sdo_geometry(2001, 4612, sdo_point_type(139.7670944,35.6806302,NULL), NULL, NULL)
) = ‘TRUE’;
CITY_NAME||S_NAME
————————————
千代田区丸の内1丁目

特定住所の隣接住所の検索

次に、先ほどのSQLを副問い合わせにして周辺のポリゴンを検索します。
SQL的には、sdo_touch関数にて辺の接するレコードを取得します。

SQL>select city_name||s_name,geometry from kokusei k2
where sdo_touch( k2.geometry,
(SELECT k.geometry FROM kokusei k
WHERE
SDO_CONTAINS(
k.geometry,
sdo_geometry(2001, 4612, sdo_point_type(139.7670944,35.6806302,NULL), NULL, NULL)
) = ‘TRUE’)
) = ‘TRUE’;

CITY_NAME||S_NAME
————————————-
千代田区皇居外苑
千代田区千代田
千代田区丸の内3丁目
千代田区丸の内2丁目
中央区八重洲1丁目
千代田区大手町2丁目
千代田区大手町1丁目
中央区八重洲2丁目
8行が選択されました。

OpenJUMPのプラグインである”DBQuery”を使って上記SQLを発行し地図表示させると以下のようになります。

まとめ

今回は、シェープファイルをオラクルに取り込む方法を説明しました。
MapBuilderを使えば、お手軽に取り込むことができました。
次回以降は、SQL*LoaderやQGISを使った取り込み方法もご紹介します。
また、今回使用したSQLや空間演算子などの詳細も次回以降説明します。

(参考)OpenJUMP

本当はQGISで行いたかったのですが、私の環境ではオラクル接続が動作しないため仕事でよく使っているOpenJUMP(OSS)を使って確認します。
OpenJUMPは、JTS(GEOSのJava版)などを開発していたカナダのViVid Solutionsという会社が開発していました。特徴は、QGISに比べて動作が軽い点と、すべてJavaで作られている点だと思います。SOURCE FORGEで公開されていて、現在の最新バージョンは1.14.1-r6147(2019.3.14)です。画面は以下のような感じです。