一、空間表的中繼資料
將表的SDO_GEOMETRY列的所有對象作為一個空間層。Spatial需要對所有空間對象進行驗證、建立索引和查詢。此時需要為圖層指定適當的中繼資料,該資料包含如下資訊:維度、維度邊界、容差、座標系。每個圖層的上述資訊填充到USER_SDO_GEOM_METADATA字典試圖中。
SQL>DESCRIBE USER_SDO_GEOM_METADATA
USER_SDO_GEOM_METADATA視圖 |
列名 |
類型 |
列名描述 |
TABLE_NAME |
VARCHAR2() |
|
COLUMN_NAME |
VARCHAR2() |
|
SRID |
NUMBER |
|
DIMINFO |
MDSYS.SDO_DIM_ARRAY |
偉度資訊 |
|
|
|
SRID屬性:SRID是空間參考系ID。如果SDO_SRID為null,則沒有指定座標系統,如果SDO_SRID不為null,那麼它的值必須在在MDSYS.CS_SRS表中的 SRID 列有對應的值。
MDSYS.CS_SRS表 |
列名 |
類型 |
列名描述 |
CS_NAME |
VARCHAR2(68) |
座標系統名稱 |
SRID |
NUMBER(38) |
空間參考ID,為唯一值。1-999999為spatial使用的空間參考,1000000以後為使用者自訂 |
AUTH_SRID |
NUMBER(38) |
可選的SRID,是個外鍵。另一個座標系統的SRID |
DIMEINFO屬性:
SQL>DESCRIBE SDO_DIM_ARRAY
屬性的資料類型是MDSYS.SDO_DIM_ARRAY它是一個可變長的SDO_DIM_ELEMENT類型的數組。其大小由維度決定,對於一個二維幾何體,則包行兩個SDO_DIM_ELEMENT。
SDO_DIM_ELEMENT包含如下屬性:
SDO_DIMNAME表示該維度名稱,比如x,y
SDO_LB和SDO_UB 維度上限和下限,比如經度SDO_LB-180 SDO_UB 180.偉度經度SDO_LB-90 SDO_UB 90.
SDO_TOLERANCE,容差值,比如A和B兩點相差0.5,則認為是同一位置。
二、SDO_GEOMETRY資料類型
用數組,結構體或帶有建構函式,功能函數的類來定義自己的物件類型。這樣的物件類型能用於屬性列的資料類型,也能用來建立對象表。
而oracle spatial也正是基於此種特性所研發的一套空間資料處理系統.
spatial 的自訂資料類型有非常多,都在mdsys方案下,經常使用的是sdo_geometry類型。
sdo_geometry表示一個幾何對象,能是點、線、面、多點、多線、多面或混合對象。
spatial 在此資料類型的基礎上,實現了r樹空間索引和四叉樹空間索引,還以sql函數的形式實現了多種空間分析功能。
GEOLOC 定義結構如下:
CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
)
(1)、SDO_GTYPE:用四個數字定義了所有的形狀
第一位:維數如二維、三維對應的2和3
第二位:定義了LRS。一般是0;
最後兩位: 定義了地理對象的類型。現在使用從00到07
Value Geometry Description
00 UNKNOWN_GEOMETRY Spatial ignores this value
01 POINT A single point element
02 LINE or CURVE Contains one line string element that may be linear, curved or both
03 POLYGON Contains one polygon element with or without other polygon elements in it
04 COLLECTION A heterogeneous collection of elements
05 MULTIPOINT Contains one or more points
06 MULTILINE or MULTICURVE Contains one or more line string elements
07 MULTIPOLYGON Contains multiple polygon elements that maybe disjoint
比如一條線的SDO_GTYPE:2002
(2)、SDO_SRID:定義了空間座標參考系統。NULL為笛卡爾座標系。
If SDO_SRID is null, no coordinate system is associated with the geometry.
If SDO_SRID is not null, it must contain a value from the SRID column of the SDO_COORD_REF_SYS table,
and this value must be inserted into the SRID column of the USER_SDO_GEOM_METADATA view.
All geometries in a geometry column must have the same SDO_SRID value.
(3)、SDO_POINT:Oracle Spatial也可定義單個的點,SDO_POINT的定義:
CREATE TYPE sdo_point_type AS OBJECT (X NUMBER,Y NUMBER,Z NUMBER); 如果是二維,Z為NULL。
如果幾何類型為點類型的話,SDO_ELEM_INFO和SDO_ORDINATES對應的值都為Null,SDO_POINT不為空白。其它情況下,SDO_POINT會被Spatial所忽略即設為Null。如果這個層只有點對象,那麼推薦你將其儲存在SDO_POINT屬性中。
(3)、SDO_ELEM_INFO:定義了如何理解SDO_ORDINATES中的座標字串屬性。
第一個數:SDO_STARTING_OFFSET
第二個數:SDO_ETYPE
第三個數:SDO_INTERPRETATION
a、SDO_STARTING_OFFSET:聲明了組成當前幾何片段的第一個座標在SDO_ORDINATES數組中的座標序號。
座標序號是從1開始起算的而非從0開始。這裡的SDO_ORDINATES就是sdo_geometry 中的座標序列,
座標序列是已逗號隔開的數字,具體的計算如:sdo_ordinate_array(1,4,6,7,8,9)中如果以'6'開始幾何片段的話,
座標序號SDO_STARTING_OFFSET=3。
b、SDO_ETYPE :聲明元素的類型。可結合 SDO_STARTING_OFFSET和SDO_ETYPE 表來理解.
c、SDO_INTERPRETATION:可結合 SDO_STARTING_OFFSET和SDO_ETYPE 表來理解.
| SDO_ETYPE |
SDO_INTERPRETATION
|
組合含義 |
| 1 |
任何數(n) |
無 |
| 1 |
1 |
普通單點 |
| 1 |
n |
多點 |
| 2 |
1 |
直線段組成的多義線 |
| 2 |
2 |
曲線段組成的多義線 |
| 1003或者2003 |
1 |
系列直線段組成的多邊形 |
| 1003或者2003 |
2 |
系列曲線段組成的多邊形 |
| 1003或者2003 |
3 |
矩形 |
| 1003或者2003 |
4 |
圓 |
| 4 |
n(n>1) |
直線段和曲線段組成的複雜多義線 |
| 1005或者2005 |
n(n>1) |
直線段和曲線段組成的複雜多邊形 |
說明:
SDO_ETYPE 值 = 1, 2, 1003,或2003,說明幾何為簡單的幾何類型。可以全部按SDO_ELEM_INFO 屬性單元[即三個以逗號隔開的數]來理解sdo_ordinate_array中的座標序列。
SDO_ETYPE 值 = 1003 ,假如幾何類型為面,則表示為外多邊形環(以逆時針順序)
SDO_ETYPE 值 = 2003 ,假如幾何類型為面,則表示為內多邊形環(以順時針順序)
SDO_ETYPE 值 = 4,1005或2005,說明幾何為組合元素,往往第一個三數字組不是SDO_ELEM_INFO 屬性單元,而是為了說明組合元素的資訊。
SDO_ORDINATES:幾何圖形所有頂點列表。定義為 CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;
The SDO_ORDINATES attribute is defined using a varying length array (1048576) of NUMBER type
that stores the coordinate values that make up the boundary of a spatial object。比如構造一條直線A,B直線,其中A點座標X0,Y0。B座標X1,Y1,則SDO_ORDINATES儲存的順序是X0,Y0,X1,Y1。
參考列子: