4 空間データのロード

この章では、データベースに空間データをロードする方法(SDO_GEOMETRY型の列を使用した表へのデータの格納を含む)を説明します。

空間データのロードの完了後、データに対して空間索引を作成し、データに対する問合せを実行できます。

データのロード処理には、次の2種類があります。

  • データのバルク・ロード

    大量のデータをデータベースにロードする場合は、この処理方法を使用します。データのロードには、SQL*Loaderユーティリティを使用します。

  • トランザクション挿入操作

    一般的に、この処理は比較的少量のデータをデータベースに挿入する場合に、SQLのINSERT文を使用して行われます。

トピック:

4.1 バルク・ロード

バルク・ロードでは、大量のデータをOracle Databaseにインポートできます。

バルク・ロードは、SQL*Loaderユーティリティを使用して実行します。(SQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください。)

トピック:

4.1.1 SDO_GEOMETRYオブジェクトのバルク・ロード

例4-1は、4つのジオメトリをロードするためのSQL*Loader制御ファイルです。この制御ファイルをSQL*Loaderで使用すると、「空間データの挿入、索引付けおよび問合せの例」でSQL文を使用して挿入されたコーラのマーケットのジオメトリと同じジオメトリがロードされます。

例4-1 コーラのマーケットのジオメトリをバルク・ロードするための制御ファイル

LOAD DATA
INFILE *
TRUNCATE
CONTINUEIF NEXT(1:1) = '#'
INTO TABLE COLA_MARKETS
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS (
mkt_id INTEGER EXTERNAL,
name CHAR,
shape COLUMN OBJECT
(
SDO_GTYPE INTEGER EXTERNAL,
SDO_ELEM_INFO VARRAY TERMINATED BY '|/'
(elements FLOAT EXTERNAL),
SDO_ORDINATES VARRAY TERMINATED BY '|/'
(ordinates FLOAT EXTERNAL)
)
)
begindata
 1|cola_a|
#2003|1|1003|3|/
#1|1|5|7|/
 2|cola_b|
#2003|1|1003|1|/
#5|1|8|1|8|6|5|7|5|1|/
 3|cola_c|
#2003|1|1003|1|/
#3|3|6|3|6|5|4|5|3|3|/
 4|cola_d|
#2003|1|1003|4|/
#8|7|10|9|8|11|/

例4-1に関する注意は、次のとおりです。

  • mkt_id INTEGER EXTERNAL定義内のEXTERNALキーワードは、MKT_ID列に挿入するそれぞれの値(この例では、1、2、3および4)がバイナリ形式ではなく、人間が判読可能な形式の整数であることを意味します。

  • CONTINUEIF NEXT(1:1) = '#'指定によって、各データ行の先頭が番号記号(#)継続文字でないかぎり無視されるため、begindataの後のデータでは、各MKT_ID値の前に空白が1つあります。

例4-2 ポリゴンのバルク・ロードのための制御ファイル

例4-2では、POLY_4PTという表を次のとおり作成したと想定しています。

CREATE TABLE POLY_4PT (GID VARCHAR2(32),
                       GEOMETRY SDO_GEOMETRY);

ASCIIデータは、デリミタ付きの列および次の書式の表制限で固定されている別々の行で構成されているとします。

geometry rows:    GID, GEOMETRY

GEOMETRY列の座標は、ポリゴンを表現しています。データをロードするための制御ファイルを例4-2に示します。

LOAD DATA 
 INFILE *
 TRUNCATE
 CONTINUEIF NEXT(1:1) = '#'
 INTO TABLE POLY_4PT
 FIELDS TERMINATED BY '|'
 TRAILING NULLCOLS (
  GID  INTEGER EXTERNAL,
  GEOMETRY COLUMN OBJECT 
   (
     SDO_GTYPE       INTEGER EXTERNAL, 
     SDO_ELEM_INFO   VARRAY TERMINATED BY '|/' 
       (elements     FLOAT EXTERNAL), 
     SDO_ORDINATES   VARRAY TERMINATED BY '|/' 
       (ordinates    FLOAT EXTERNAL) 
   )
)
begindata
 1|2003|1|1003|1|/
#-122.4215|37.7862|-122.422|37.7869|-122.421|37.789|-122.42|37.7866|
#-122.4215|37.7862|/
 2|2003|1|1003|1|/
#-122.4019|37.8052|-122.4027|37.8055|-122.4031|37.806|-122.4012|37.8052|
#-122.4019|37.8052|/
 3|2003|1|1003|1|/
#-122.426|37.803|-122.4242|37.8053|-122.42355|37.8044|-122.4235|37.8025|
#-122.426|37.803|/

4.1.2 SDO_GEOMETRYオブジェクトの点のみのデータのバルク・ロード

例4-3に、点データを表にロードする制御ファイルを示します。

例4-3 点のみのデータをバルク・ロードするための制御ファイル

LOAD DATA 
 INFILE *
 TRUNCATE
 CONTINUEIF NEXT(1:1) = '#'
 INTO TABLE POINT
 FIELDS TERMINATED BY '|'
 TRAILING NULLCOLS (
  GID      INTEGER EXTERNAL,
  GEOMETRY COLUMN OBJECT 
   (
     SDO_GTYPE       INTEGER EXTERNAL, 
     SDO_POINT COLUMN OBJECT
       (X            FLOAT EXTERNAL, 
        Y            FLOAT EXTERNAL)
   )
)

BEGINDATA
 1| 2001| -122.4215| 37.7862|
 2| 2001| -122.4019| 37.8052|
 3| 2001| -122.426| 37.803|
 4| 2001| -122.4171| 37.8034|
 5| 2001| -122.416151| 37.8027228|

4.2 SQLを使用したトランザクション挿入

Oracle Spatial and Graphでは、標準SQL構文を使用してアクセスまたはロード可能な、標準のOracleの表を使用します。このトピックでは、SDO_GEOMETRY型の列へのトランザクション挿入の例を示します。一般的に、この処理は比較的少量のデータをデータベースに追加する場合に使用されます。

Oracle SQLのINSERT文では、引数の指定は999までに制限されています。そのため、トランザクションのINSERT文でSDO_GEOMETRYコンストラクタを使用して、999要素以上の可変長配列を作成することはできません。ただし、ホスト変数を使用してジオメトリを挿入することは可能で、そのホスト変数は、SDO_ORDINATE_ARRAYに999以上の値を指定したSDO_GEOMETRYコンストラクタで作成可能です。(ホスト変数は、OCI、PL/SQLまたはJavaプログラムの変数です。)

ジオメトリを挿入するプロシージャを作成し、挿入する各ジオメトリに対してそのプロシージャをコールして、ジオメトリのトランザクション挿入を実行します。例4-4では、挿入処理を実行するプロシージャを作成します。

例4-4 トランザクション挿入処理を実行するプロシージャ

CREATE OR REPLACE PROCEDURE
        INSERT_GEOM(GEOM SDO_GEOMETRY)
IS

BEGIN
  INSERT INTO TEST_1 VALUES (GEOM);
  COMMIT;
END;
/

例4-4で作成したプロシージャを使用して、例4-5に示すようなPL/SQLブロック(geomという変数にジオメトリをロードし、プロシージャINSERT_GEOMをコールしてジオメトリを挿入する)でデータを挿入できます。

例4-5 ジオメトリを挿入するプロシージャをコールするPL/SQLブロック

DECLARE
geom SDO_geometry :=
  SDO_geometry (2003, null, null,
          SDO_elem_info_array (1,1003,3),
          SDO_ordinate_array (-109,37,-102,40));
BEGIN
  INSERT_GEOM(geom);
  COMMIT;
END;
/

様々なジオメトリ・タイプを使用したその他の例については、次の例を参照してください。

4.3 空間データのロードおよび検査の推奨手順

データで空間操作を実行する前に、すべてのジオメトリ・データを検査し、検査エラーがあれば修正する必要があります。

空間データをロードおよび検証するための推奨手順は、次のとおりです。

  1. 「バルク・ロード」または「SQLを使用したトランザクション挿入」に示す方法でデータをロードします。
  2. データベースにロードされたすべての空間データに対して、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションまたはSDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTプロシージャを使用します。
  3. 無効な方向や無効なETYPE値またはGTYPE値を持つジオメトリに対して、SDO_MIGRATE.TO_CURRENTを使用してこれらの無効なジオメトリを修正します。
  4. その他の理由で無効になっているジオメトリについては、SDO_UTIL.RECTIFY_GEOMETRYを使用して修正します。

これらのサブプログラムの使用方法の詳細は、そのリファレンス情報を示す項にある使用上の注意を参照してください。