I. 幾何對象
· Oracle Spatial
1. SDO_GEOMETRY
Oracle Spatial在MDSYS模式下定義了一系列幾何類型、函數來支援空間資料的儲存和使用,最為人耳熟能詳的就是SDO_GEOMETRY這種類型——當然,ArcSDE也可以使用這種類型進行儲存。讓我們首先來看一下SDO_GEOMETRY的定義:
CREATE OR REPLACE
TYPE SDO_GEOMETRY AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES SDO_ORDINATE_ARRAY,
MEMBER FUNCTION GET_GTYPE
RETURN NUMBER DETERMINISTIC,
MEMBER FUNCTION GET_DIMS
RETURN NUMBER DETERMINISTIC,
MEMBER FUNCTION GET_LRS_DIM
RETURN NUMBER DETERMINISTIC)
ALTER TYPE SDO_GEOMETRY
ADD MEMBER FUNCTION GET_WKB RETURN BLOB DETERMINISTIC,
ADD MEMBER FUNCTION GET_WKT RETURN CLOB DETERMINISTIC,
ADD MEMBER FUNCTION ST_CoordDim RETURN SMALLINT DETERMINISTIC,
ADD MEMBER FUNCTION ST_IsValid RETURN INTEGER DETERMINISTIC,
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkt IN CLOB,
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT,
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkt IN VARCHAR2,
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT,
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkb IN BLOB,
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT
CASCADE
其中的SDO_GTYPE屬性是一個4位的NUMBER類型對象,這個4位的數字表示了這個幾何對象的類型,讓我們來看看這4個數字如何來約定幾何類型。
這4個數位形式為“DLTT”,其中D代表維數,可以取值為2、3、4;L代表線性參考,如果沒有取值為0;TT代表幾何類型,取值為00到09,這00到09的取值也是有講究的,下表就是不同值對應的幾何類型:
DL00 |
UNKNOWN_GEOMETRY |
未知類型 |
DL01 |
POINT |
點 |
DL02 |
LINE or CURVE |
線/曲線 |
DL03 |
POLYGON or SURFACE |
面/曲面 |
DL04 |
COLLECTION |
其它任何幾何類型的集合 |
DL05 |
MULTIPOINT |
POINT的集合 |
DL06 |
MULTILINE or MULTICURVE |
LINE or CURVE的集合 |
DL07 |
MULTIPOLYGON or MULTISURFACE |
POLYGON or SURFACE的集合 |
DL08 |
SOLID |
實體,由若干個三維閉合的表面組成 |
DL09 |
MULTISOLID |
SOLID的集合 |
表
1 SDO_GTYPE的約定
SDO_GEOMETRY中的SDO_SRID屬性代表了幾何對象的座標系統,它要麼是空,要麼是一個在SDO_COORD_REF_SYS中定義的SRID值,比如我們最熟悉的4326等等。
SDO_GEOMETRY中的SDO_POINT屬性是一個SDO_POINT_TYPE類型的對象,這個類型很簡單:
CREATE OR REPLACE
TYPE SDO_POINT_TYPE AS OBJECT (
X NUMBER,
Y NUMBER,
Z NUMBER)
其實,SDO_POINT_TYPE類型對象就代表了一個點,而在SDO_GEOMETRY中,只有當SDO_ELEM_INFO和SDO_ORDINATES屬性都為空白的時候,這個SDO_POINT屬性才會被解析。事實上,從下面我們可以看到,SDO_ELEM_INFO和SDO_ORDINATES屬性才是一般存放幾何對象的地方。但是,Oracle建議如果是一個空間表中只有點資料,那麼使用SDO_POINT進行儲存會提高效能。不得不說,Oracle在這個地方的定義實在是有點不太優雅。
SDO_GEOMETRY的SDO_ELEM_INFO和SDO_ORDINATES屬性分別是SDO_ELEM_INFO_ARRAY和SDO_ORDINATE_ARRAY類型,這兩個類型都是存放NUMBER的數組。SDO_ELEM_INFO和SDO_ORDINATES屬性是要配合起來解析的:
SDO_ELEM_INFO指定了在SDO_ORDINATES屬性中儲存的座標形式應當如何解釋,依次每3個值一組,每個組代表一個“Element”,每組中的3個值分別是: SDO_STARTING_OFFSET、SDO_ETYPE、SDO_INTERPRETATION,SDO_STARTING_OFFSET代表了從SDO_ORDINATES中開始解析的座標序號;SDO_ETYPE和SDO_INTERPRETATION則配合起來解析(又一對需要配合起來解析屬性!):
SDO_ETYPE |
SDO_INTERPRETATION |
含義 |
0 |
任意值 |
不支援的類型,比如曲線和樣條曲線 |
1 |
1 |
點 |
1 |
0 |
有向點,除了實際點的座標,還包含虛擬指向方向 |
1 |
N>1 |
有n個點的點集 |
2 |
1 |
直線 |
2 |
2 |
圓弧構成的多段線,1、2、3點構成第一個圓弧,3、4、5點構成第二個圓弧… |
1003或2003 |
1 |
多邊形,最後一個點必須和第一個點相同以閉合 |
1003或2003 |
2 |
圓弧構成的多邊形,1、2、3點構成第一個圓弧,3、4、5點構成第二個圓弧… |
1003或2003 |
3 |
矩形,包含兩個點:左下角和右上方 |
1003或2003 |
4 |
圓形,包含3個在圓上的點 |
4 |
N>1 |
複合線,有些線段是直線,有些線段是圓弧 |
1005或2005 |
N>1 |
複合多邊形,有些線段是直線,有些線段是圓弧 |
表
2 SDO_ELEM_INFO的含義
SDO_ORDINATES屬性相對就簡單一點了,它就是記錄所有點座標的數組,具體如何解析和SDO_ETYPE有關,注意,對於多邊形來說,外環座標點應按逆時針排列,內環座標點應按順時針排列,且都需要閉合。Btw:SDO_ORDINATE的最大大小為1,048,576,因此,一個SDO_GEOMETRY對象最大的頂點數: 二維點524,288個,三維點349,525個,四維點262,144個。
OK,到此為止,Oracle Spatial對於SDO_GEOMETRY類型的描述算是基本結束了,是不是有點讓你感到混沌、還帶上一點戰戰兢兢的感覺?希望下面的這個圖可以讓你稍微減輕一點這種感覺:
圖 1 SDO_GEOMETRY的描述