Oracle_spatial的函數
一sdo_Geom包的函數:
用于表示兩個幾何對象的關系(結果為True/False)的函數:RELATE,WITHIN_DISTANCE
驗證的函數:VALIDATE_GEOMETRY_WITH_CONTEXT,
VALIDATE_LAYER_WITH_CONTEXT
單個對象操作的函數:SDO_ARC_DENSIFY, SDO_AREA,SDO_BUFFER,SDO_
CENTROID,SDO_CONVEXHULL, SDO_LENGTH,SDO_MAX_MBR_
ORDINATE, SDO_MIN_MBR_ORDINATE,SDO_MBR,SDO_POINTONSURFACE
需兩個對象操作操作的函數:SDO_DISTANCE,SDO_DIFFERENCE,SDO_INTERSECTION,SDO_UNION,SDO_XOR
1、sdo_Geom.Relate
sdo_Geom.Relate(sdo_Geometry1, ‘MASK’, sod_Geometry2, tolerance ):用于判斷一個幾何體與另一個幾何體的關系,我們用于判斷目前點是否在某一個面(省份面、縣市面、鄉鎮面)上。
參數說明:
sdo_Geometry1,sdo_Geometry2為空間資料對應的幾何對象。
Tolerance: 容許的精度範圍;
MASK參數:
Anyinteract: sdo_Geometry2落在sdo_Geometry1面上包括在邊上。
Contains: sdo_Geometry2完全包含在sdo_Geometry1幾何對象中,并且兩個幾何對象的邊沒有交叉。
Coveredby: sdo_Geometry1完全包含在sdo_Geometry2中,并且這兩個幾何對象的邊有一個或多個點互相重疊。
Covers: sdo_Geometry2完全包含在sdo_Geometry1中,并且這兩個幾何對象的邊有一個或多個點互相重疊。
Disjoint: 兩個幾何沒有重疊交叉點,也沒有共同的邊。
Equal: 兩個幾何是相等的。
Inside: sdo_Geometry1完全包含在sdo_Geometry2幾何對象中,并且兩個幾何對象的邊沒有交叉。
On: sdo_Geometry1的邊和内部的線完全在sdo_Geometry2上。
Overlapbdydisjoint: 兩個幾何對象交疊,但是邊沒有交叉。
Overlapbdyintersect: 兩個幾何對象交疊,并且邊有部分交叉。
Touch: 兩個幾何對象有共同的邊,但沒有交叉。
SELECT ct.gwm_fid, ct.name
FROM i_exch_s ct, sales_regions comp
WHERE SDO_GEOM.RELATE(ct.gwm_geometry, 'INSIDE', comp.geom, 0.5) = 'INSIDE'
AND comp.gwm_fid = 50076218
ORDER BY ct.gwm_fid;
WHERE SDO_GEOM.RELATE(ct.gwm_geometry, 'ANYINTERACT', comp.geom, 0.5) =
'INSIDE'
--RELATE函數補充SDO_RELATE操作符
SELECT sra.gwm_fid,
SDO_GEOM.RELATE(sra.geom, 'DETERMINE', srb.geom, 0.5) relationship
FROM sales_regions srb, sales_regions sra
WHERE srb.gwm_fid = 50076218
AND sra.gwm_fid <> 50076218
AND SDO_RELATE(sra.geom,
srb.geom,
'mask=TOUCH+OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT') =
'TRUE'
ORDER BY sra.gwm_fid;
2、SDO_GEOM. WITHIN_DISTANCE
SDO_GEOM.WITHIN_DISTANCE(
geom1 IN SDO_GEOMETRY,
dim1 IN SDO_DIM_ARRAY,
dist IN NUMBER,
geom2 IN SDO_GEOMETRY,
dim2 IN SDO_DIM_ARRAY
[, units IN VARCHAR2]
) RETURN VARCHAR2;
or
tol IN NUMBER
) RETURN VARCHAR2;
Dist: 指定的距離;
Unit: 用于表示距離的機關,可能是Unit=M/ Unit=KM等長度機關,但必須是SDO_DIST_UNITS表中列舉出來的機關之一。
SELECT SDO_GEOM.WITHIN_DISTANCE(c_b.shape,
m.diminfo,
1,
c_d.shape,
m.diminfo)
FROM cola_markets c_b, cola_markets c_d, user_sdo_geom_metadata m
WHERE m.table_name = 'COLA_MARKETS'
AND m.column_name = 'SHAPE'
AND c_b.name = 'cola_b'
AND c_d.name = 'cola_d';
SELECT sdo_geom.within_distance(c.shape,50,d.shape,'0.5')
FROM cola_markets c,cola_markets d
WHERE c.name = 'cola_d' and d.name='cola_c';
3、sdo_Geom.SDO_BUFFER
SDO_BUFFER
(
geometry IN SDO_GEOMETRY,
distance IN NUMBER,
tolerance IN NUMBER
[, params IN VARCHAR2]
)
RETURNS an SDO_GEOMETRY
其中
geometry是一個參數,表示将被緩沖的SDO_GEOMETRY對象。
distance是一個參數,表示緩沖輸入的幾何體的數值距離。
tolerance是一個參數,表示容差。
params是一個可選的第四個參數,表示兩個參數:unit=和arc_ tolerance=。
unit=參數表示距離的機關。你可以通過查閱MDSYS.SDO_DIST_UNITS表來獲得機關的可能取值。
如果幾何體是大地測量的(也就是說,如果幾何體的SDO_SRID被指派為大地測量SRID,如8307或者8625),那麼 arc_tolerance=參數就是必須的。在大地測量的空間裡,弧度是不允許的。然而,它們可以近似地用線 表示。弧線的容差參數表示弧線與它的近似線的最大距離。
注:弧線容差通常要大于幾何體的容差。
在大地測量資料中,容差是以米為機關來指定的。而arc_tolerance總是使用parameter_string中指定的機關。
例子:
--建立表
CREATE TABLE sales_regions AS
SELECT gwm_fid,
SDO_GEOM.SDO_BUFFER(b.gwm_geometry,
0.25,
0.5,
'arc_tolerance=0.005') geom
FROM i_exch_s b where rownum<10;
由于i_exch_s表中的srid為null,是以arc_tolerance不能指定機關
--插中繼資料
INSERT INTO user_sdo_geom_metadata
SELECT 'SALES_REGIONS', 'GEOM', diminfo, srid
FROM user_sdo_geom_metadata
WHERE table_name = 'I_EXCH_S'
--建空間索引
CREATE INDEX sr_sidx ON sales_regions(geom) INDEXTYPE IS mdsys.spatial_index;
4、sdo_Geom.SDO_DISTANCE
SDO_DISTANCE函數的文法如下:
SDO_DISTANCE
geometry1 IN SDO_GEOMETRY,
geometry2 IN SDO_GEOMETRY,
tolerance IN NUMBER
)
RETURNS a NUMBER
geometry1和geometry2是起始的兩個參數,它們表示SDO_GEOMETRY對象。
tolerance表示資料集的容差。對于大地測量的資料,它們通常是0.5或者0.1(0.5米或者是0.1米)。對于非大地測量的資料,它将被設定為合适的值,來避免四舍五入引起的錯誤。
params是可選的第四個參數,是形如'unit='的字元串。這個參數指定了傳回距離的機關。可以通過檢視MDSYS.SDO_DIST_UNITS表獲得可能的機關值。
-- Return the distance between two geometries.
SELECT SDO_GEOM.SDO_DISTANCE(c_b.shape, c_d.shape, 0.005)
FROM cola_markets c_b, cola_markets c_d
WHERE c_b.name = 'cola_b'
FROM i_exch_s comp, l_interest_s ct
WHERE comp.gwm_fid = 52065726
AND SDO_GEOM.SDO_DISTANCE(ct.gwm_geometry, comp.gwm_geometry, 0.5 /*',unit=mile'*/) < 50
在SQL中使用帶有SDO_WITHIN_DISTANCE空間操作符的SDO_DISTANCE函數
SELECT ct.gwm_fid,
ct.name,
SDO_GEOM.SDO_DISTANCE(ct.gwm_geometry,
comp.gwm_geometry,
0.5 /*,'unit=yard'*/) distance
FROM i_exch_s comp, l_interest_s ct
AND SDO_WITHIN_DISTANCE(ct.gwm_geometry,
comp.gwm_geometry,
'distance=50') = 'TRUE'
對于三維的大地測量幾何體,計算的距離通常是二維的距離
5、幾何組合函數(sdo_Geom.)
A SDO_INTERSECTION B:傳回A和B共有的區域。
A SDO_UNION B:傳回A和B覆寫的區域的并。
A SDO_DIFFERENCE B:傳回被A覆寫的但是不被B覆寫的區域。
A SDO_XOR B:傳回A和B不相交的區域。這個函數與(A SDO_UNION B) SDO_DIFFERENCE (A SDO_INTERSECTION B)是等同的。
每一個函數都有如下文法:
SDO_
Geometry_A IN SDO_GEOMETRY,
Geometry_B IN SDO_GEOMETRY,
Tolerance IN NUMBER
RETURNS SDO_GEOMETRY
Geometry_A 和Geometry_B是SDO_GEOMETRY對象(擁有相同的SRID)。
Tolerance是幾何對象的容內插補點
注:
在Oracle 11g中,幾何函數隻适用于二維幾何體。你不能對兩個三維對象進行并操作
5.1 SDO_INTERSECTION
CREATE TABLE sales_intersection_zones AS
SELECT sra.gwm_fid id1,
srb.gwm_fid id2,
SDO_GEOM.SDO_INTERSECTION(sra.geom, srb.geom, 0.5) intsxn_geom
FROM sales_regions srb, sales_regions sra
WHERE sra.gwm_fid <> srb.gwm_fid
AND SDO_RELATE(sra.geom, srb.geom, 'mask=anyinteract') = 'TRUE';
5.2 SDO_UNION
SELECT count(*)
FROM (SELECT SDO_GEOM.SDO_UNION(sra.geom, srb.geom, 0.5) geom
FROM sales_regions srb, sales_regions sra
WHERE sra.gwm_fid = 50076211
and srb.gwm_fid = 50076218) srb,
i_exch_s sra
WHERE SDO_RELATE(sra.gwm_geometry, srb.geom, 'mask=anyinteract') = 'TRUE';
CREATE TABLE sales_region_coverage (coverage SDO_GEOMETRY);
DECLARE
coverage SDO_GEOMETRY := NULL;
BEGIN
FOR g IN (SELECT geom FROM sales_regions) LOOP
coverage := SDO_GEOM.SDO_UNION(coverage, g.geom, 0.5);
END LOOP;
INSERT INTO sales_region_coverage values (coverage);
COMMIT;
END;
5.3 SDO_DIFFERENCE
SDO_DIFFERENCE函數是從第一個幾何體中減去第二個幾何體。結果,它傳回的是隻屬于第一個幾何體的區域。注意,它隻有在以下情況下才有意義:
第一個和第二個幾何體都必須有區域(也就是說,區域為多邊形,多重多邊形等)。
第二個幾何體是一個多邊形或者一條線并且第一個幾何體是一條線。
第一個幾何體是一個點。
如果這些條件不滿足,SDO_DIFFERENCE操作的結果是傳回第一個幾何體。
--競争對手區域2和銷售區域6的SDO_DIFFERENCE操作
CREATE TABLE exclusive_region_for_comp_2 AS
SELECT SDO_GEOM.SDO_DIFFERENCE(b.geom, a.geom, 0.5) geom
FROM sales_regions sr, competitors_sales_regions csr
WHERE csr.id = 2
and sr.id = 6;
--在競争對手的獨屬區域内确定客戶
SELECT ct.id, ct.name
FROM exclusive_region_for_comp_2 excl, customers ct
WHERE SDO_RELATE(ct.location, excl.geom, 'mask=anyinteract') = 'TRUE'
ORDER BY ct.id;
--将以上兩個合并為一個
FROM sales_regions sr, competitors_sales_regions csr, customers ct
AND sr.id = 6
AND SDO_RELATE(ct.location,
SDO_GEOM.SDO_DIFFERENCE(csr.geom, sr.geom, 0.5),
'mask=anyinteract') = 'TRUE'
5.4 SDO_XOR
--不被共享的客戶
FROM (SELECT SDO_GEOM.SDO_XOR(a.geom, b.geom, 0.5) geom
WHERE sra.id = 51
and srb.id = 43) srb,
customers sra
WHERE SDO_RELATE(sra.location, srb.geom, 'mask=anyinteract') = 'TRUE';
6、幾何分析函數(sdo_Geom.)
二維的或者三維的幾何體上使用這些函數。這些函數有如下的PL/SQL通用文法
Function_name
Geometry IN SDO_GEOMETRY,
tolerance IN NUMBER
[, units_params IN VARCHAR2]
RETURN NUMBER
Geometry表示将被分析的幾何體。
Tolerance表示在這個分析中的容差。
units_params是可選的第三個參數,表示傳回的面積、長度和體積的機關。這個參數的 形式是'unit='。可以檢視MDSYS.SDO_DIST_UNITS表的length函數和 MDSYS.SDO_AREA_UNITS表的面積函數獲得這些機關的可能取值
6.1 SDO_AREA
select name,sdo_geom.sdo_area(a.gwm_geometry,0.05) from p_region_area a;
6.2 SDO_LENGTH
此函數傳回一條線的長度和多邊形、平面和立方體的周長。對于點,這個函數傳回0。
select name,sdo_geom.sdo_length(a.gwm_geometry,0.05) from p_region_area a;
6.3 SDO_VOLUME
如果輸入的幾何體是三維的立方體或者是多重立方體,那麼這個函數将一個幾何體和一個容內插補點作為參數并且傳回體積。對所有其他的幾何體類型,這個函數傳回0。
7、MBR(最小邊界矩形) 函數 sdo_Geom.
7.1 SDO_MBR
SDO_GEOM.SDO_MBR(
geom IN SDO_GEOMETRY
[, dim IN SDO_DIM_ARRAY]
) RETURN SDO_GEOMETRY;
l SDO_MBR函數把SDO_GEOMETRY作為一個參數并且計算這個幾何體的MBR。它傳回的是一個SDO_GEOMETRY對象。
l 如果輸入的是一個點,那麼SDO_MBR函數傳回的是一個點幾何體。
l 如果輸入的是一條平行于X或Y軸的線串,那麼函數傳回一個線性幾何體。
否則,函數傳回輸入幾何體的MBR,将它作為一個SDO_GEOMETRY對象。
l 對于一個輸入的三維對象,SDO_MBR函數傳回一個範圍,也就是說,傳回這個三
維幾何體在三個次元上的最小值和最大值。
-- Return the minimum bounding rectangle of cola_d (a circle).
SELECT SDO_GEOM.SDO_MBR(c.shape, m.diminfo)
FROM cola_markets c, user_sdo_geom_metadata m
AND c.name = 'cola_d';
注:
SDO_AGGR_UNION, SDO_AGGR_CENTROID和SDO_CONVEXHULL這些函數隻能在二維幾何體上使用。
7.2SDO_MIN_MBR_ORDINATE與 SDO_MAX_MBR_ORDINATE
除了獲得兩個維數上的範圍,有時你可能對獲得指定的維數上的範圍感興趣。你可以通過SDO_MIN_MBR_ORDINATE和SDO_MAX_MBR_ORDINATE函數來獲得指定的維數上的範圍,這兩個函數傳回指定維數上幾何體的最小和最大坐标值。
也可以在三維對象上使用這些函數。
SELECT SDO_GEOM.SDO_MIN_MBR_ORDINATE(sr.geom, 1) min_extent,
SDO_GEOM.SDO_MAX_MBR_ORDINATE(sr.geom, 1) max_extent
FROM sales_regions sr;
SELECT SDO_GEOM.SDO_MIN_MBR_ORDINATE(sr.geom, 3) min_extent,
SDO_GEOM.SDO_MAX_MBR_ORDINATE(sr.geom, 3) max_extent
8、各種幾何分析函數 sdo_Geom.
Geometry IN SDO_GEOMETRY,
Tolerance IN NUMBER
RETURENS SDO_GEOMETRY
8.1 SDO_CONVEXHULL
--該函數可用于簡化面的頂點(與原來的面仍保持近似)
select name,sdo_geom.sdo_convexhull(a.gwm_geometry,0.5) from p_region_area a;
在Oracle 11g中,SDO_CONVEXHULL函數隻适用于二維的幾何體
8.2 SDO_CENTROID
在Oracle 11g中,SDO_CENTROID函數隻适用于二維的幾何體
點傳回的仍是一個點,線傳回的是空值,面傳回的是該面的質心。
8.3 SDO_POINTONSURFACE
既然一個多邊形的質心有可能在也有可能不在這個多邊形内,那麼在幾何體表面的其他點放置一個标簽也可能是有用的。在建立多邊形地圖的一些類型時,這個也是必要的。你可以通過使用SDO_POINTONSURFACE函數來得到這樣的點。
也可以在三維的幾何體上使用這個函數。
SDO_POINTONSURFACE函數的唯一保證是傳回的點在穿過的多邊形的邊界上或者内部(在目前的實作中,它實際傳回的是多邊形幾何體的SDO_ORDINATE_ARRAY中的第一個點)。
SDO_GEOM.SDO_POINTONSURFACE(
dim1 IN SDO_DIM_ARRAY
9、聚合函數 非免費 sdo_Geom.
SDO_AGGR_MBR 可用于三維幾何體;SDO_AGGR_UNION、SDO_AGGR_CENTROID和SDO_CONVEXHULL函數隻适用于二維的幾何體
9.1 聚合MBR函數(SDO_AGGR_MBR)
假設你想找到SDO_GEOMETRY對象集覆寫的範圍(通常,在建立索引之前,需要使用這個資訊來填充USER_SDO_GEOM_METADATA視圖)
9.2 SDO_AGGR_UNION
聚合函數SDO_AGGR_UNION計算幾何體集合的并。并以SDO_GEOMETRY對象傳回。
9.3 SDO_AGGR_CONVEXHULL
如果所有輸入的幾何體的所有頂點是共線的或者如果隻有一個頂點(一個點),那麼SDO_AGGR_CONVEXHULL傳回空值
9.4 SDO_AGGR_CENTROID
SDO_AGGR_CENTROID函數允許你計算客戶任意組合的質心
10、SDO_GEOM.SDO_ARC_DENSIFY
SDO_GEOM.SDO_ARC_DENSIFY(
geom IN SDO_GEOMETRY,
dim IN SDO_DIM_ARRAY
params IN VARCHAR2
-- Arc densification of the circle cola_d
SELECT c.name,
SDO_GEOM.SDO_ARC_DENSIFY(c.shape, m.diminfo, 'arc_tolerance=0.05')
10、驗證函數(sdo_Geom.)
10.1 VALIDATE_GEOMETRY_WITH_CONTEXT
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(
Geometry IN SDO_GEOMETRY,
DimInfo IN SDO_DIM_ARRAY --該參數指定了次元(範圍)和容內插補點的資訊
tolerance IN NUMBER
10.2 VALIDATE_LAYER_WITH_CONTEXT
SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT(
geom_table IN VARCHAR2, --驗證的表
geom_column IN VARCHAR2, --驗證的列
result_table IN VARCHAR2 --驗證結果存放的表
[, commit_interval IN NUMBER]); --驗證結果每隔多少個送出一次
二sdo_util包的函數
1、sdo_util.remove_duplicate_vertices
删除重複的頂點
SDO_UTIL.REMOVE_DUPLICATE_VERTICES
geometry IN SDO_GEOMETRY,
2、sdo_util.extract(隻能提取二維)
SDO_UTIL.EXTRACT(
geometry IN SDO_GEOMETRY, --提取的對象
element IN NUMBER --提取哪個元素
[, ring IN NUMBER] --環号,可選
3、sdo_util.append
在給定的容內插補點内,這個函數将兩個輸入的幾何體合成為單個幾何體。
SDO_UTIL.APPEND(
geom2 IN SDO_GEOMETRY
) RETURN SDO_GEOMETRY
4、sdo_util.GetNumElem
擷取元素的數目(即由幾個元素組成)
SDO_UTIL.GETNUMELEM(
geometry IN SDO_GEOMETRY
) RETURN NUMBER;
5、sdo_util.GetNumVertices
擷取對象的頂點數目
SDO_UTIL.GETNUMVERTICES(
6、sdo_util.getvertices
SDO_UTIL.GETVERTICES(
) RETURN VERTEX_SET_TYPE;
7、SDO_UTIL.CIRCLE_POLYGON
傳回一個圓
SDO_UTIL.CIRCLE_POLYGON(
center_longitude IN NUMBER,
center_latitude IN NUMBER,
radius IN NUMBER,
arc_tolerance IN NUMBER
SELECT SDO_UTIL.CIRCLE_POLYGON(-71.34937, 42.46101, 100, 5) FROM DUAL;
8、SDO_UTIL.ELLIPSE_POLYGON
傳回一個橢圓
SDO_UTIL.ELLIPSE_POLYGON(
semi_major_axis IN NUMBER,
semi_minor_axis IN NUMBER,
azimuth IN NUMBER,
SELECT SDO_UTIL.ELLIPSE_POLYGON(-71.34937, 42.46101, 100, 50, 90, 5)FROM DUAL;
9、SDO_UTIL.CONVERT_UNIT
機關轉換
SDO_UTIL.CONVERT_UNIT(
input_value IN NUMBER,
from_unit IN VARCHAR2,
to_unit IN VARCHAR2
SELECT SDO_UTIL.CONVERT_UNIT(1, 'Radian', 'Degree') FROM DUAL;
10、wkt、wkb與geometry互轉與驗證
Ø SDO_UTIL.FROM_WKBGEOMETRY
Ø SDO_UTIL.FROM_WKTGEOMETRY
Ø SDO_UTIL.TO_WKBGEOMETRY
Ø SDO_UTIL.TO_WKTGEOMETRY
Ø SDO_UTIL.VALIDATE_WKBGEOMETRY
Ø SDO_UTIL.VALIDATE_WKTGEOMETRY
wkbgeom BLOB;
wktgeom CLOB;
val_result VARCHAR2(5);
geom_result SDO_GEOMETRY;
geom SDO_GEOMETRY;
SELECT c.shape INTO geom FROM cola_markets c WHERE c.name = 'cola_b';
-- To WBT/WKT geometry
wkbgeom := SDO_UTIL.TO_WKBGEOMETRY(geom);
wktgeom := SDO_UTIL.TO_WKTGEOMETRY(geom);
DBMS_OUTPUT.PUT_LINE('To WKT geometry result = ' || TO_CHAR(wktgeom));
-- From WBT/WKT geometry
geom_result := SDO_UTIL.FROM_WKBGEOMETRY(wkbgeom);
geom_result := SDO_UTIL.FROM_WKTGEOMETRY(wktgeom);
-- Validate WBT/WKT geometry
val_result := SDO_UTIL.VALIDATE_WKBGEOMETRY(wkbgeom);
DBMS_OUTPUT.PUT_LINE('WKB validation result = ' || val_result);
val_result := SDO_UTIL.VALIDATE_WKTGEOMETRY(wktgeom);
DBMS_OUTPUT.PUT_LINE('WKT validation result = ' || val_result);
END;
11、GML與GEOMETRY轉換
SDO_UTIL.TO_GMLGEOMETRY(
thegeom IN SDO_GEOMETRY
) RETURN CLOB;
SELECT TO_CHAR(SDO_UTIL.TO_GMLGEOMETRY(shape)) AS GmlGeometry
FROM COLA_MARKETS c
WHERE c.name = 'cola_b';
12、SDO_UTIL.SIMPLIFY
根據輸入的門檻值來簡化輸入的對象
SDO_UTIL.SIMPLIFY(
threshold IN NUMBER
tolerance IN NUMBER DEFAULT 0.0000005
SELECT SDO_UTIL.SIMPLIFY(
SDO_GEOMETRY(
3302, -- line string, 3 dimensions (X,Y,M), 3rd is linear ref. dimension
NULL,
SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
SDO_ORDINATE_ARRAY(
2,2,0, -- Starting point - Exit1; 0 is measure from start.
2,4,2, -- Exit2; 2 is measure from start.
8,4,8, -- Exit3; 8 is measure from start.
12,4,12, -- Exit4; 12 is measure from start.
12,10,NULL, -- Not an exit; measure automatically calculated and filled.
8,10,22, -- Exit5; 22 is measure from start.
5,14,27) -- Ending point (Exit6); 27 is measure from start.
),
6, -- threshold value for geometry simplification
0.5 -- tolerance
) FROM DUAL;
13、SDO_UTIL.RECTIFY_GEOMETRY
糾正有錯誤的對象并正确輸出
SDO_UTIL.RECTIFY_GEOMETRY(
SELECT SDO_UTIL.RECTIFY_GEOMETRY(shape, 0.005)
FROM COLA_MARKETS c WHERE c.name = 'cola_b';
14、SDO_UTIL.PREPARE_FOR_TTS與SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS
在不同的Oracle資料庫之間傳輸資料可通過表空間。而為了保證表空間上的表的空間索引也被傳輸,需要執行這些函數SDO_UTIL.PREPARE_FOR_TTS(在傳輸表空間前執行)與SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS(在表空間導出後執行)
例子:建立一個dmp檔案,從一個源資料庫中傳輸表空間tbs。
首先:從一個源資料庫中傳輸表空間tbs
Sqlplus spatial/ spatial
Execute SDO_UTIL.PREPARE_FOR_TTS(‘TBS’)
Connect system/manager as sysdba
Execute dbms_tts.transport_set_check(‘TBS’,true);
Alter tablespace TBS read only;
Exit;
Exp spatial/ spatial transport_ tablespace=y tablespaces=TBS file=trans_ts.dmp
然後導入
ixp spatial/ spatial transport_ tablespace=y file=trans_ts.dmp datafiles=’sdo_tts.dbf’ tablespaces=tbs
Sqlplus sys/password
Alter tablespace TBS read write;
Connect spatial/ spatial;
Exec SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS
15、sdo_util.extract3d
提取三維對象的元素
16、sdo_util.sdo_concat_lines
連接配接兩個線串
SDO_UTIL.CONCAT_LINES(
17、sdo_util.sdo_reverse_linestring
倒轉一條線串中的頂點的順序
SDO_UTIL.REVERSE_LINESTRING(
18、sdo_util.sdo_polygontoline
将多邊形轉換為線串幾何體
SDO_UTIL.POLYGONTOLINE(
15到18非免費
三 sdo_lrs包
Subprograms for Creating and Editing Geometric Segments
1、SDO_LRS.DEFINE_GEOM_SEGMENT(過程)
文法:
SDO_LRS.DEFINE_GEOM_SEGMENT(
geom_segment IN OUT SDO_GEOMETRY
[, start_measure IN NUMBER,
end_measure IN NUMBER]);
geom_segment IN OUT SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY
功能:根據起始點和終止點測量值計算出沒有測量的點
-- Test the LRS procedures.
geom_segment SDO_GEOMETRY;
line_string SDO_GEOMETRY;
dim_array SDO_DIM_ARRAY;
result_geom_1 SDO_GEOMETRY;
result_geom_2 SDO_GEOMETRY;
result_geom_3 SDO_GEOMETRY;
SELECT a.route_geometry into geom_segment FROM lrs_routes a
WHERE a.route_name = 'Route1';
SELECT m.diminfo into dim_array from
user_sdo_geom_metadata m
WHERE m.table_name = 'LRS_ROUTES' AND m.column_name = 'ROUTE_GEOMETRY';
-- Define the LRS segment for Route1. This will populate any null measures.
-- No need to specify start and end measures, because they are already defined in the geometry.
SDO_LRS.DEFINE_GEOM_SEGMENT (geom_segment, dim_array);
SELECT a.route_geometry INTO line_string FROM lrs_routes a
-- Split Route1 into two segments.
SDO_LRS.SPLIT_GEOM_SEGMENT(line_string,dim_array,5,result_geom_1,result_geom_2);
-- Concatenate the segments that were just split.
result_geom_3 := SDO_LRS.CONCATENATE_GEOM_SEGMENTS(result_geom_1, dim_array,
result_geom_2, dim_array);
-- Update and insert geometries into table, to display later.
UPDATE lrs_routes a SET a.route_geometry = geom_segment
WHERE a.route_id = 1;
INSERT INTO lrs_routes VALUES(
11,
'result_geom_1',
result_geom_1
);
12,
'result_geom_2',
result_geom_2
13,
'result_geom_3',
result_geom_3
2、SDO_LRS.REDEFINE_GEOM_SEGMENT(過程)
SDO_LRS.REDEFINE_GEOM_SEGMENT(
功能:重新定義幾何體(可進行機關轉換)
-- Redefine geometric segment to "convert" miles to kilometers
SELECT a.route_geometry into geom_segment FROM lrs_routes a WHERE a.route_name = 'Route1';
SELECT m.diminfo into dim_array from user_sdo_geom_metadata m WHERE m.table_name = 'LRS_ROUTES' AND m.column_name ='ROUTE_GEOMETRY';
-- "Convert" mile measures to kilometers (27 * 1.609 = 43.443).
SDO_LRS.REDEFINE_GEOM_SEGMENT (geom_segment,
dim_array,
0, -- Zero starting measure: LRS segment starts at start of route.
43.443); -- End of LRS segment. 27 miles = 43.443 kilometers.
UPDATE lrs_routes a SET a.route_geometry = geom_segment WHERE a.route_id = 1;
3、SDO_LRS.CLIP_GEOM_SEGMENT
SDO_LRS.CLIP_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
start_measure IN NUMBER,
end_measure IN NUMBER,
tolerance IN NUMBER DEFAULT 1.0e-8
dim_array IN SDO_DIM_ARRAY,
end_measure IN NUMBER
功能:截取指定的一段
-- Clip a piece of Route1.
SELECT SDO_LRS.CLIP_GEOM_SEGMENT(route_geometry, 5, 10) FROM lrs_routes WHERE route_id = 1;
4、SDO_LRS.DYNAMIC_SEGMENT
SDO_LRS.DYNAMIC_SEGMENT(
用法與SDO_LRS.CLIP_GEOM_SEGMENT一樣
5、 SDO_LRS.CONCATENATE_GEOM_SEGMENTS
SDO_LRS.CONCATENATE_GEOM_SEGMENTS(
geom_segment_1 IN SDO_GEOMETRY,
geom_segment_2 IN SDO_GEOMETRY,
dim_array_1 IN SDO_DIM_ARRAY,
dim_array_2 IN SDO_DIM_ARRAY
功能:連接配接線串,例子見1
6、SDO_LRS.OFFSET_GEOM_SEGMENT
SDO_LRS.OFFSET_GEOM_SEGMENT(
offset IN NUMBER,
[, unit IN VARCHAR2]
offset IN NUMBER
功能:指定的線段内進行偏移
SELECT SDO_LRS.OFFSET_GEOM_SEGMENT(a.route_geometry, m.diminfo, 5, 10, 2)
FROM lrs_routes a, user_sdo_geom_metadata m
WHERE m.table_name = 'LRS_ROUTES'
AND m.column_name = 'ROUTE_GEOMETRY'
AND a.route_id = 1;
7、SDO_LRS.SPLIT_GEOM_SEGMENT(過程)
SDO_LRS.SPLIT_GEOM_SEGMENT(
split_measure IN NUMBER,
segment_1 OUT SDO_GEOMETRY,
segment_2 OUT SDO_GEOMETRY);
功能:将一個幾何體分為兩個
例子見1
8、SDO_LRS.RESET_MEASURE(過程)
SDO_LRS.RESET_MEASURE(
[, dim_array IN SDO_DIM_ARRAY]);
功能:将起始點到終止點的測量值都清空
-- Reset geometric segment measures.
SDO_LRS.RESET_MEASURE (geom_segment);
9、SDO_LRS.SET_PT_MEASURE
SDO_LRS.SET_PT_MEASURE(
point IN SDO_GEOMETRY,
measure IN NUMBER) RETURN VARCHAR2;
pt_dim_array IN SDO_DIM_ARRAY,
point IN OUT SDO_GEOMETRY,
功能:将測量值設為一個特定的點
-- Set the measure value of point 8,10 to 20 (originally 22).
result VARCHAR2(32);
result := SDO_LRS.SET_PT_MEASURE (geom_segment,
SDO_GEOMETRY(3301, NULL, NULL,
SDO_ELEM_INFO_ARRAY(1, 1, 1),
SDO_ORDINATE_ARRAY(8, 10, 22)),
20);
-- Display the result.
DBMS_OUTPUT.PUT_LINE('Returned value = ' || result);
10、SDO_LRS.REVERSE_MEASURE
11、SDO_LRS.TRANSLATE_MEASURE
12、SDO_LRS.REVERSE_GEOMETRY
Subprograms for Querying and Validating Geometric Segments
13、SDO_LRS.VALID_GEOM_SEGMENT
14、SDO_LRS.VALID_LRS_PT
15、SDO_LRS.VALID_MEASURE
16、SDO_LRS.CONNECTED_GEOM_SEGMENTS
17、SDO_LRS.GEOM_SEGMENT_LENGTH
18、SDO_LRS.GEOM_SEGMENT_START_PT
19、SDO_LRS.GEOM_SEGMENT_END_PT
20、SDO_LRS.GEOM_SEGMENT_START_MEASURE
21、SDO_LRS.GEOM_SEGMENT_END_MEASURE
22、SDO_LRS.GET_MEASURE
23、SDO_LRS.GET_NEXT_SHAPE_PT
24、SDO_LRS.GET_NEXT_SHAPE_PT_MEASURE
25、SDO_LRS.GET_PREV_SHAPE_PT
26、SDO_LRS.GET_PREV_SHAPE_PT_MEASURE
27、SDO_LRS.IS_GEOM_SEGMENT_DEFINED
28、SDO_LRS.IS_MEASURE_DECREASING
29、SDO_LRS.IS_MEASURE_INCREASING
30、SDO_LRS.IS_SHAPE_PT_MEASURE
31、SDO_LRS.MEASURE_RANGE
32、SDO_LRS.MEASURE_TO_PERCENTAGE
33、SDO_LRS.PERCENTAGE_TO_MEASURE
34、SDO_LRS.LOCATE_PT
35、SDO_LRS.PROJECT_PT
36、SDO_LRS.FIND_LRS_DIM_POS
37、SDO_LRS.FIND_MEASURE
38、SDO_LRS.FIND_OFFSET
39、SDO_LRS.VALIDATE_LRS_GEOMETRY
Subprograms for Converting Geometric Segments
40、SDO_LRS.CONVERT_TO_LRS_DIM_ARRAY
41、SDO_LRS.CONVERT_TO_LRS_GEOM
42、SDO_LRS.CONVERT_TO_LRS_LAYER
43、SDO_LRS.CONVERT_TO_STD_DIM_ARRAY
44、SDO_LRS.CONVERT_TO_STD_GEOM
45、SDO_LRS.CONVERT_TO_STD_LAYER
四、SDO_MIGRATE包
SDO_MIGRATE.TO_CURRENT
Format (Any Object-Relational Model Implementation to Current)
SDO_MIGRATE.TO_CURRENT(
tabname IN VARCHAR2
[, column_name IN VARCHAR2]);
tabname IN VARCHAR2,
column_name IN VARCHAR2
[, commit_int IN NUMBER]);
Format (Single Object-Relational Model Geometry to Current)
Format (Any Relational Model Implementation to Current)
layer IN VARCHAR2,
newtabname IN VARCHAR2,
gidcolumn IN VARCHAR2,
geocolname IN VARCHAR2,
layer_gtype IN VARCHAR2,
updateflag IN VARCHAR2);
EXECUTE SDO_MIGRATE.TO_CURRENT('ROADS');