Oracle_spatial的函數

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; SELECT ct.gwm_fid, ct.name FROM i_exch_s ct, sales_regions comp WHERE SDO_GEOM.RELATE(ct.gwm_geometry, 'ANYINTERACT', comp.geom, 0.5) = 'INSIDE' AND comp.gwm_fid = 50076218 ORDER BY ct.gwm_fid; --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 SDO_GEOM.WITHIN_DISTANCE( geom1 IN SDO_GEOMETRY, dist IN NUMBER, geom2 IN SDO_GEOMETRY, tol IN NUMBER [, units IN VARCHAR2] ) RETURN VARCHAR2;   參數說明:     sdo_Geometry1,sdo_Geometry2爲空間數據對應的幾何對象。     Tolerance: 容許的精度範圍;     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 [, params IN VARCHAR2] ) 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' AND c_d.name = 'cola_d'; SELECT ct.gwm_fid, ct.name 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 ORDER BY ct.gwm_fid; 在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 WHERE comp.gwm_fid = 52065726 AND SDO_WITHIN_DISTANCE(ct.gwm_geometry, comp.gwm_geometry, 'distance=50') = 'TRUE' ORDER BY ct.gwm_fid; 對於三維的大地測量幾何體,計算的距離通常是二維的距離 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; --將以上兩個合併爲一個 SELECT ct.id, ct.name FROM sales_regions sr, competitors_sales_regions csr, customers ct WHERE csr.id = 2 AND sr.id = 6 AND SDO_RELATE(ct.location, SDO_GEOM.SDO_DIFFERENCE(csr.geom, sr.geom, 0.5), 'mask=anyinteract') = 'TRUE' ORDER BY ct.id; 5.4 SDO_XOR --不被共享的客戶 SELECT count(*) FROM (SELECT SDO_GEOM.SDO_XOR(a.geom, b.geom, 0.5) geom FROM sales_regions srb, sales_regions sra 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 WHERE m.table_name = 'COLA_MARKETS' AND m.column_name = 'SHAPE' 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 FROM sales_regions sr; 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( geom1 IN SDO_GEOMETRY, dim1 IN SDO_DIM_ARRAY ) RETURN SDO_GEOMETRY; or SDO_GEOM.SDO_POINTONSURFACE( geom1 IN SDO_GEOMETRY, tol IN NUMBER ) RETURN SDO_GEOMETRY; 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 ) RETURN SDO_GEOMETRY; or SDO_GEOM.SDO_ARC_DENSIFY( geom IN SDO_GEOMETRY, tol IN NUMBER params IN VARCHAR2 ) RETURN SDO_GEOMETRY; -- Arc densification of the circle cola_d SELECT c.name, SDO_GEOM.SDO_ARC_DENSIFY(c.shape, m.diminfo, 'arc_tolerance=0.05') FROM cola_markets c, user_sdo_geom_metadata m WHERE m.table_name = 'COLA_MARKETS' AND m.column_name = 'SHAPE' AND c.name = 'cola_d'; 10、驗證函數(sdo_Geom.) 10.1 VALIDATE_GEOMETRY_WITH_CONTEXT SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT( Geometry IN SDO_GEOMETRY, DimInfo IN SDO_DIM_ARRAY --該參數指定了維度(範圍)和容差值的信息 ) RETURN VARCHAR2; or SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT( Geometry IN SDO_GEOMETRY, tolerance IN NUMBER ) RETURN VARCHAR2; 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, tolerance IN NUMBER ) RETURN SDO_GEOMETRY; 2、sdo_util.extract(只能提取二維) SDO_UTIL.EXTRACT( geometry IN SDO_GEOMETRY, --提取的對象 element IN NUMBER --提取哪個元素 [, ring IN NUMBER] --環號,可選 ) RETURN SDO_GEOMETRY; 3、sdo_util.append 在給定的容差值內,這個函數將兩個輸入的幾何體合成爲單個幾何體。 SDO_UTIL.APPEND( geom1 IN SDO_GEOMETRY, 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( geometry IN SDO_GEOMETRY ) RETURN NUMBER; 6、sdo_util.getvertices SDO_UTIL.GETVERTICES( geometry IN SDO_GEOMETRY ) 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 ) RETURN SDO_GEOMETRY; SELECT SDO_UTIL.CIRCLE_POLYGON(-71.34937, 42.46101, 100, 5) FROM DUAL; 8、SDO_UTIL.ELLIPSE_POLYGON 返回一個橢圓 SDO_UTIL.ELLIPSE_POLYGON( center_longitude IN NUMBER, center_latitude IN NUMBER, semi_major_axis IN NUMBER, semi_minor_axis IN NUMBER, azimuth IN NUMBER, arc_tolerance IN NUMBER ) RETURN SDO_GEOMETRY; 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 ) RETURN NUMBER; 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 DECLARE wkbgeom BLOB; wktgeom CLOB; val_result VARCHAR2(5); geom_result SDO_GEOMETRY; geom SDO_GEOMETRY; BEGIN 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( geometry IN SDO_GEOMETRY, threshold IN NUMBER tolerance IN NUMBER DEFAULT 0.0000005 ) RETURN SDO_GEOMETRY; SELECT SDO_UTIL.SIMPLIFY( SDO_GEOMETRY( 3302, -- line string, 3 dimensions (X,Y,M), 3rd is linear ref. dimension NULL, 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( geometry IN SDO_GEOMETRY, tolerance IN NUMBER ) RETURN SDO_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( geom1 IN SDO_GEOMETRY, geom2 IN SDO_GEOMETRY ) RETURN SDO_GEOMETRY; 17、sdo_util.sdo_reverse_linestring 倒轉一條線串中的頂點的順序 SDO_UTIL.REVERSE_LINESTRING( geometry IN SDO_GEOMETRY ) RETURN SDO_GEOMETRY; 18、sdo_util.sdo_polygontoline 將多邊形轉換爲線串幾何體 SDO_UTIL.POLYGONTOLINE( geometry IN SDO_GEOMETRY ) RETURN SDO_GEOMETRY; 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]); or SDO_LRS.DEFINE_GEOM_SEGMENT( geom_segment IN OUT SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY [, start_measure IN NUMBER, end_measure IN NUMBER]); 功能:根據起始點和終止點測量值計算出沒有測量的點 例子: -- Test the LRS procedures. DECLARE 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; BEGIN 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 WHERE a.route_name = 'Route1'; -- 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 ); INSERT INTO lrs_routes VALUES( 12, 'result_geom_2', result_geom_2 ); INSERT INTO lrs_routes VALUES( 13, 'result_geom_3', result_geom_3 ); END; 2、SDO_LRS.REDEFINE_GEOM_SEGMENT(過程) 語法: SDO_LRS.REDEFINE_GEOM_SEGMENT( geom_segment IN OUT SDO_GEOMETRY [, start_measure IN NUMBER, end_measure IN NUMBER]); or SDO_LRS.REDEFINE_GEOM_SEGMENT( geom_segment IN OUT SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY [, start_measure IN NUMBER, end_measure IN NUMBER]); 功能:重新定義幾何體(可進行單位轉換) 例子: -- Redefine geometric segment to "convert" miles to kilometers DECLARE geom_segment SDO_GEOMETRY; dim_array SDO_DIM_ARRAY; BEGIN 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 and insert geometries into table, to display later. UPDATE lrs_routes a SET a.route_geometry = geom_segment WHERE a.route_id = 1; END; 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 ) RETURN SDO_GEOMETRY; or SDO_LRS.CLIP_GEOM_SEGMENT( geom_segment IN SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, start_measure IN NUMBER, end_measure IN NUMBER ) RETURN SDO_GEOMETRY; 功能:截取指定的一段 例子: -- 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( geom_segment IN SDO_GEOMETRY, start_measure IN NUMBER, end_measure IN NUMBER, tolerance IN NUMBER DEFAULT 1.0e-8 ) RETURN SDO_GEOMETRY; or SDO_LRS.DYNAMIC_SEGMENT( geom_segment IN SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, start_measure IN NUMBER, end_measure IN NUMBER ) RETURN SDO_GEOMETRY; 用法與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, tolerance IN NUMBER DEFAULT 1.0e-8 ) RETURN SDO_GEOMETRY; or SDO_LRS.CONCATENATE_GEOM_SEGMENTS( geom_segment_1 IN SDO_GEOMETRY, dim_array_1 IN SDO_DIM_ARRAY, geom_segment_2 IN SDO_GEOMETRY, dim_array_2 IN SDO_DIM_ARRAY ) RETURN SDO_GEOMETRY; 功能:連接線串,例子見1 6、SDO_LRS.OFFSET_GEOM_SEGMENT 語法: SDO_LRS.OFFSET_GEOM_SEGMENT( geom_segment IN SDO_GEOMETRY, start_measure IN NUMBER, end_measure IN NUMBER, offset IN NUMBER, tolerance IN NUMBER DEFAULT 1.0e-8 [, unit IN VARCHAR2] ) RETURN SDO_GEOMETRY; or SDO_LRS.OFFSET_GEOM_SEGMENT( geom_segment IN SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, start_measure IN NUMBER, end_measure IN NUMBER, offset IN NUMBER [, unit IN VARCHAR2] ) RETURN SDO_GEOMETRY; 功能:指定的線段內進行偏移 例子: 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( geom_segment IN SDO_GEOMETRY, split_measure IN NUMBER, segment_1 OUT SDO_GEOMETRY, segment_2 OUT SDO_GEOMETRY); or SDO_LRS.SPLIT_GEOM_SEGMENT( geom_segment IN SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, split_measure IN NUMBER, segment_1 OUT SDO_GEOMETRY, segment_2 OUT SDO_GEOMETRY); 功能:將一個幾何體分爲兩個 例子見1 8、SDO_LRS.RESET_MEASURE(過程) 語法: SDO_LRS.RESET_MEASURE( geom_segment IN OUT SDO_GEOMETRY [, dim_array IN SDO_DIM_ARRAY]); 功能:將起始點到終止點的測量值都清空 例子: -- Reset geometric segment measures. DECLARE geom_segment SDO_GEOMETRY; BEGIN SELECT a.route_geometry into geom_segment FROM lrs_routes a WHERE a.route_name = 'Route1'; SDO_LRS.RESET_MEASURE (geom_segment); -- Update and insert geometries into table, to display later. UPDATE lrs_routes a SET a.route_geometry = geom_segment WHERE a.route_id = 1; END; 9、SDO_LRS.SET_PT_MEASURE 語法: SDO_LRS.SET_PT_MEASURE( geom_segment IN OUT SDO_GEOMETRY, point IN SDO_GEOMETRY, measure IN NUMBER) RETURN VARCHAR2; or SDO_LRS.SET_PT_MEASURE( geom_segment IN OUT SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, point IN SDO_GEOMETRY, pt_dim_array IN SDO_DIM_ARRAY, measure IN NUMBER) RETURN VARCHAR2; or SDO_LRS.SET_PT_MEASURE( point IN OUT SDO_GEOMETRY, measure IN NUMBER) RETURN VARCHAR2; or SDO_LRS.SET_PT_MEASURE( point IN OUT SDO_GEOMETRY, dim_array IN SDO_DIM_ARRAY, measure IN NUMBER) RETURN VARCHAR2; 功能:將測量值設爲一個特定的點 -- Set the measure value of point 8,10 to 20 (originally 22). DECLARE geom_segment SDO_GEOMETRY; dim_array SDO_DIM_ARRAY; result VARCHAR2(32); BEGIN 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'; -- Set the measure value of point 8,10 to 20 (originally 22). 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); END; 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]); or SDO_MIGRATE.TO_CURRENT( tabname IN VARCHAR2, column_name IN VARCHAR2 [, commit_int IN NUMBER]); Format (Single Object-Relational Model Geometry to Current) SDO_MIGRATE.TO_CURRENT( geom IN SDO_GEOMETRY, dim IN SDO_DIM_ARRAY ) RETURN SDO_GEOMETRY; Format (Any Relational Model Implementation to Current) SDO_MIGRATE.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');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章