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=<value_string>和arc_ tolerance=<value_number>。

unit=<value_string>參數表示距離的單位。你可以通過查閱MDSYS.SDO_DIST_UNITS表來獲得單位的可能取值。

如果幾何體是大地測量的(也就是說,如果幾何體的SDO_SRID被賦值為大地測量SRID,如8307或者8625),那么 arc_tolerance=<value_number>參數就是必須的。在大地測量的空間里,弧度是不允許的。然而,它們可以近似地用線 表示。弧線的容差參數表示弧線與它的近似線的最大距離。

注:弧線容差通常要大於幾何體的容差。

在大地測量數據中,容差是以米為單位來指定的。而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=<value_string>'的字符串。這個參數指定了返回距離的單位。可以通過查看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.

SDO_INTERSECTION B:返回A和B共有的區域。

SDO_UNION B:返回A和B覆蓋的區域的並。

SDO_DIFFERENCE B:返回被A覆蓋的但是不被B覆蓋的區域。

SDO_XOR B:返回A和B不相交的區域。這個函數與(A SDO_UNION B) SDO_DIFFERENCE (A SDO_INTERSECTION B)是等同的。

每一個函數都有如下語法:

SDO_<set_theory_fn> 

(  

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=<value_string>'。可以查看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.

<Function_name>  

(  

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;

9SDO_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');

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM