書式
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT( theGeometry IN SDO_GEOMETRY, theDimInfo IN SDO_DIM_ARRAY, conditional IN VARCHAR2 DEFAULT 'TRUE' , flag10g IN VARCHAR2 DEFAULT 'FALSE' ) RETURN VARCHAR2;
または
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT( theGeometry IN SDO_GEOMETRY, tolerance IN NUMBER, conditional IN VARCHAR2 DEFAULT 'TRUE' , flag10g IN VARCHAR2 DEFAULT 'FALSE' ) RETURN VARCHAR2;
説明
ジオメトリ・タイプが有効であるかどうかの一貫性チェックを行い、ジオメトリが無効な場合、コンテキスト情報を戻します。このファンクションは、表から得られるジオメトリの表現を、要素定義と対比して確認します。
パラメータ
ジオメトリ・オブジェクト。
theGeometry
に対応する次元情報の配列を指定します。通常、xxx_SDO_GEOM_METADATAビューの1つから選択します(「ジオメトリのメタデータ・ビュー」を参照)。
許容差(「許容差」を参照)。
条件付きのフラグを指定します(3次元の複合表面または複合ソリッドにのみ適用)。文字列値がTRUE
(デフォルト)である場合、2つの外部の輪が同じ平面にあり、エッジを共有していると、検証は行われなくなります。文字列値がFALSE
である場合、2つの外部の輪が同じ平面にあり、エッジを共有していても検証を行います。
Oracle Database 10g互換性フラグ。文字列値がTRUE
である場合、2次元ジオメトリに固有の検証のみが実行され、3次元固有の検証は実行されません。文字列値がFALSE
(デフォルト)である場合は、ジオメトリに関連するすべての検証が実行されます。(flag10g
パラメータの詳細は、「使用上の注意」を参照してください。)
使用上の注意
データで空間操作を実行する前に、すべてのジオメトリ・データを検査し、検査エラーがあれば修正する必要があります(「空間データのロードおよび検査の推奨手順」を参照)。
ジオメトリが有効な場合、TRUEを戻します。(ユーザー定義ジオメトリの場合、つまりSDO_GTYPE値が2000のジオメトリの場合は、文字列NULLを戻します。)
ジオメトリが無効な場合、次のいずれかを戻します。
ジオメトリが無効である具体的な理由に基づいて発行されるOracleエラー・メッセージ番号。他の理由でジオメトリが無効になった場合はFALSE。
エラーのコンテキスト(ジオメトリが無効になる原因となった座標、エッジまたは輪)。(この項の「エラーのコンテキスト: 詳細」を参照してください。)
ジオメトリ・タイプおよびジオメトリの一貫性チェックを行います。
ジオメトリ・タイプの一貫性について、次のことを確認します。
SDO_GTYPEが有効であるか
SDO_ETYPE値はSDO_GTYPEの値と一貫性があるか(たとえば、SDO_GTYPEが2003の場合、ジオメトリに1つ以上の要素タイプPOLYGONがあるか)
SDO_ELEM_INFO_ARRAYに有効な3つの値があるか
ジオメトリの一貫性については、ジオメトリ・タイプについて次のことを確認します。
ポリゴンに4つ以上の点があり、その点には、ポリゴンをクローズする点が含まれるか(クローズする点では、最後の点が最初の点と同じです。)
ポリゴンが自己交差していないか
線またはポリゴンに同じ点がないか
ポリゴンは正しく指定されているか(外部の輪の境界は反時計回り、内部の輪の境界は時計回り)
ポリゴンの内部が接続されているか
線ストリングに2つ以上の点があるか
ポリゴンの輪の要素の定義に、1桁および4桁のSDO_ETYPE値が混在していないか
円弧上にある点が直線上にないか、または同じ点ではないか
ジオメトリは(USER_SDO_GEOM_METADATAビューの)DIMINFO列の値で指定した範囲内にあるか
LRSジオメトリ(「線形参照システム」を参照)には、3つまたは4つの次元と、有効なメジャー次元位置があります(次元の数によって3つまたは4つ)。
COLLECTIONタイプのジオメトリの場合、前述の確認の一部は実行されません。具体的には、COLLECTIONタイプのジオメトリのポリゴン要素に対して、内部の輪の確認およびポリゴン同士の重複の確認は行われません。
複数点ジオメトリの場合、このファンクションは、3次元ジオメトリでの重複する頂点を確認しますが、2次元ジオメトリについては確認しません。
3次元ジオメトリの場合は、このファンクションにより、「3次元ジオメトリの検証」に示す確認も行われます。
ジオメトリの一貫性チェックでは、ファンクションはジオメトリのtolerance値によって線が接しているかどうか、または点が同じであるかどうかを判断します。
tolerance
を指定する場合、ジオメトリが、USER_SDO_GEOM_METADATAビューのDIMINFOフィールドに格納されている座標系の境界内に存在するかどうかを検査するためのチェックは行われません。このチェックを行う必要がある場合、theDimInfo
を指定します。
flag10g
パラメータ値をTRUE
に設定すると、ジオメトリの次元に関係なく、Oracle Spatial Release 10.2の検証ロジックが使用されます。これは、リリース11.1より前の形式のジオメトリを含む3次元ジオメトリが、検証に合格できるようにする(この値を設定しない場合は失敗する)場合に有効です。たとえば、3次元の線に円弧が含まれている場合、その線は無効になりますが、flag10g
をTRUE
に設定することによって、このようなジオメトリが円弧を含むという理由だけで無効とみなされることを回避できます。(後で、円弧の稠密化などにより、現行のリリースの基準に従って、これらのジオメトリを有効にする必要があります。)
このファンクションは、SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTプロシージャのかわりにPL/SQLプロシージャで使用できます。詳細は、SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTの「使用上の注意」を参照してください。
エラーのコンテキスト: 詳細
ジオメトリが無効な場合、その結果には座標、要素、輪およびエッジの組合せについての情報が含まれる可能性があります。
座標: 1つの座標は、ジオメトリの1個の頂点を示します。2次元のジオメトリでは、1個の頂点は2つの数値(XとY、つまり経度と緯度)で示されます。3次元のジオメトリでは、1個の頂点は3つの数値で定義され、4次元のジオメトリでは4つの数値で定義されます。(SDO_UTIL.GETVERTICESファンクションを使用して、ジオメトリの座標を戻すことができます。)
13356(ジオメトリ内の隣接する点が冗長である)などのジオメトリ検査エラーが発生した場合は、エラーで示された座標よりも大きい座標を含むようにrownumで停止条件を指定して、SDO_UTIL.GETVERTICESファンクションをコールできます。出力に示された最後の2つの座標が、冗長である座標です。これらの座標は、まったく同一であるか、またはユーザー指定の許容差内にあるために同一の点であるとみなされます。冗長である座標は、SDO_UTIL.REMOVE_DUPLICATE_VERTICESファンクションを使用して削除できます。
要素: 1つの要素は、1個の点、1本の線ストリング、または0 (ゼロ)以上の対応する内部ポリゴンを含む1つの外部ポリゴンです。(つまり、ポリゴン要素には、1つの外部の輪と、その外部の輪に関連付けられた内部の輪すべてが含まれます。)ジオメトリが複数要素のジオメトリ(複数の点、複数の線、複数のポリゴンなど)である場合、1つ目の要素がElement 1、2つ目の要素がElement 2となり、以降同様に続きます。
輪: 輪は、ポリゴン要素でのみ使用されます。ポリゴンの外部の輪は、ポリゴン要素とみなされます。1つの外部の輪には、0 (ゼロ)個以上の内部の輪(穴)が含まれます。内部の輪には、それぞれ個別の名称が指定されますが、Ring 1は、外部ポリゴン自体を表します。たとえば、Element 1、Ring 1は、ジオメトリの1つ目の外部ポリゴンを示します。Element 1、Ring 2は、1つ目の外部ポリゴンの1つ目の内部ポリゴンを示し、Element 1、Ring 3は、2つ目の内部ポリゴンを示します。ジオメトリが複数のポリゴンである場合、2つ目の外部ポリゴンは、Element 2、Ring 1で表されます。2つ目の外部ポリゴンに関連付けられた内部ポリゴンがある場合、その1つ目の内部ポリゴンはElement 2、Ring 2で表されます。
エッジ: 1つのエッジは、2つの座標間の1本の直線セグメントを示します。Edge 1は、座標1と座標2の間のセグメントを示し、Edge 2は、座標2と座標3の間の直線セグメントを示します(以下同様に続きます)。ジオメトリの検査でエッジのエラーが最も発生しやすいのは、自己交差ポリゴンを含むジオメトリです。(Open Geospatial Consortiumシンプル・フィーチャ仕様では、ポリゴンの自己交差は許可されていません。)このような場合、Oracleではエラー13349 (ポリゴンの境界が自己交差している)が報告され、自己交差の発生している要素、輪およびエッジの番号が示されます。
最適化された矩形の範囲が経度で119度を越えている場合にエラー13351 (共有エッジ)が戻されても、この矩形に対する問合せには、正しい結果を戻すものもあります(「測地MBR」を参照)。
例
次の例では、(意図的に無効な状態で作成された)cola_invalid_geom
という名前のジオメトリを検査します。
-- Validate; provide context if invalid SELECT c.name, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.shape, 0.005) FROM cola_markets c WHERE c.name = 'cola_invalid_geom'; NAME -------------------------------- SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(C.SHAPE,0.005) -------------------------------------------------------------------------------- cola_invalid_geom 13349 [Element <1>] [Ring <1>][Edge <1>][Edge <3>]
この例の出力で、13349は、「ORA-13349: ポリゴンの境界が自己交差しています。」
というエラーを示します。1つ目の要素の1つ目の輪に、交差しているエッジがあります。交差しているエッジは、Edge 1 (1番目の頂点と2番目の頂点)およびEdge 3 (3番目の頂点と4番目の頂点)です。