30 SDO_PC_PKGパッケージ(点群)

MDSYS.SDO_PC_PKGパッケージには、点群の使用をサポートするサブプログラムが含まれています。

このパッケージのサブプログラムを使用するには、点群を使用したソリッドのモデル化など、3次元のジオメトリに関する主な概念を理解しておく必要があります。3次元ジオメトリのサポートについては「3次元の空間オブジェクト」、点群を使用したソリッドのモデル化については「ソリッドのモデル化」、点群に関連するデータ型については「点群に関連するオブジェクト型」を参照してください。

ノート:

SDO_PC_PKGサブプログラムは、Oracle Autonomous Databaseサーバーレス・デプロイメントでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、Oracle Autonomous Databaseサーバーレスの使用Oracle Javaの使用で詳細を参照してください。

30.1 SDO_PC_PKG.CLIP_PC

構文

SDO_PC_PKG.CLIP_PC(
     inp           IN SDO_PC, 
     ind_dim_qry   IN SDO_GEOMETRY, 
     other_dim_qry IN SDO_MBR, 
     qry_min_res   IN NUMBER, 
     qry_max_res   IN NUMBER, 
     blkno         IN NUMBER DEFAULT NULL, 
     include_custom_dims IN NUMBER DEFAULT 0 
     ) RETURN SDO_PC_BLK_TYPE;

説明

点群に対してクリップ操作を実行します。

パラメータ

inp

クリップ操作を実行する点群を指定します。

ind_dimqry

点群の索引付けされた次元の問合せについて、戻されるオブジェクトを選択するウィンドウを指定します。通常、2次元ジオメトリの場合はポリゴン、3次元ジオメトリの場合は錐台となります。

other_dimqry

点群の索引付けされていない次元の問合せについて、戻されるオブジェクトを選択するウィンドウを指定します。通常、2次元ジオメトリの場合はポリゴン、3次元ジオメトリの場合は錐台となります。索引付けされていない次元とは、総次元には含まれているが、索引付けされていない次元です。索引次元および総次元の説明は、SDO_PC_PKG.INITファンクションのpc_tot_dimensionsパラメータの説明を参照してください。

SDO_MBR型は(LOWER_LEFT SDO_VPOINT_TYPE, UPPER_RIGHT SDO_VPOINT_TYPE)として定義され、SDO_V_POINT_TYPEはVARRAY(64) OF NUMBERとして定義されます。

qry_min_res

最小解像度の値を指定します。解像度がqry_min_res以上およびqry_max_res以下のqryのオブジェクトがクリップ操作により戻されます。

qry_max_res

最大解像度の値を指定します。解像度がqry_min_res以上およびqry_max_res以下のqryのオブジェクトがクリップ操作により戻されます。

blkid

クリップ操作によって戻されるオブジェクトを制限するブロックのブロックID番号を指定します。このパラメータがNULLの場合、他のパラメータを満たすすべてのオブジェクトが戻されます。

include_custom_dims

数値0または1で、SDO_PCのPC_TOT_DIMENSIONSの個数に含まれる、通常(NUMBER型)の次元のみを含むファンクションによって点群ブロックが戻されるかどうかを指定します。このような通常の次元のみを戻す場合は、include_custom_dims=0(デフォルト)です。ブロック表に格納された点群ブロックには、その他のカスタム次元が含まれたままですが、この個々のCLIP_PC問合せはこれらを戻しません。

include_custom_dims=1では、通常の次元とカスタムの次元の両方が含まれます。

カスタムの次元の詳細は、「使用上のノート」を参照してください。

使用上のノート

このファンクションは、指定した問合せウィンドウ内にあり、かつパラメータによって指定されている他の要件を満たしている点群の点を戻します。一般に、このファンクションは点群に対して問合せを実行するために使用します。点群の問合せのパフォーマンスを最大にするには、ファンクションが操作に対して考慮する必要のあるオブジェクトの数を最小限にします。

SDO_PCおよびSDO_PC_BLK_TYPEデータ型については、「点群に関連するオブジェクト型」を参照してください。

このファンクションは、カスタム次元の格納と問合せをサポートします。カスタム次元は、NUMBER型の場合とそれ以外の型の場合があり、SDO_PCのPC_TOT_DIMENSIONSの個数には含まれません。include_custom_dims=1を指定すると、カスタム次元を問合せ結果に含めることはできますが、カスタム次元は数値型ではない(ind_dimqryother_dimqryの数値インタフェースで表現できない)ため、ind_dimqryパラメータとother_dimqryパラメータのいずれの問合せ制約にも含まれません。

カスタムの次元はSDO_PC_PKG.CREATE_PCプロシージャでは作成できません。

このファンクションをSDO_PC_PKG.CLIP_PC_FLATと比較すると、このファンクションは、平面表に格納された点群データを入力として使用します(SDO_PCオブジェクトとは逆)。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、点群に対してクリップ操作を実行します。これは、Oracle Database Examplesメディアからすでにファイルをインストールしている場合は、$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlから取得できます(『Oracle Database Examplesインストレーション・ガイド』を参照)。

. . .
declare
  inp  sdo_pc;
begin
  select pc INTO inp  from base where rownum=1;
  insert into restst
    select * from
      table(sdo_pc_pkg.clip_pc
           (
            inp,  -- Input point cloud object
            sdo_geometry(2003, 8307, null,
              sdo_elem_info_array(1, 1003, 3),
              sdo_ordinate_array(-175.86157, -14.60521, 0,0)), -- Query 
              null, null, null));
end;
/
. . .

30.2 SDO_PC_PKG.CLIP_PC_FLAT

構文

SDO_PC_PKG.CLIP_PC_FLAT(
     geometry       IN SDO_GEOMETRY, 
     table_name     IN VARCHAR2, 
     tolerance      IN NUMBER, 
     other_dim_qry  IN SDO_MBR, 
     mask           IN VARCHAR2 DEFAULT NULL 
     ) RETURN REF CURSOR;

説明

点群データが平面表に格納された、平面形式の点群でクリップ操作を実行します。

パラメータ

geometry

クリップ・ウィンドウとして使用する2次元ジオメトリです。たとえば:

geometry =>
  SDO_GEOMETRY(
    2003,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1, 1003, 3),
    SDO_ORDINATE_ARRAY(
      0.75, 0.75,
      1.25, 1.25))
table_name

点群データを含む表またはビューの名前を指定します。表またはビューの最初の2つの列は、XおよびYという名前で、Oracle NUMBER型にする必要があります。オプションで、XおよびYに続いて、表またはビューにはNUMBER型のZ列と、その他の非空間の点群属性を含めることができます。その他の非空間の点群属性は、任意のデータ型を持つことができますが、other_dim_qryパラメータの制約として指定する場合は、Oracle NUMBER型にする必要があります。

tolerance

点群のオブジェクトの許容差を指定します(空間許容差の詳細は、「許容差」を参照してください)。このパラメータがNULLの場合、デフォルト値は0.0000000000005です。

other_dim_qry

Oracle NUMBER型の任意の列(X列とY列を除く)に対する、ユーザー定義の問合せ範囲を提供する最小境界矩形(MBR)を指定します。

SDO_MBR型は(LOWER_LEFT SDO_VPOINT_TYPE, UPPER_RIGHT SDO_VPOINT_TYPE)として定義され、SDO_V_POINT_TYPEはVARRAY(64) OF NUMBERとして定義されます。

問合せ範囲で制約されない、Oracle NUMBER型の列に対しては、SDO_V_POINT_TYPE配列にNULLを指定します。

mask

ポリゴンと相互作用する点に適用可能な位相関係を指定します。有効な値は'mask=<value>'で、<value>SDO_RELATE演算子に対して有効な1つ以上のマスク値(TOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSANYINTERACTON)です。近似チェックを実行するFILTERも指定できます。FILTERは、ポリゴンと交差するすべての候補と、その他のいくつかのものを戻します。論理ブール演算子ORを使用して、'mask=inside+touch'のように複数のマスクを組み合せることができますが、FILTERは他のマスクと組み合せることはできません。

このパラメータがNULLであるか、または空の文字列を含む場合、mask=ANYINTERACTであるとみなされます。

使用上のノート

このファンクションは、SDO_PCオブジェクトに格納された入力点群データを使用するSDO_PC_PKG.CLIP_PCとは異なり、平面形式の点群を使用できます。SDO_PCの代替として、ハードウェア環境と使用方法に応じて、平面形式が点群サポートに追加されました。平面形式の利点の1つは、その動的な性質で、点データに対する更新であるため、再ブロック化を必要としません。

Exadata以外の環境では、X列とY列に対して複合Bツリー索引を作成することを強くお薦めします。複合Bツリー索引には、other_dim_qryパラメータに対して記述されているユーザー定義の問合せ範囲で制約される他のOracle NUMBER列も含めます。点群データの更新があると、自動的にBツリー索引が更新されます。

このファンクションをSDO_PC_PKG.CLIP_PCと比較すると、このファンクションは、SDO_PCオブジェクトに格納された点群データを入力として使用します。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。この項には、点群データを格納するためのSDO_PCと平面表のアプローチの説明があります。

次の例では、INPPTABという名前の表の最初の3つの列からINPTAB2という名前のビューを作成します。次に、点群データに対してクリップ操作を実行します。

CREATE VIEW inptab2 AS (select x x, y y, z z from inptab);
 
DECLARE
  my_cursor sys_refcursor;
  TYPE rec IS RECORD(x NUMBER, y NUMBER, z number);
  TYPE lst IS TABLE OF rec;
  result_list lst;
BEGIN
  my_cursor :=
    SDO_PC_PKG.CLIP_PC_FLAT(
      geometry =>
        MDSYS.SDO_GEOMETRY(
          2003,
          NULL,
          NULL,
          MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 3),
          MDSYS.SDO_ORDINATE_ARRAY(
            0.75, 0.75,
            1.25, 1.25)),
      table_name    => 'INPTAB2',
      tolerance     => 0.05,
      other_dim_qry => null,
      mask          => null);
 
  FETCH my_cursor BULK COLLECT INTO result_list;
  FOR I in 1 .. result_list.COUNT LOOP
    dbms_output.put_line(
      '(' || result_list(i).x || ', ' ||
             result_list(i).y || ', ' ||
             result_list(i).z || ')');
  END LOOP;
  CLOSE my_cursor;
END;
/

30.3 SDO_PC_PKG.CLIP_PC_FLAT_STRING

構文

SDO_PC_PKG.CLIP_PC_FLAT_STRING(
     geometry       IN SDO_GEOMETRY, 
     table_name     IN VARCHAR2, 
     tolerance      IN NUMBER, 
     other_dim_qry  IN SDO_MBR, 
     mask           IN VARCHAR2 DEFAULT NULL,
     dop            IN NUMBER DEFAULT NULL,
     sdo_level      IN NUMBER DEFAULT 4,
     sdo_ntiles     IN NUMBER DEFAULT 100
     ) RETURN CLOB;

説明

点群データが平面表に格納された、平面形式の点群でクリップ操作を実行するSQL問合せ文字列を生成します。問合せは実行されませんが、その後の実行または検査のために単に生成されます。

パラメータ

geometry

クリップ・ウィンドウとして使用する2次元ジオメトリです。たとえば:

geometry =>
  SDO_GEOMETRY(
    2003,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1, 1003, 3),
    SDO_ORDINATE_ARRAY(
      0.75, 0.75,
      1.25, 1.25))
table_name

点群データを含む表またはビューの名前を指定します。表またはビューの最初の2つの列は、XおよびYという名前で、Oracle NUMBER型にする必要があります。オプションで、XおよびYに続いて、表またはビューにはNUMBER型のZ列と、その他の非空間の点群属性を含めることができます。その他の非空間の点群属性は、任意のデータ型を持つことができますが、other_dim_qryパラメータの制約として指定する場合は、Oracle NUMBER型にする必要があります。

tolerance

点群のオブジェクトの許容差を指定します(空間許容差の詳細は、「許容差」を参照してください)。このパラメータがNULLの場合、デフォルト値は0.0000000000005です。

other_dim_qry

Oracle NUMBER型の任意の列(X列とY列を除く)に対する、ユーザー定義の問合せ範囲を提供する最小境界矩形(MBR)を指定します。

SDO_MBR型は(LOWER_LEFT SDO_VPOINT_TYPE, UPPER_RIGHT SDO_VPOINT_TYPE)として定義され、SDO_V_POINT_TYPEはVARRAY(64) OF NUMBERとして定義されます。

問合せ範囲で制約されない、Oracle NUMBER型の列に対しては、SDO_V_POINT_TYPE配列にNULLを指定します。

次に例を示します。

other_dim_qry => MDSYS.SDO_MBR(
                   SDO_VPOINT_TYPE(10, 81),
                   SDO_VPOINT_TYPE(11, 82))

3番目の値(xおよびyは最初と2番目)は10から11の間であることを意味します。4番目の値は81から82の間になります。

mask

ポリゴンと相互作用する点に適用可能な位相関係を指定します。有効な値は'mask=<value>'で、<value>SDO_RELATE演算子に対して有効な1つ以上のマスク値(TOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSANYINTERACTON)です。近似チェックを実行するFILTERも指定できます。FILTERは、ポリゴンと交差するすべての候補と、その他のいくつかのものを戻します。論理ブール演算子ORを使用して、'mask=inside+touch'のように複数のマスクを組み合せることができますが、FILTERは他のマスクと組み合せることはできません。

このパラメータがNULLであるか、または空の文字列を含む場合、mask=ANYINTERACTであるとみなされます。

dop

クリップ操作の並列度。これは生成されたSQL文に表示される場合があります。たとえば、select /*+ PARALLEL ( 16 )*/ * from "LIDAR_DATA" …

sdo_level

四本木分割のレベルを指定します。1から5の値が一般的で、4がデフォルトです。これは生成されるタイルに影響します。たとえば、(x >= 2.2500000125 and x < 2.500000025 and y >= 2.12500000625 and y < 2.7500000375)

sdo_ntiles

生成するタイルの最大数を指定します。1から200の値が一般的で、100がデフォルトです。これは生成されるタイルに影響します。

使用上のノート

このファンクションは、次の点を除いてSDO_PC_PKG.CLIP_PC_FLATファンクションに類似しています。

  • 問合せは実行せず、SQL問合せ文字列を単に生成します。
  • sdo_levelおよびsdo_ntilesパラメータによる詳細なチューニング機能が用意されています。ほとんどの問合せでは、sdo_level=1およびsdo_ntiles=10の値が最適です。

SDO_PC_PKG.CLIP_PC_FLATの「使用上のノート」も参照してください。

次の例では、X、Y、AおよびVAL (なんらかの値)の列があるLIDAR_DATAという表を作成します。次に、点群でクリップ操作のSQL文を生成し、その後に(個別の文で)実行します。

SQL> create table lidar_data(x number, y number, z number, val number);

Table created.

SQL> 
SQL> begin
  2    for y in 1..1024 loop
  3      for x in 1..1024 loop
  4        insert into lidar_data (x, y, z, val) values (x, y, x + y, x * y);
  5      end loop;
  6    end loop;
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT
  2    sdo_pc_pkg.clip_pc_flat_string (
  3      geometry      => SDO_GEOMETRY(
  4                         2003,
  5                         8307,
  6                         NULL,
  7                         SDO_ELEM_INFO_ARRAY(1, 1003, 1),
  8                         SDO_ORDINATE_ARRAY(
  9                           1, 1,
 10                           2, 1,
 11                           2, 2,
 12                           3, 2,
 13                           3, 3,
 14                           1, 3,
 15                           1, 1)),
 16      table_name    => 'LIDAR_DATA',
 17      tolerance     => .00000005,
 18      other_dim_qry => MDSYS.SDO_MBR(
 19                         SDO_VPOINT_TYPE(0, 0),
 20                         SDO_VPOINT_TYPE(1000, 1000000)),
 21      mask          => 'FILTER',
 22      dop           => 16,
 23      sdo_level     => 4,
 24      sdo_ntiles    => 100) "Query"
 25  FROM
 26    dual;

Query
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
select  /*+ PARALLEL ( 16 )*/ * from "LIDAR_DATA" WHERE  (
  (x >= 1.2499999625 and x <  1.37499996875 and y >= 1.2499999625 and y <  2.7500000375) OR
  (x >= 2.7500000375 and x <  2.87500004375 and y >= 2.12500000625 and y <  2.87500004375) OR
  (x >= 1.37499996875 and x <  1.499999975 and y >= 1.2499999625 and y <  2.7500000375) OR
  (x >= 2.2500000125 and x <  2.500000025 and y >= 2.12500000625 and y <  2.7500000375) OR
  (x >= 2.500000025 and x <  2.7500000375 and y >= 2.12500000625 and y <  2.7500000375) OR
  (x >= 1.12499995625 and x <  1.87499999375 and y >= 1.12499995625 and y <  1.2499999625) OR
  (x >= 1.7499999875 and x <  2 and y >= 2.12500000625 and y <  2.7500000375) OR
  (x >= 1.12499995625 and x <  1.2499999625 and y >= 1.2499999625 and y <  2.87500004375) OR
  (x >= 2 and x <  2.2500000125 and y >= 2.12500000625 and y <  2.7500000375) OR
  (x >= 1.7499999875 and x <  1.87499999375 and y >= 1.2499999625 and y <  2.12500000625) OR
  (x >= 1.2499999625 and x <  2.7500000375 and y >= 2.7500000375 and y <  2.87500004375) OR
  (x >= 1.499999975 and x <  1.62499998125 and y >= 1.2499999625 and y <  2.7500000375) OR
  (x >= 1.62499998125 and x <  1.7499999875 and y >= 1.2499999625 and y <  2.7500000375))  AND ( "Z" BETWEEN 0 AND 1000 )  AND ( "VAL" BETWEEN 0 AND 1000000 )   UNION ALL select  * from "LIDAR_DATA" W
HERE  (
  (x >= .99999995 and x <  1.87499999375 and y >= .99999995 and y <  1.12499995625) OR
  (x >= .99999995 and x <  1.12499995625 and y >= 1.12499995625 and y <  2.87500004375) OR
  (x >= .99999995 and x <  2.87500004375 and y >= 2.87500004375 and y <  3.0000000500000001402157) OR
  (x >= 2 and x <  2.12500000625 and y >= .99999995 and y <  1.87499999375) OR
  (x >= 1.87499999375 and x <  2 and y >= .99999995 and y <  2.12500000625) OR
  (x >= 2.87500004375 and x <  3.0000000500000001402157 and y >= 1.87499999375 and y <  3.0000000500000001402157) OR
  (x >= 2 and x <  2.87500004375 and y >= 2 and y <  2.12500000625) OR
  (x >= 2 and x <  2.87500004375 and y >= 1.87499999375 and y <  2))  AND ("Z" BETWEEN 0 AND 1000 )  AND ("VAL" BETWEEN 0 AND 1000000 )


1 row selected.

SQL> 
SQL> declare
  2    stm varchar2(4096);
  3  begin
  4    SELECT
  5      sdo_pc_pkg.clip_pc_flat_string (
  6        geometry      => SDO_GEOMETRY(
  7                           2003,
  8                           8307,
  9                           NULL,
 10                           SDO_ELEM_INFO_ARRAY(1, 1003, 1),
 11                           SDO_ORDINATE_ARRAY(
 12                             1, 1,
 13                             2, 1,
 14                             2, 2,
 15                             3, 2,
 16                             3, 3,
 17                             1, 3,
 18                             1, 1)),
 19        table_name    => 'LIDAR_DATA',
 20        tolerance     => .00000005,
 21        other_dim_qry => MDSYS.SDO_MBR(
 22                           SDO_VPOINT_TYPE(0, 0),
 23                           SDO_VPOINT_TYPE(1000, 1000000)),
 24        mask          => 'FILTER',
 25        dop           => 16,
 26        sdo_level     => 4,
 27        sdo_ntiles    => 100) "Query"
 28    into
 29      stm
 30    FROM
 31      dual;
 32  
 33    execute immediate 'create table result as (' || stm || ')';
 34  end;
 35  /

PL/SQL procedure successfully completed.

SQL> 
SQL> select * from result order by x, y;

         X          Y          Z        VAL
---------- ---------- ---------- ----------
         1          1          2          1
         1          2          3          2
         1          3          4          3
         2          1          3          2
         2          2          4          4
         2          3          5          6
         3          2          5          6
         3          3          6          9

8 rows selected.

SQL> 
SQL> drop table result;

Table dropped.

SQL> drop table lidar_data;

Table dropped.

SQL> SQL> 

30.4 SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES

構文

SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES(
     pc                  IN SDO_PC, 
     sampling_resolution IN NUMBER, 
     elevations          IN SDO_ORDINATE_ARRAY, 
     region              IN SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY_ARRAY;

または

SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES(
     pc_flat_table       IN VARCHAR2,
     srid                IN NUMBER, 
     sampling_resolution IN NUMBER, 
     elevations          IN SDO_ORDINATE_ARRAY, 
     region              IN SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY_ARRAY;

または

SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES(
     pc                  IN SDO_PC, 
     sampling_resolution IN NUMBER, 
     elevations_min      IN NUMBER, 
     elevations_interval IN NUMBER, 
     elevations_max      IN NUMBER, 
     region              IN SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY_ARRAY;

または

SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES(
     pc_flat_table       IN VARCHAR2, 
     srid                IN SDO_PC, 
     sampling_resolution IN NUMBER, 
     elevations_min      IN NUMBER, 
     elevations_interval IN NUMBER, 
     elevations_max      IN NUMBER, 
     region              IN SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY_ARRAY;

説明

点群の輪郭線を生成します。

パラメータ

pc

輪郭線を生成する点群オブジェクトを指定します。

sampling_resolution

点群の座標参照系内のグリッド・セルの高さおよび幅を決定する数値を指定します。数値が小さいほど、結果の輪郭ジオメトリは詳細になります。

輪郭生成のプロセスはグリッドベースです。グリッド・セル内の点は平均化されます。これは次のことを意味します。

  • グリッド・セルが同じ平均となるかぎりは、少しだけ異なる2つの点群は同じ輪郭になる場合があります。

  • 輪郭線の頂点の数と円滑さは解像度に直接作用します。

elevations

輪郭を生成する標高の配列を指定します。

elevations_min

輪郭を生成する対象の等距離の標高のセット内の開始標高値。

elevations_interval

輪郭を生成する際、elevations_minelevations_maxの間の標高値に使用する間隔。

たとえば、elevations_minが100、elevations_maxが150、elevations_intervalが10の場合、標高100、110、120、130、140および150について輪郭が生成されます。

elevations_max

輪郭を生成する対象の等距離の標高のセット内の終了標高値。

region

輪郭を生成するリージョンを制限するウィンドウ(点群のエクステント内)を指定します。

使用上のノート

このファンクションは、SDO_GEOMETRY輪郭の配列を戻します。配列内の輪郭の順序は、elevations入力パラメータまたはelevations_minelevations_maxおよびelevations_interval入力パラメータに基づいて算出された値内の順序と同じです。個々の輪郭は複数線ストリングです。

より高い標高を含む輪郭は(外部の輪と同じ)反時計回りです。より低い標高を含む輪郭は(内部の輪と同じ)時計回りです。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、指定した点群オブジェクトから輪郭線を作成します。

SELECT sdo_pc_pkg.create_contour_geometries(
  (SELECT pc FROM pcs WHERE pc_id = 1),
  sampling_resolution => 50,
  elevations => sdo_ordinate_array(100, 101, 102, 103, 104, 105, 106, 107, 108, 109),
  region => mdsys.sdo_geometry(2003, null, null, mdsys.sdo_elem_info_array(1, 1003, 3), mdsys.sdo_ordinate_array(-1000, 0, 999, 100)))
  FROM DUAL;

SDO_PC_PKG.CREATE_CONTOUR_GEOMETRIES((SELECTPCFROMPCSWHEREPC_ID=1),SAMPLING_RESO
--------------------------------------------------------------------------------
SDO_GEOMETRY_ARRAY(SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 5
, 2, 1), SDO_ORDINATE_ARRAY(-75.5, 24.5, -25.5, 74.5, 25.5, 74.5, 74.5, 25.5, 75
.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1)
, SDO_ORDINATE_ARRAY(-76.5, 24.5, -75.5, 25.5, -26.5, 74.5, 26.5, 74.5, 74.5, 26
.5, 76.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7,
 2, 1), SDO_ORDINATE_ARRAY(-77.5, 24.5, -75.5, 26.5, -27.5, 74.5, 27.5, 74.5, 74
.5, 27.5, 77.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2,
 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-78.5, 24.5, -75.5, 27.5, -28.5, 74.5, 28.5, 74
.5, 74.5, 28.5, 78.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY
(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-79.5, 24.5, -75.5, 28.5, -29.5, 74.5, 29
.5, 74.5, 74.5, 29.5, 79.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO
_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-80.5, 24.5, -75.5, 29.5, -30.5, 74
.5, 30.5, 74.5, 74.5, 30.5, 80.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, SDO_ELE
M_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-81.5, 24.5, -75.5, 30.5, -31
.5, 74.5, 31.5, 74.5, 74.5, 31.5, 81.5, 24.5)), SDO_GEOMETRY(2002, NULL, NULL, S
DO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-82.5, 24.5, -75.5, 31.
5, -32.5, 74.5, 32.5, 74.5, 74.5, 32.5, 82.5, 24.5)), SDO_GEOMETRY(2002, NULL, N
ULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-83.5, 24.5, -75.
5, 32.5, -33.5, 74.5, 33.5, 74.5, 74.5, 33.5, 83.5, 24.5)), SDO_GEOMETRY(2002, N
ULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(-84.5, 24.5
, -75.5, 33.5, -34.5, 74.5, 34.5, 74.5, 74.5, 34.5, 84.5, 24.5)))

1 row selected.

30.5 SDO_PC_PKG.CREATE_PC

構文

SDO_PC_PKG.CREATE_PC(
     inp           IN SDO_PC, 
     inptable      IN VARCHAR2, 
     clstPcdataTbl IN VARCHAR2 DEFAULT NULL);

説明

inptableパラメータで指定した点を使用して点群を作成します。

パラメータ

inp

使用するSDO_PCオブジェクトを指定します。このオブジェクトは、SDO_PC_PKG.INITファンクションによって作成されている必要があります。

inptable

入力点群データを含む表またはビューの名前を指定します。この表またはビューには、次の列が含まれている必要があります。

  • RID (VARCHAR2(24)): 各点の一意のID。

  • VAL_D1 (NUMBER): 次元1の座標。

  • VAL_D2 (NUMBER): 次元2の座標。

  • . . .

  • VAL_Dn (NUMBER): 次元nの座標。ここでのnは、最も数字の大きい次元です。nは、点群が初期化されたときのSDO_PC_PKG.INITファンクションへのコールに含まれていたpc_tot_dimensionsパラメータ値と一致している必要があります。

clstPcdataTbl

結果として生成された点データを格納する表の名前を指定します。値を指定しない場合、この表は作成されません。表の詳細は、「使用上のノート」を参照してください。

使用上のノート

点群の最初のいくつかの次元を索引付けすると、後でSDO_PC_PKG.CLIP_PCファンクションを使用して検索することができます。索引付けする次元の正確な数は、初期化された点群オブジェクト内の点群エクステントの次元(具体的にはinp.pc_extent.sdo_gtype/1000)によって決まります。

inptableパラメータにビュー名を指定すると、SELECT ROWID FROM <view-name>の問合せはエラーを戻すことはできません。

clstPcdataTblパラメータで表名を指定する場合は、指定する表が存在し、次の列が含まれている必要があります。

  • PTN_ID (NUMBER)

  • POINT_ID (NUMBER)

  • RID (VARCHAR2(24)): 各点の一意のID。

  • VAL_D1 (NUMBER): 次元1の座標。

  • VAL_D2 (NUMBER): 次元2の座標。

  • . . .

  • VAL_Dn (NUMBER): 次元nの座標。ここでのnは、最も数字の大きい次元です。nは、点群が初期化されたときのSDO_PC_PKG.INITファンクションへのコールに含まれていたpc_tot_dimensionsパラメータ値と一致している必要があります。

clstPcdataTblパラメータの値が指定されている場合、このファンクションは、PTN_IDおよびPOINT_IDに対して適切な値を割り当て、他の属性のinptable表またはビューから値をコピーすることによって表にデータを挿入します。この表は索引構成表として作成できます。この表をアプリケーションで使用すると、索引次元で反映される次元以外の次元に関してSQL問合せを使用した検索を実行できます。(索引次元および総次元の説明は、SDO_PC_PKG.INITファンクションのpc_tot_dimensionsパラメータの説明を参照してください。)

SDO_PCおよびSDO_PC_BLK_TYPEデータ型については、「点群に関連するオブジェクト型」を参照してください。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では点群を作成します。これは、Oracle Database Examplesメディアからすでにファイルをインストールしている場合は、$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlから取得できます(『Oracle Database Examplesインストレーション・ガイド』を参照)。

. . .
-- Create the blocks for the point cloud.
sdo_pc_pkg.create_pc(
  pc,       -- Initialized PointCloud object
  'INPTAB', -- Name of input table to ingest into the pointcloud
  'RES'     -- Name of output table that stores the points (with ptn_id,pt_id)
  );
. . .

30.6 SDO_PC_PKG.DROP_DEPENDENCIES

構文

SDO_PC_PKG.DROP_DEPENDENCIES(
     basetable IN VARCHAR2, 
     col       IN VARCHAR2);

説明

点群ブロック表と指定した実表および列の間の依存性を削除します。

パラメータ

basetable

点群の初期化時に(SDO_PC_PKG.INITファンクションのbasetableパラメータで)指定されていた実表の名前を指定します。

col

SDO_PC_PKG.INITファンクションのbasecolパラメータで指定されていた実表内の列の名前を指定します。

使用上のノート

このプロシージャは、点群ブロック表を切り捨て、ブロック表と実表および列の組合せの間の関連付けを削除します。

このプロシージャを実行した後は、点群ブロック表を削除したり、表を別の実表および列の組合せに関連付けることができます。詳細は、SDO_PC_PKG.INITファンクションの「使用上のノート」を参照してください。

次の例では、点群ブロック表と(それぞれがBASEとPCという名前の)実表および列の間の依存性を削除します。

. . .
declare
begin
  mdsys.sdo_pc_pkg.drop_dependencies('BASE', 'PC');
end;
/

30.7 SDO_PC_PKG.GET_PT_IDS

構文

SDO_PC_PKG.GET_PT_IDS(
     pts         IN BLOB, 
     num_pts     IN NUMBER, 
     pc_tot_dim  IN NUMBER, 
     blk_domain  IN SDO_ORGSCL_TYPE DEFAULT NULL, 
     ) RETURN SDO_NUMBER_ARRAY;

説明

点群内のブロックにある点のブロックIDおよび点IDの値を戻します。

パラメータ

pts

点群ブロックを含むバイナリ・ラージ・オブジェクト(BLOB)を指定します。

num_pts

点群ブロック内の点の数を指定します。点群ブロックの場合、点の数は点群ブロック表のNUM_POINTS列に格納されます(「SDO_PCオブジェクト型」表2-7を参照)。

pc_tot_dim

点群ブロック内の点の次元数を指定します。

blk_domain

(現在は使用されていません。)

使用上のノート

このファンクションは、SDO_NUMBER_ARRAYオブジェクトを戻します。配列には数字の複数のペアが含まれ、各ペアは点のブロックIDと点IDを示します。このファンクションへの特定のコールについては、戻される配列内のすべての点に関連付けられているブロックID値が同じになります。SDO_NUMBER_ARRAY型は、VARRAY(1048576) OF NUMBERとして定義されます。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、点群ブロック内の点のブロックIDおよび点IDの値を戻します。これは、Oracle Database Examplesメディアからすでにファイルをインストールしている場合は、$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlから取得できます(『Oracle Database Examplesインストレーション・ガイド』を参照)。

SELECT SDO_PC_PKG.GET_PT_IDS(
    a.points,   -- LOB containing the points
    a.num_points, -- # of points in the LOB
    3 -- Total dimensionality of the points in the LOB
) FROM restst a WHERE num_points >0;

30.8 SDO_PC_PKG.HAS_PYRAMID

構文

SDO_PC_PKG.HAS_PYRAMID(
     inp  IN SDO_PC 
     ) RETURN NUMBER;

説明

指定した点群オブジェクトにピラミッドがある場合は1を、ない(つまり、単一レベルのブロックのみ)場合は0を戻します。

パラメータ

inp

入力点群オブジェクト。(SDO_PCデータ型については、「点群に関連するオブジェクト型」を参照してください。)

使用上のノート

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、表PCSの列PCの点群オブジェクトにピラミッドがあるかどうかを確認します。結果は、表内の唯一の行のSDO_PCオブジェクトにはピラミッドがないことを示しています。

SELECT id, sdo_pc_pkg.has_pyramid(pc) "Has Pyramid" FROM pcs ORDER BY id;

        ID Has Pyramid
---------- -----------
         2           0

30.9 SDO_PC_PKG.INIT

構文

SDO_PC_PKG.INIT(
     basetable          IN VARCHAR2, 
     basecol            IN VARCHAR2, 
     blktable           IN VARCHAR2, 
     ptn_params         IN VARCHAR2, 
     pc_extent          IN SDO_GEOMETRY, 
     pc_tol             IN NUMBER DEFAULT 0.0000000000005, 
     pc_tot_dimensions  IN NUMBER DEFAULT 2, 
     pc_domain          IN SDO_ORGSCL_TYPE DEFAULT NULL, 
     pc_val_attr_tables IN SDO_STRING_ARRAY DEFAULT NULL, 
     pc_other_attrs     IN XMLTYPE DEFAULT NULL 
     ) RETURN SDO_PC;

説明

SDO_PCオブジェクトの作成により点群を初期化します。

パラメータ

basetable

SDO_PC型の列を含む実表の名前を指定します。

basecol

実表のSDO_PC型の列名を指定します。

blktable

点群のブロックを格納するために使用する、点群ブロック表の名前を指定します。この表は存在している必要があり、またCREATE TABLE <table-name> AS select * from mdsys.sdo_pc_blk_table;形式の文によって作成されている必要があります。

各点群ブロック表に関連付けることのできるbasetablebasecolの組合せは1つのみです。

ptn_params

点群のパーティション化に関するパラメータを指定します。カンマで区切られたキーワードを引用符で囲んだ文字列で指定します。たとえば、'blk_capacity=1000,work_tablespace=my_work_ts'などです。このパラメータがNULLの場合、点群はパーティション化されません。使用可能なキーワードは、次のとおりです。

  • blk_capacity=n: nは各パーティション内の最大行数です。デフォルト値は5000です。この値には、常に50より大きい数字を指定します。

  • work_tablespace=x: xは、パーティション操作中に一時表を作成する表領域の名前です。

pc_extent

点群の空間エクステント(点群に含まれるすべてのオブジェクトを囲む最小境界オブジェクト)を表すSDO_GEOMETRYオブジェクトを指定します。このパラメータはnullであってはならない。

測地データの場合、このジオメトリは2つの次元を持つ必要があります。測地データ以外の場合は、最大で4つの次元を持つことができます。このジオメトリの次元は、pc_tot_dimensionsパラメータで使用できる最小値として使用されます(このパラメータの説明を参照)。

pc_tol

点群のオブジェクトの許容差を指定します。(空間許容差の詳細は、1.5.5項を参照してください。)このパラメータがNULLの場合、デフォルト値は0.0000000000005です。

pc_tot_dimensions

点群オブジェクトの総次元を指定する数字を指定します。点群ブロックの各点については、pc_tot_dimensions座標(値)が格納されます。

総次元は、pc_extentジオメトリの次元数である索引次元以上に指定する必要があります。総次元を索引次元より大きく指定すると、空間データと同じフェッチ操作で必要な非空間属性を取得できます。総次元の最大値は8です。このパラメータのデフォルト値は2です。

pc_domain

(現在は使用されていません。)

pc_val_attr_tables

点群の値属性表の名前を指定するSDO_STRING_ARRAYオブジェクトを指定します。このパラメータがNULLの場合、点群に関連付けられる値属性表はありません。SDO_STRING_ARRAY型は、VARRAY(1048576) OF VARCHAR2(32)として定義されます。

pc_other_attrs

点群のその他の属性を指定するXMLTYPEオブジェクトを指定します。このパラメータがNULLの場合、点群はその他の属性を持ちません。

「使用上のノート」の説明のように、このパラメータは、点群のピラミッド化にメタデータを含めることができます。

使用上のノート

このファンクションを使用してSDO_PCオブジェクトを初期化した後は、このオブジェクトをSDO_PC_PKG.CREATE_PCプロシージャへの入力として指定することにより点群を作成できます。

SDO_PCデータ型については、「点群に関連するオブジェクト型」を参照してください。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

このファンクションを使用した後、blktable表は実表と同期された状態で維持されます。たとえば、実表から行を削除すると、その行の対応する点群オブジェクトのブロックもブロック表から削除され、実表が切り捨てられると、ブロック表も切り捨てられます。

ブロック表を削除できるのは、実表が削除された場合か、またはSDO_PC_PKG.DROP_DEPENDENCIESプロシージャが実行された場合のみです。

pc_other_attrsパラメータは、点群のピラミッド化のメタデータを指定するために使用できます。たとえば:

xmltype(
 '<opc:sdoPcObjectMetadata
    xmlns:opc="http://xmlns.oracle.com/spatial/vis3d/2011/sdovis3d.xsd"
    xmlns:las="http://liblas.org/schemas/LAS/1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <opc:sdoPcPyramid preserveLevel1="true"/>
  </opc:sdoPcObjectMetadata>')

次の文を入力すると、pc_other_attrsパラメータのXMLスキーマ定義(XSD)が表示されます。

SET LONG 40000
SELECT xmlschema FROM sdo_xml_schemas WHERE description = 'EPSG  sdo3d.xsd';

点群のピラミッド化は、レベル1 (リーフ)からレベルn (ルート)までの複数のピラミッド・レベルを作成します。通常、レベルiに格納されている点は、より詳細なレベルのいずれでも繰り返されることはありません。すべての点は、正確に1回物理的に格納されます。リーフ・レベル1は、preserveLevel1="true"(前述の例を参照)を指定することで、このルールから除外できるので、ピラミッド化に準拠していないアプリケーションには適用する必要ありません。ただし、このpreserveLevel1="true"オプション(除外されるのでレベル1を維持)では、各点が2回格納(ルート・レベルで1回とピラミッドの残りで1回)されるので、2倍の領域が必要になります。

次の例では、SDO_PCオブジェクトを作成することによって点群を初期化し、オブジェクトのIDを表示します。これは、Oracle Database Examplesメディアからすでにファイルをインストールしている場合は、$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlから取得できます(『Oracle Database Examplesインストレーション・ガイド』を参照)。

. . .
declare
  pc sdo_pc;
begin
  -- Initialize the point cloud object. 
  pc := sdo_pc_pkg.init(
          'BASE', -- Table that has the SDO_POINT_CLOUD column defined
          'PC',   -- Column name of the SDO_POINT_CLOUD object 
          'BLKTAB', -- Table to store blocks of the point cloud
          'blk_capacity=1000', -- max # of points per block 
          mdsys.sdo_geometry(2003, 8307, null,
              mdsys.sdo_elem_info_array(1,1003,3),
              mdsys.sdo_ordinate_array(-180, -90, 180, 90)),  -- Extent 
              0.5, -- Tolerance for point cloud
              3, -- Total number of dimensions
              null);
. . .

30.10 SDO_PC_PKG.PC2DEM

構文

SDO_PC_PKG.PC2DEM(
      geor        IN OUT SDO_GEORASTER, 
      pc          IN SDO_PC,
      mbr2d       IN SDO_GEOMETRY,
      resolution  IN NUMBER,
      blocksize   IN NUMBER);

または

SDO_PC_PKG.PC2DEM(
      geor            IN OUT SDO_GEORASTER, 
      pc              IN SDO_PC,
      mbr2d           IN SDO_GEOMETRY,
      resolutionVert  IN NUMBER,
      resolutionHoriz IN NUMBER,
      blocksizeVert   IN NUMBER);
      blocksizeHoriz  IN NUMBER);

説明

既存の(ブロック・モデル)点群オブジェクトからDEM(数値標高モデル)GeoRasterオブジェクトを作成します。

パラメータ

geor

GeoRasterオブジェクトを指定します。(SDO_GEORASTERデータ型の詳細は、『Oracle Spatial and Graph GeoRaster開発者ガイド』を参照してください。)

pc

点群オブジェクト。(SDO_PCデータ型については、「点群に関連するオブジェクト型」を参照してください。)

mbr2d

DEMを生成する2次元の最小境界矩形(MBR)。

resolution

解像度(ピクセル当たりの座標参照系単位数(ピクセル当たりのメートル数、ピクセル当たりの度数など))。

blockSize

ブロック・サイズ(ピクセル)。

resolutionVert

水平解像度と垂直解像度が異なる場合の垂直解像度(ピクセル当たりの座標参照系単位数(ピクセル当たりのメートル数、ピクセル当たりの度数など))。

resolutionHoriz

水平解像度と垂直解像度が異なる場合の水平解像度(ピクセル当たりの座標参照系単位数(ピクセル当たりのメートル数、ピクセル当たりの度数など))。

blockSizeVert

水平ブロック・サイズと垂直ブロック・サイズが異なる場合の垂直ブロック・サイズ。

blockSizeHoriz

水平ブロック・サイズと垂直ブロック・サイズが異なる場合の水平ブロック・サイズ。

使用上のノート

このプロシージャは、指定したGeoRasterオブジェクト(georパラメータ)を入力点群の情報に基づいて変更します。

pcオブジェクトとgeorオブジェクトは同じ座標参照系(SRID)を使用する必要があります。

georパラメータについては、GeoRasterオブジェクトを表に挿入し、そのGeoRasterオブジェクトを変数に戻すことによって入力SDO_GEORASTERオブジェクトを取得できます。たとえば:

INSERT INTO raster_table VALUES (1, sdo_geor.init('raster_data_table'))
   RETURNING raster_image INTO geor;

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では点群からDEMを作成します。

DECLARE
pc   sdo_pc;
geor sdo_georaster;
mbr  sdo_geometry :=
  SDO_GEOMETRY(
    2003,
    27700,
    NULL,
    SDO_ELEM_INFO_ARRAY(1, 1003, 3),
    SDO_ORDINATE_ARRAY(
      668000, 5535000,
      672000, 5539000));
BEGIN
  select pc INTO pc from pcs where id = 2;
    
  insert into raster (id, raster)
     values(2, sdo_geor.init('raster_data', 2))
     returning raster into geor;
   
  sdo_pc_pkg.pc2dem(
    geor         => geor,
    pc           => pc,
    mbr2d        => mbr,
    resolution   => 1.0,
    blockSize    => 512);
   
  sdo_geor.generatePyramid(
    georaster     => geor,
    pyramidParams => 'rLevel=7, resampling=BILINEAR');
  
  update raster set raster = geor where id = 2;
  commit;
END;
/

その他の例については、Oracle Database Examplesメディアからファイルをインストールしている場合に使用可能な$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlサンプル・プログラムを参照してください(『Oracle Database Examplesインストレーション・ガイド』を参照)。

30.11 SDO_PC_PKG.PRESERVES_LEVEL1

構文

SDO_PC_PKG.PRESERVES_LEVEL1(
     inp  IN SDO_PC 
     ) RETURN NUMBER;

説明

指定した点群オブジェクトがすべての点を単一ブロック・レベルに含む場合は1を戻し、それ以外の場合は0を戻します。

パラメータ

inp

入力点群オブジェクト。(SDO_PCデータ型については、「点群に関連するオブジェクト型」を参照してください。)

使用上のノート

次のいずれかの場合、点群オブジェクトはすべての点を単一ブロック・レベルに含みます。

  • ピラミッドがなく、すべての点が同じレベルにあります。この場合、ファンクションは1を戻します。

  • ピラミッドはあるが、リーフ・レベルで(他のレベルにまだない点を含むことに加えて)他のピラミッド・レベルの1つ以上の点が繰り返されます。この場合、ファンクションは1を戻します。ただし、ピラミッドがあり、リーフ・レベルで他のピラミッド・レベルの点を繰り返さない場合、ファンクションは0を戻します。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、表PCSの列PCの点群オブジェクトにピラミッドがあるかどうか、および各SDO_PCオブジェクトが単一ブロック・レベルにそのオブジェクトのすべての点を含むかを確認します。結果は、表内の唯一の行のSDO_PCオブジェクトにはピラミッドはなく、単一ブロック・レベルにすべての点を含むことを示しています。

SELECT id, sdo_pc_pkg.has_pyramid(pc) "Has Pyramid",
   sdo_pc_pkg.preserves_level1(pc) "Preserves Level 1"
   FROM pcs ORDER BY id;

        ID Has Pyramid Preserves Level 1
---------- ----------- -----------------
         2           0                 1

30.12 SDO_PC_PKG.SDO_PC_NN

構文

SDO_PC_PKG.SDO_PC_NN(
     pc     IN SDO_PC, 
     center IN SDO_GEOMETRY, 
     n      IN NUMBER 
     ) RETURN BLOB;

説明

入力点群オブジェクト内で指定された3D点に最も近いn個の点を戻します。

パラメータ

pc

SDO_PC型の点群オブジェクト。

center

最も近いN個の点を探している領域の中心を表す3D点。

n

探す対象となる最も近い点の数。

使用上のノート

SDO_PCデータ型については、「点群に関連するオブジェクト型」を参照してください。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、指定された点群オブジェクト内で指定の"center"点から最も近い点を3200個戻します。

select
  rownum pt_pos,
  sdo_geometry(
    3001,
    null,
    sdo_point_type(x, y, z),
    null,
    null) pts
from
  table(
    sdo_util.getvertices(
      geometry => sdo_pc_pkg.to_geometry(
                    pts => sdo_pc_pkg.sdo_pc_nn(
                             pc     => (select pc from pcs where id = 1),
                             center => sdo_geometry(
                                         3001,
                                         null,
                                         sdo_point_type(15, 15, 30),
                                         null,
                                         null),
                             n      => 3200),
                    num_pts    => 3200,
                    pc_tot_dim => 3,
                    srid       => null,
                    blk_domain => null,
                    get_ids    => 1)))
order by
  sqrt(
    (x - 15) * (x - 15) +
    (y - 15) * (y - 15) +
    (z - 30) * (z - 30)),
  x,
  y,
  z;

    PT_POS
----------
PTS(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(15, 15, 30), NULL, NULL)

         2
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(15, 15, 30), NULL, NULL)

         4
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(14, 15, 29), NULL, NULL)

        10
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(14, 15, 29), NULL, NULL)

         5
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(14, 16, 30), NULL, NULL)

        11
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(14, 16, 30), NULL, NULL)

         3
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(15, 14, 29), NULL, NULL)

