· ArcSDE
從ArcSDE的Post Installation就可以看到,ArcSDE支援多種資料存放區方式,不但支援ESRI自身的ST_GEOMETRY,也支援BLOB和SDO_GEOMETRY類型。
圖 3 ArcSDE支援的儲存格式
1. ST_GEOMETRY
ArcSDE中的ST_GEOMETRY和Oracle Spatial中基於SDO_GEOMETRY的ST_GEOMETRY完全是不相干的兩個東西。首先讓我們來看一下ArcSDE中ST_GEOMETRY類型的定義:
CREATE OR REPLACE
Type st_geometry Authid current_user AS object
(entity integer,numpts integer,minx float(64),
miny float(64),maxx float(64),maxy float(64),
minz float (64),maxz float(64),minm float(64),
maxm float(64),area float(64),len float(64),
srid integer,points blob,
constructor Function st_geometry(geom_str clob,srid number) Return self AS result deterministic,
member Function st_area Return number,
member Function st_len Return number,
member Function st_length Return number,
member Function st_entity Return number,
member Function st_numpts Return number,
member Function st_minx Return number,
member Function st_maxx Return number,
member Function st_miny Return number,
member Function st_maxy Return number,
member Function st_minm Return number,
member Function st_maxm Return number,
member Function st_minz Return number,
member Function st_maxz Return number,
member Function st_srid Return number,
static Function get_release Return number) NOT final;
可見,一個ST_GEOMETRY中包含了一個幾何對象的x、y、z、m座標的範圍、空間參考id、實體個數和點個數、幾何對象的面積和長度、具體的節點座標等資訊。其中,節點座標屬性points比較特殊,這是一個blob類型的值。
讓我們開啟ST_GEOMETRY類型的建構函式就可以發現,事實上對幾何對象的構造是通過ST_GEOMETRY_SHAPELIB_PKG這個包進行處理的,而這個包事實上會調用ESRI的ST_SHAPELIB這個外部動態連結程式庫,我們可以看一下ST_GEOMETRY_SHAPELIB_PKG包裡的geometryfromtext這個預存程序,這個過程在ST_GEOMETRY的建構函式中被調用了:
Procedure geometryfromtext (shptxt IN clob,
…,
points IN Out blob )
AS
language c
name "GeometryFromText"
library st_shapelib
WITH CONTEXT
parameters (
CONTEXT,
shptxt ociloblocator, shptxt Indicator short,
…,
points ociloblocator, points Indicator short
);
再具體一點,比如我們建立了一個ST_POINT對象,我們可能比較關心在Oracle的層面到底上發生了些什麼事情?比如我們通過SQL執行了這樣一條語句:
SQL> select sde.st_point(1,1,0) from dual;
顯然,它會調用ST_POINT的建構函式,這個建構函式大體是這個樣子的:
constructor Function st_point(pt_x number,pt_y number,srid number)
Return self AS result
IS
…;
Begin
…;
geom_clob := 'POINT('||pt_x||' '||pt_y||')';
SDE.st_geometry_shapelib_pkg.geometryfromtext(geom_clob,spref_r.srid,spref_r.x_offset,spref_r.y_offset,spref_r.xyunits, spref_r.z_offset,spref_r.z_scale,spref_r.m_offset,spref_r.m_scale, spref_r.Definition,geom_type,shape.numpts,shape.entity,shape.minx,shape.miny, shape.maxx,shape.maxy,shape.minz,shape.maxz,shape.minm,shape.maxm, shape.area,shape.len,shape.points);
…;
End;
這個建構函式做了2件事情:一是通過參數構造了一個WKT[1]
表述的幾何對象字串;二是通過調用ST_SHAPELIB連結庫實現了從字串到幾何對象的轉化,返回的一系列值構成了ST_POINT對象。最後存在Oracle中的實際上是二進位對象:
SQL> select sde.st_point(1,1,0) from dual;
SDE.ST_POINT(1,1,0)(ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LEN, SRID, POINTS)
------------------------------------------------------------------------------------------------------------------------
ST_POINT(1, 1, 1, 1, 1, 1, NULL, NULL, NULL, NULL, 0, 0, 0, '0C0000000100000080A8B3D7AB1780A8B3D7AB17')
[1]
http://en.wikipedia.org/wiki/Well-known_text