1.17 Oracle SpatialでのNURBS曲線のサポート

Spatialは、Non-Uniform Rational B-Spline (NURBS)曲線ジオメトリをサポートしています。

NURBS曲線を使用すると、任意の形状で自由形式の形状の表現が可能になります。NURBS表現では、制御点とノットにより曲線の形状が決定され、わずかなデータで複雑な形状の表現が可能になるため、曲線の形状を制御することができます。

SpatialでのNURBS曲線のサポートには次のものが含まれます。

  • Oracle SpatialでNURBS曲線ジオメトリをロードおよび格納するためのWKT、WKBおよびGMLファンクション。

  • NURBS曲線ジオメトリの検証。

  • NURBS曲線ジオメトリの空間索引付けと、SDO_FILTER、SDO_RELATEおよび他の演算子。空間演算子では、計算に曲線の近似値が使用されます。

NURBS表現には、制御点と基底関数の指定が必要です。また、基底関数は、ノット・ベクトルおよび曲線の曲度を使用して定義されます。制御点は、NURBS曲線の形状を決定するために使用されます。ノット・ベクトルは、曲線の形状を直接制御しませんが、終点の正確な配置を制御するために使用されます。また、ノット・ベクトルは、ねじれや角で曲線を作成するためにも使用されます。非一様なノット・ベクトルは曲線の操作のために使用されます。

NURBS曲線を表現するには、データ(制御点、ノット・ベクトルおよび曲線の曲度)を格納する必要があります。制御点のセットは、(x, y, z, w) (wは制御点の重みを表す)とするユークリッド形式、または(wx, wy, wz, w)とする同次形式のいずれかで表すことができます。すべてのiに対してwi=1の場合、この曲線は非有理になります。制御点は重み付けユークリッド形式で指定されます。基底関数は、ノット・ベクトルに基づいて一様または非一様になります。非一様なノット・ベクトルは、終点の配置およびねじれや角の作成に有効です。正規化されたノット・ベクトルを指定する必要があります(つまり、ノット・ベクトルの最初のノットを0 (ゼロ)に、ノット・ベクトルの最後のノットを1にする必要があります)。また、ノット・ベクトルは終点で「固定」させる必要があります。この要件は、ノット・ベクトルの最初のd+1の値をすべて0 (ゼロ)に、最後のd+1の値をすべて1にすることで適用されます(dはNURBS曲線の曲度を表します)。

Oracle SpatialでのNURBS曲線の実装は、SQL/MM規格に準拠しています。NURBS曲線用のSQL/MM規格は、スプライン、多項式スプライン、3次スプライン、Bスプラインおよびベジェ曲線を表現するために使用されます。Oracle Spatialでは、SDO_GEOMETRYオブジェクト型はNURBS表現のために使用されます。NURBS曲線は、線タイプ、複数線タイプおよびコレクション・タイプのジオメトリ・オブジェクトに含めることができます。これらのジオメトリでは、単純な線ストリングおよび複合線ストリングのタイプの要素のみにNURBSを含めることができます。

少なくとも1つのNURBSセグメントを含む複合線ストリングの場合、前のセグメントの最後の点はNURBSの"固定された"最初の制御点と同じで、NURBSセグメントの最後の"固定された"制御点は次のセグメントの最初の点と同じです。つまり、頂点が繰り返されます。

要素タイプ値が2で線ストリングを表すジオメトリ要素の場合、解釈値3はNURBS曲線を表すために使用され、解釈値1と2は線形セグメントと円弧を表します。NURBS曲線のSDO_ELEM_INFO_ARRAYは、(offset, 2, 3)として格納されます(これらはそれぞれオフセット、要素タイプ、解釈値を表します)。

SDO_ORDINATE_ARRAYには、曲線の曲度dm制御点のセットおよびサイズnのノット・ベクトルが格納されます。したがって、縦座標配列は一連の値(d, m, x1, y1, z1, w1…. xm, ym, zm, wm, n, k1….kn)として格納されます。制御点は、SQL/MM規格で指定されているユークリッド形式で格納されます。NURBS曲線では、ノットの数は曲度、制御点の数および1の合計と等しいことに注意してください。したがって、等式n=d+m+1は、NURBS曲線ジオメトリの検証に役立ちます。

NURBS曲線の定義には、次の考慮事項が適用されます。

  • 曲度が1の曲線は折れ線を表すため、曲度は1より大きい値にする必要があります。

  • 制御点の数は、3以上かつ曲度より大きい値にする必要があります。

  • ノットの数は、(制御点の数+曲度+ 1)と等しい値にする必要があります。

  • 各制御点の重み要素は正の数値にする必要があります。

  • 制御点は、重み付けユークリッド形式[wx, wy, (wz), w]で表されます。

  • ノット値は昇順で指定する必要があり、ノット・ベクトルは正規化されたノット・ベクトル[0, .. ……, 1]である必要があります。

  • dが曲線の曲度である場合、曲線の最初(値0 (ゼロ))にd+1の連続する均等なノット、曲線の最後(値1)にd+1の連続する均等なノットが必要です。これにより、曲線を終点で固定させることができます。

  • dが曲線の曲度である場合、d+1のノットが存在する必要がある曲線の最初または最後以外に、dより大きい連続する均等なノットを指定することはできません。

空間索引を作成または空間操作を実行する前に、NURBSセグメントのあるジオメトリを検証してください。(この推奨は、すべてのジオメトリ・タイプ、NURBSまたはその他に適用されます。)

NURBS曲線ジオメトリを指定する例は、「NURBS曲線」を参照してください。

入力NURBS曲線ジオメトリの近似処理である線ストリング・ジオメトリを取得するには、SDO_UTIL.GETNURBSAPPROX機能を使用します。