...

      3200
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(33, 28, 61), NULL, NULL)

      3199
SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(46, 2, 48), NULL, NULL)


3200 rows selected.

Elapsed: 00:00:15.57

30.13 SDO_PC_PKG.SDO_PC_NN_FOR_EACH

構文

SDO_PC_PKG.SDO_PC_NN_FOR_EACH(
     blocks     IN SIMPLE_BLK_REF, 
     pc          IN SDO_PC, 
     n           IN NUMBER, 
     max_dist    IN NUMBER, 
     qry_min_res IN NUMBER, 
     qry_max_res IN NUMBER 
     ) RETURN POINT_NEIGHBOR_PAIR_TAB;

説明

各点が問合せ範囲内にある、最も近いn個の点を戻します。

パラメータ

blocks

PCブロック、個々の問合せウィンドウおよび非空間問合せ制約の表。

pc

SDO_PC型の点群オブジェクト。

n

各点が問合せ範囲内にあり、探す対象となる最も近い点の数。

max_dist

近隣をチェックする最大距離。

qry_min_res

ピラミッドを持つ点群の最小ピラミッド・レベル。(例に示すように、ピラミッド・レベルごとに異なる(見る人からより近いまたはより遠い)問合せウィンドウを使用できます。

qry_max_res

ピラミッドを持つ点群の最大ピラミッド・レベル。(例に示すように、ピラミッド・レベルごとに異なる(見る人からより近いまたはより遠い)問合せウィンドウを使用できます。

使用上のノート

このファンクションに関連する型は次のように定義されます。

TYPE SIMPLE_BLK_REF is RECORD (
  blk_id        number,
  ind_dim_qry   MDSYS.sdo_geometry,
  other_dim_qry MDSYS.sdo_mbr);

TYPE POINT_NEIGHBOR_PAIR_ROW is RECORD (
  obj_id          number,
  blk_id          number,
  pt_id           number,
  pt_x            number,
  pt_y            number,
  pt_z            number,
  neighbor_rank   number,
  neighbor_dist   number,
  neighbor_blk_id number,
  neighbor_pt_id  number,
  neighbor_x      number,
  neighbor_y      number,
  neighbor_z      number);

TYPE POINT_NEIGHBOR_PAIR_TAB is TABLE of POINT_NEIGHBOR_PAIR_ROW;

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、各点が指定された問合せ範囲内にある、最も近い10個の点を戻します。

define query_window = SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(100,100,102,102));

with
  candidates AS (
    select
      blocks.blk_id,
      SDO_GEOM.SDO_INTERSECTION(subqueries.ind_dim_qry, blocks.blk_extent, 0.05),
      subqueries.other_dim_qry
    from
      blocks blocks,
      (
        select 1 min_res, 1 max_res, &query_window ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual union all
        select 2 min_res, 5 max_res, &query_window ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual
      ) subqueries
    where
      blocks.obj_id = 1 and
      blocks.pcblk_min_res <= max_res and
      blocks.pcblk_max_res >= min_res and
      SDO_ANYINTERACT(blocks.blk_extent, subqueries.ind_dim_qry) = 'TRUE')
select /*+ parallel (2) */
  *
from
  table(
    sdo_pc_pkg.sdo_pc_nn_for_each(
      blocks      => cursor(select * from candidates),
      pc          => (select pc from pcs where id = 1),
      n           => 10,
      max_dist    => 10,
      qry_min_res => 1,
      qry_max_res => 1))
order by
  obj_id,
  blk_id,
  pt_id,
  neighbor_rank;

old  10:         select 1 min_res, 1 max_res, &query_window ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual union all
new  10:         select 1 min_res, 1 max_res, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(100,100,102,102)) ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual union all
old  11:         select 2 min_res, 5 max_res, &query_window ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual
new  11:         select 2 min_res, 5 max_res, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(100,100,102,102)) ind_dim_qry, cast(null as sdo_mbr) other_dim_qry from dual

    OBJ_ID     BLK_ID      PT_ID       PT_X       PT_Y       PT_Z NEIGHBOR_RANK NEIGHBOR_DIST NEIGHBOR_BLK_ID NEIGHBOR_PT_ID NEIGHBOR_X NEIGHBOR_Y NEIGHBOR_Z
---------- ---------- ---------- ---------- ---------- ---------- ------------- ------------- --------------- -------------- ---------- ---------- ----------
         1          2        272        100        100        200             1             0               2            272        100        100        200
         1          2        272        100        100        200             2    1.41421356               2            268         99        101        200
         1          2        272        100        100        200             3    1.41421356               2            271         99        100        199
         1          2        272        100        100        200             4    1.41421356               2            293        100         99        199
         1          2        272        100        100        200             5    1.41421356               2            275        100        101        201
         1          2        272        100        100        200             6    1.41421356               2            273        101        100        201
         1          2        272        100        100        200             7    1.41421356               2            292        101         99        200
         1          2        272        100        100        200             8    2.44948974               2            269         98        101        199
         1          2        272        100        100        200             9    2.44948974               2            250         99         99        198
         1          2        272        100        100        200            10    2.44948974               2            267         99        102        201
         1          2        273        101        100        201             1             0               2            273        101        100        201
         1          2        273        101        100        201             2    1.41421356               2            272        100        100        200
         1          2        273        101        100        201             3    1.41421356               2            275        100        101        201
         1          2        273        101        100        201             4    1.41421356               2            292        101         99        200
         1          2        273        101        100        201             5    1.41421356               2            274        101        101        202
         1          2        273        101        100        201             6    1.41421356               2            291        102         99        201
         1          2        273        101        100        201             7    1.41421356               2            286        102        100        202
         1          2        273        101        100        201             8    2.44948974               2            268         99        101        200
         1          2        273        101        100        201             9    2.44948974               2            293        100         99        199
         1          2        273        101        100        201            10    2.44948974               2            276        100        102        202
         1          2        274        101        101        202             1             0               2            274        101        101        202
         1          2        274        101        101        202             2    1.41421356               2            276        100        102        202
         1          2        274        101        101        202             3    1.41421356               2            275        100        101        201
         1          2        274        101        101        202             4    1.41421356               2            273        101        100        201
         1          2        274        101        101        202             5    1.41421356               2            279        101        102        203
         1          2        274        101        101        202             6    1.41421356               2            286        102        100        202
         1          2        274        101        101        202             7    1.41421356               2            285        102        101        203
         1          2        274        101        101        202             8    2.44948974               2            267         99        102        201
         1          2        274        101        101        202             9    2.44948974               2            272        100        100        200
         1          2        274        101        101        202            10    2.44948974               2            277        100        103        203
         1          2        275        100        101        201             1             0               2            275        100        101        201
         1          2        275        100        101        201             2    1.41421356               2            267         99        102        201
         1          2        275        100        101        201             3    1.41421356               2            268         99        101        200
         1          2        275        100        101        201             4    1.41421356               2            272        100        100        200
         1          2        275        100        101        201             5    1.41421356               2            276        100        102        202
         1          2        275        100        101        201             6    1.41421356               2            273        101        100        201
         1          2        275        100        101        201             7    1.41421356               2            274        101        101        202
         1          2        275        100        101        201             8    2.44948974               2            264         98        102        200
         1          2        275        100        101        201             9    2.44948974               2            266         99        103        202
         1          2        275        100        101        201            10    2.44948974               2            271         99        100        199
         1          2        276        100        102        202             1             0               2            276        100        102        202
         1          2        276        100        102        202             2    1.41421356               2            266         99        103        202
         1          2        276        100        102        202             3    1.41421356               2            267         99        102        201
         1          2        276        100        102        202             4    1.41421356               2            277        100        103        203
         1          2        276        100        102        202             5    1.41421356               2            275        100        101        201
         1          2        276        100        102        202             6    1.41421356               2            274        101        101        202
         1          2        276        100        102        202             7    1.41421356               2            279        101        102        203
         1          2        276        100        102        202             8    2.44948974               2            265         98        103        201
         1          2        276        100        102        202             9    2.44948974               2            469         99        104        203
         1          2        276        100        102        202            10    2.44948974               2            268         99        101        200
         1          2        279        101        102        203             1             0               2            279        101        102        203
         1          2        279        101        102        203             2    1.41421356               2            277        100        103        203
         1          2        279        101        102        203             3    1.41421356               2            276        100        102        202
         1          2        279        101        102        203             4    1.41421356               2            274        101        101        202
         1          2        279        101        102        203             5    1.41421356               2            278        101        103        204
         1          2        279        101        102        203             6    1.41421356               2            280        102        102        204
         1          2        279        101        102        203             7    1.41421356               2            285        102        101        203
         1          2        279        101        102        203             8    2.44948974               2            266         99        103        202
         1          2        279        101        102        203             9    2.44948974               2            458        100        104        204
         1          2        279        101        102        203            10    2.44948974               2            275        100        101        201
         1          2        280        102        102        204             1             0               2            280        102        102        204
         1          2        280        102        102        204             2    1.41421356               2            278        101        103        204
         1          2        280        102        102        204             3    1.41421356               2            279        101        102        203
         1          2        280        102        102        204             4    1.41421356               2            285        102        101        203
         1          2        280        102        102        204             5    1.41421356               2            281        102        103        205
         1          2        280        102        102        204             6    1.41421356               2            283        103        102        205
         1          2        280        102        102        204             7    1.41421356               2            284        103        101        204
         1          2        280        102        102        204             8    2.44948974               2            277        100        103        203
         1          2        280        102        102        204             9    2.44948974               2            457        101        104        205
         1          2        280        102        102        204            10    2.44948974               2            274        101        101        202
         1          2        285        102        101        203             1             0               2            285        102        101        203
         1          2        285        102        101        203             2    1.41421356               2            274        101        101        202
         1          2        285        102        101        203             3    1.41421356               2            279        101        102        203
         1          2        285        102        101        203             4    1.41421356               2            280        102        102        204
         1          2        285        102        101        203             5    1.41421356               2            286        102        100        202
         1          2        285        102        101        203             6    1.41421356               2            284        103        101        204
         1          2        285        102        101        203             7    1.41421356               2            287        103        100        203
         1          2        285        102        101        203             8    2.44948974               2            276        100        102        202
         1          2        285        102        101        203             9    2.44948974               2            273        101        100        201
         1          2        285        102        101        203            10    2.44948974               2            278        101        103        204
         1          2        286        102        100        202             1             0               2            286        102        100        202
         1          2        286        102        100        202             2    1.41421356               2            273        101        100        201
         1          2        286        102        100        202             3    1.41421356               2            274        101        101        202
         1          2        286        102        100        202             4    1.41421356               2            291        102         99        201
         1          2        286        102        100        202             5    1.41421356               2            285        102        101        203
         1          2        286        102        100        202             6    1.41421356               2            287        103        100        203
         1          2        286        102        100        202             7    1.41421356               2            288        103         99        202
         1          2        286        102        100        202             8    2.44948974               2            275        100        101        201
         1          2        286        102        100        202             9    2.44948974               2            292        101         99        200
         1          2        286        102        100        202            10    2.44948974               2            279        101        102        203

90 rows selected.

Elapsed: 00:00:03.02

30.14 SDO_PC_PKG.TO_GEOMETRY

構文

SDO_PC_PKG.TO_GEOMETRY(
     pts        IN BLOB, 
     num_pts    IN NUMBER, 
     pc_tot_dim IN NUMBER, 
     srid       IN NUMBER DEFAULT NULL, 
     blk_domain IN SDO_ORGSCL_TYPE DEFAULT NULL 
     ) RETURN SDO_GEOMETRY;

説明

点群のすべてまたは一部を表すジオメトリ・オブジェクトを戻します。

パラメータ

pts

点を含むBLOBを指定します。

num_pts

結果として生成されるジオメトリに含まれる点の最大数を指定します。

pc_tot_dim

データに定義する空間次元数を指定します。

srid

データに関連付けられた空間参照(座標系)IDを指定します。このパラメータがNULLの場合、SRID値はデータに関連付けられません。

blk_domain

(現在は使用されていません。)

使用上のノート

このファンクションは、ptsパラメータのすべての点ジオメトリを表す、単一の複数点のSDO_GEOMETRYオブジェクトを戻します。たとえば、点にクリップ操作の結果またはブロック全体の内容を反映することもできます。

点群を使用してソリッドをモデル化する方法は、「ソリッドのモデル化」を参照してください。

次の例では、点群を表す複数点の集合ジオメトリ・オブジェクトを戻します。これは、Oracle Database Examplesメディアからすでにファイルをインストールしている場合は、$ORACLE_HOME/md/demo/PointCloud/examples/plsql/pc.sqlから取得できます(『Oracle Database Examplesインストレーション・ガイド』を参照)。

. . .
-- Return points in blk_id of the point cloud as a multipoint collection.
select sdo_pc_pkg.to_geometry(
                    a.points,   -- point LOB
                    a.num_points, -- # of points in the LOB
                    3,  -- total dimensionality
                    8307 -- SRID
                    ) from blktab a where blk_id=0;
. . .