図2-4に、2つの要素(ポリゴンの外部および内部の輪)で構成されるジオメトリを示します。この例で内側の要素は、空間(穴)として扱われます。
図2-4に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。
SDO_GTYPE = 2003。2は2次元を示し、3はポリゴンを示します。
SDO_SRID = NULL。
SDO_POINT = NULL。
SDO_ELEM_INFO = (1,1003,1, 19,2003,1)。3つの値で構成される2つの要素(1,1003,1および19,2003,1)があります。
1003は、要素がポリゴンの外部の輪であることを示し、2003は、要素がポリゴンの内部の輪であることを示します。
19は、2番目の要素(ポリゴンの内部の輪)の縦座標の指定が、SDO_ORDINATES配列の19番目の数字から開始している(ここでは7であるため、第1の点は7,5であるという意味になる)ことを示します。
SDO_ORDINATES = (2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5)。
ポリゴンの面積(SDO_GEOM.SDO_AREAファンクション)は、ポリゴンの外部面積からポリゴンの内部面積を引きます。この例では、ポリゴンの面積は84(99 - 15)です。
ポリゴンの周囲(SDO_GEOM.SDO_LENGTHファンクション)は、ポリゴンの外部の周囲にポリゴンの内部の周囲を足します。この例では、ポリゴンの周囲は52.9193065(36.9193065 + 16)です。
例2-7 穴のあるポリゴンを挿入するSQL文
例2-7に、図2-4のジオメトリをデータベースに挿入するSQL文を示します。
INSERT INTO cola_markets VALUES( 10, 'polygon_with_hole', SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- polygon with hole SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5) ) );
そのような「穴のあるポリゴン」の例としては、中に湖がある広大な土地(国や島など)があります。もちろん、実際の広大な土地にはそのような内部ポリゴンが多数存在する場合があるので、それぞれに対して、SDO_ELEM_INFOの3つ値で構成される要素および座標指定が必要になります。
外部の輪と内部の輪はネストできません。たとえば、ある国に湖があり、湖に島がある(さらに島に湖もある)ような場合は、島に対して別のポリゴンを定義する必要があります。湖を示すポリゴン内部の輪の中に、ポリゴン内部の輪として島を定義することはできません。
複数のポリゴン(ポリゴンの集合)では、輪をポリゴンごとにグループ化し、各ポリゴンの最初の輪を外部の輪にする必要があります。たとえば、2つのポリゴン(AおよびB)を含むポリゴンの集合について考えてみます。
ポリゴンA(1つの内部の「穴」): 外部の輪A0、内部の輪A1
ポリゴンB(2つの内部の「穴」): 外部の輪B0、内部の輪B1、内部の輪B2
SDO_ELEM_INFOおよびSDO_ORDINATESの要素は、次のいずれかの順序で記述する必要があります(ポリゴンAとBのどちらを最初に指定するかによって異なります)。
A0, A1; B0, B1, B2
B0, B1, B2; A0, A1