Oracle Spatial操作geometry方法


Oracle Spatial中SDO_GEOMETRY類型:

CREATE 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_ORDINATES SDO_ORDINATE_ARRAY--存儲實際坐標,以X,Y以及不同點之間以逗號隔開

)

 

兩個對象之間關系:

RELATE

SDO_GEOM.RELATE --確定兩個對象的交互方式

eg:

SDO_GEOM.RELATE(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY,mask IN VARCHAR2, geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY) RETURN VARCHAR2;
SDO_GEOM.RELATE(geom1 IN SDO_GEOMETRY,mask IN VARCHAR2,geom2 IN SDO_GEOMETRY, tol IN NUMBER)RETURN VARCHAR2;--tol容許的精度范圍

mask:

ANYINTERACT:geom2落在geom1面上,包括邊上

CONTAINS:geom2完全包含在geom1幾何對象中,並且兩個幾何對象的邊沒有交叉

COVEREDBY:geom1完全包含在geom2中,並且兩個幾何對象的邊有一個或多個點相互重疊

COVERS:geom2完全包含在geom1中,並且兩個幾何對象的邊有一個或多個點相互重疊

DISJOINT:兩個幾何沒有重疊交叉點,也沒有共同的邊

EQUAL:兩個幾何相等

INSIDE:geom1完全包含在geom2幾何對象中,並且兩個幾何對象的邊沒有交叉

ON:geom1的邊和內部的線完全在geom2上

OVERLAPBDYDISJOINT:兩個幾何對象交迭,但是邊沒有交叉

OVERLAPBDYINTERSECT:兩個幾何對象叫迭,並且邊有部分交叉

TOUCH:兩個結合對象有共同的邊,但沒有交叉

 

WITHIN_DISTANCE

SDO_GEOM.WITHIN_DISTANCE --確定兩個幾何是否在彼此指定的距離之內

eg:

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;
SDO_GEOM.WITHIN_DISTANCE(geom1 IN SDO_GEOMETRY,dist IN NUMBER,geom2 IN SDO_GEOMETRY,tol IN NUMBER[, units IN VARCHAR2]) RETURN VARCHAR2;

 

驗證:

VALIDATE_GEOMETRY_WITH_CONTEXT

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT --確定幾何是否有效,如果幾何無效,則返回上下文信息

eg:

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(theGeometry IN SDO_GEOMETRY, theDimInfo IN SDO_DIM_ARRAY,conditional IN VARCHAR2 DEFAULT 'TRUE') RETURN VARCHAR2;
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(theGeometry IN SDO_GEOMETRY,tolerance IN NUMBER,conditional IN VARCHAR2 DEFAULT 'TRUE') RETURN VARCHAR2;

 

VALIDATE_LAYER_WITH_CONTEXT

SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT --確定存儲在列中的所有幾何是否有效,並返回有關任何無效幾何的上下文信息

eg:

SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT(geom_table IN VARCHAR2,geom_column IN VARCHAR2,result_table IN VARCHAR2,commit_interval IN NUMBER DEFAULT -1,conditional IN VARCHAR2 DEFAULT 'TRUE');

 

單對象操作:

SDO_ARC_DENSIFY

SDO_GEOM.SDO_ARC_DENSIFY --簡化,將圓弧簡化成由直線組成的近似多段線;將圓近似成N多邊形

eg:

SDO_GEOM.SDO_ARC_DENSIFY(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY, params IN VARCHAR2) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_ARC_DENSIFY(geom IN SDO_GEOMETRY,tol IN NUMBER, params IN VARCHAR2) RETURN SDO_GEOMETRY;

 

SDO_AREA

SDO_GEOM.SDO_AREA --計算多邊形的面積

eg:

SDO_GEOM.SDO_AREA(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY [, unit IN VARCHAR2]) RETURN NUMBER;
SDO_GEOM.SDO_AREA(geom IN SDO_GEOMETRY,tol IN NUMBER [, unit IN VARCHAR2]) RETURN NUMBER;

 

SDO_BUFFER

SDO_GEOM.SDO_BUFFER --在幾何體外部或內部生成緩沖區

eg:

SDO_GEOM.SDO_BUFFER(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY,dist IN NUMBER[, params IN VARCHAR2]) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_BUFFER(geom IN SDO_GEOMETRY,dist IN NUMBER,tol IN NUMBER[, params IN VARCHAR2]) RETURN SDO_GEOMETRY;

 

SDO_CENTROID

SDO_GEOM.SDO_CENTROID --計算多邊形的質心

eg:

SDO_GEOM.SDO_CENTROID(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_CENTROID(geom1 IN SDO_GEOMETRY,tol IN NUMBER) RETURN SDO_GEOMETRY;

 

SDO_CONVEXHULL

SDO_GEOM.SDO_CONVEXHULL --返回幾何對象的凸包的多邊形類型對象

eg:

SDO_GEOM.SDO_CONVEXHULL(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_CONVEXHULL(geom1 IN SDO_GEOMETRY, tol IN NUMBER) RETURN SDO_GEOMETRY;

 

SDO_LENGTH

SDO_GEOM.SDO_LENGTH --計算幾何的長度或周長

eg:

SDO_GEOM.SDO_LENGTH(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY[, unit IN VARCHAR2][, count_shared_edges IN NUMBER]) RETURN NUMBER;
SDO_GEOM.SDO_LENGTH(geom IN SDO_GEOMETRY,tol IN NUMBER[, unit IN VARCHAR2] [, count_shared_edges IN NUMBER]) RETURN NUMBER;

 

SDO_MAX_MBR_ORDINATE

SDO_GEOM.SDO_MAX_MBR_ORDINATE --返回幾何對象最小邊界矩形的指定縱坐標的最大值

eg:

SDO_GEOM.SDO_MAX_MBR_ORDINATE(geom IN SDO_GEOMETRY,ordinate_pos IN NUMBER) RETURN NUMBER;
SDO_GEOM.SDO_MAX_MBR_ORDINATE(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY,ordinate_pos IN NUMBER) RETURN NUMBER;

 

SDO_MIN_MBR_ORDINATE

SDO_GEOM.SDO_MIN_MBR_ORDINATE --返回幾何對象最小邊界矩形的指定縱坐標的最小值

eg:

SDO_GEOM.SDO_MIN_MBR_ORDINATE(geom IN SDO_GEOMETRY,ordinate_pos IN NUMBER ) RETURN NUMBER;
SDO_GEOM.SDO_MIN_MBR_ORDINATE(geom IN SDO_GEOMETRY,dim IN SDO_DIM_ARRAY,ordinate_pos IN NUMBER) RETURN NUMBER;

 

SDO_MBR

SDO_GEOM.SDO_MBR --返回幾何對象最小邊界矩形

eg:

SDO_GEOM.SDO_MBR(geom IN SDO_GEOMETRY[, dim IN SDO_DIM_ARRAY]) RETURN SDO_GEOMETRY;

 

SDO_POINTONSURFACE

SDO_GEOM.SDO_POINTONSURFACE --返回一個保證在多邊形表面上的點

eg:

SDO_GEOM.SDO_POINTONSURFACE(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_POINTONSURFACE(geom1 IN SDO_GEOMETRY,tol IN NUMBER) RETURN SDO_GEOMETRY;

 

SDO_VOLUME

SDO_GEOM.SDO_VOLUME --計算三維立體幾何體的體積

eg:

SDO_GEOM.SDO_VOLUME(geom IN SDO_GEOMETRY,tol IN NUMBER[, unit IN VARCHAR2]) RETURN NUMBER;

 

雙目標操作:

SDO_CLOSEST_POINTS

SDO_GEOM.SDO_CLOSEST_POINTS --計算兩個幾何之間的最小距離,並返回距離最小時在幾何上的兩點

eg:

SDO_GEOM.SDO_CLOSEST_POINTS(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY,tolerance IN NUMBER,unit IN VARCHAR2,dist OUT NUMBER,geoma OUT SDO_GEOMETRY,geomb OUT SDO_GEOMETRY);

 

SDO_DISTANCE

SDO_GEOM.SDO_DISTANCE --計算兩個幾何對象之間的距離

eg:

SDO_GEOM.SDO_DISTANCE(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY,geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY[, unit IN VARCHAR2]) RETURN NUMBER;
SDO_GEOM.SDO_DISTANCE(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY,tol IN NUMBER [, unit IN VARCHAR2]) RETURN NUMBER;

 

SDO_DIFFERENCE

SDO_GEOM.SDO_DIFFERENCE --返回幾何對象(兩個幾何對象的拓撲差異,MINUS操作)

eg:

SDO_GEOM.SDO_DIFFERENCE(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY,geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_DIFFERENCE(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY, tol IN NUMBER) RETURN SDO_GEOMETRY;

 

SDO_INTERSECTION

SDO_GEOM.SDO_INTERSECTION --返回幾何對象(兩個幾何對象的拓撲交點,AND操作)

eg:

SDO_GEOM.SDO_INTERSECTION(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY,geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_INTERSECTION(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY, tol IN NUMBER) RETURN SDO_GEOMETRY;

 

SDO_UNION

SDO_GEOM.SDO_UNION --返回幾何對象(兩個幾何對象的拓撲結合,OR操作)

eg:

SDO_GEOM.SDO_UNION(geom1 IN SDO_GEOMETRY,dim1 IN SDO_DIM_ARRAY, geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_UNION(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY, tol IN NUMBER ) RETURN SDO_GEOMETRY;

 

SDO_XOR

SDO_GEOM.SDO_XOR --返回幾何對象(兩個幾何對象的拓撲對稱差異,XOR操作)

eg:

SDO_GEOM.SDO_XOR(geom1 IN SDO_XOR,dim1 IN SDO_DIM_ARRAY,geom2 IN SDO_GEOMETRY,dim2 IN SDO_DIM_ARRAY) RETURN SDO_GEOMETRY;
SDO_GEOM.SDO_XOR(geom1 IN SDO_GEOMETRY,geom2 IN SDO_GEOMETRY, tol IN NUMBER ) RETURN SDO_GEOMETRY;

 

 

實例:

--wkt轉geometry
select sdo_geometry(TO_CHAR(SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(5, 5, 5, 7, 1, 7, 1, 1, 5, 1, 5, 3, 6, 3, 6, 5, 5, 5)).get_wkt())) from dual
--wkt轉geometry
select SDO_UTIL.from_wktgeometry(TO_CHAR(SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(5, 5, 5, 7, 1, 7, 1, 1, 5, 1, 5, 3, 6, 3, 6, 5, 5, 5)).get_wkt())) from dual
--geometry轉wkt
select TO_CHAR(SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(5, 5, 5, 7, 1, 7, 1, 1, 5, 1, 5, 3, 6, 3, 6, 5, 5, 5)).get_wkt()) from dual
--geometry轉wkt
select SDO_UTIL.to_wktgeometry_varchar(SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(5, 5, 5, 7, 1, 7, 1, 1, 5, 1, 5, 3, 6, 3, 6, 5, 5, 5))) from dual
--geometry轉wkt(不受oracle字段只能少於4000個字符長度影響)
select SDO_UTIL.to_wktgeometry(SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(5, 5, 5, 7, 1, 7, 1, 1, 5, 1, 5, 3, 6, 3, 6, 5, 5, 5))) from dual

 

--合並
select SDO_GEOM.SDO_UNION(SDO_GEOMETRY('POLYGON((1 1,5 1,5 5,1 5,1 1))'),SDO_GEOMETRY('POLYGON((2 2,2 3,3 3,3 2,2 2))'),0.001 ) from dual;
--緩沖區
select SDO_UTIL.to_wktgeometry_varchar(SDO_GEOM.SDO_BUFFER(SDO_GEOMETRY('POLYGON((1 1,5 1,5 5,1 5,1 1))'),1000,0.01)) from dual;
--點在面內
select SDO_GEOM.RELATE(SDO_GEOMETRY('POLYGON((1 1,5 1,5 5,1 5,1 1))'),'CONTAINS',SDO_GEOMETRY('POINT(12 2)'), 0.01) from dual;
--對象相交
select SDO_GEOM.RELATE(SDO_GEOMETRY('POLYGON((0 0,0 1,1 1,1 0,0 0))'),'ANYINTERACT',SDO_GEOMETRY('POLYGON((0.5 0.5,0.5 1.5,1.5 1.5,1.5 0.5,0.5 0.5))'), 0.01) from dual;

 

 

 


免責聲明!

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



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