Oracle   发布时间:2022-05-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Oracle_spatial的主要函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:http://www.cnblogs.com/lanzi/archive/2010/12/28/1918803.HTML

一、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'
<span style="white-space:pre">	</span>AND comp.gwm_fID = 50076218
ORDER BY ct.gwm_fID;
 
SELECT ct.gwm_fID,'ANYINteraCT',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,'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,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,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,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,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,'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_<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,0.5) intsxn_geom FROM SALEs_regions srb,SALEs_regions sra WHERE sra.gwm_fID <> srb.gwm_fID AND SDO_RELATE(sra.geom,'mask=anyinteract') = 'TRUE'; 5.2 SDO_UNION SELECT count(*) FROM (SELECT SDO_GEOm.SDO_UNION(sra.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,'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,SALEs_regions sra WHERE sra.ID = 51 and srb.ID = 43) srb,customers sra WHERE SDO_RELATE(sra.LOCATIOn,'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,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,'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,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,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,-- StarTing point - Exit1; 0 is measure from start. 2,4,-- Exit2; 2 is measure from start. 8,8,-- Exit3; 8 is measure from start. 12,12,-- Exit4; 12 is measure from start. 12,10,-- Not an exit; measure automatically calculated and filled. 8,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 [,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,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 [,end_measure IN numbER]); or SDO_lrs.redefine_GEOM_SEGMENT( geom_segment IN OUT SDO_GEOMETRY,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,-- 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,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,end_measure IN numbER ) RETURN SDO_GEOMETRY; 功能:截取指定的一段 例子: -- Clip a pIEce of Route1. SELECT SDO_lrs.CliP_GEOM_SEGMENT(route_geometry,10) FROM lrs_routes WHERE route_ID = 1; 4、SDO_lrs.DYNAMIC_SEGMENT 语法: SDO_lrs.DYNAMIC_SEGMENT( geom_segment IN SDO_GEOMETRY,tolerance IN numbER DEFAulT 1.0e-8 ) RETURN SDO_GEOMETRY; or SDO_lrs.DYNAMIC_SEGMENT( geom_segment IN SDO_GEOMETRY,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,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,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,offset IN numbER [,unit IN VARCHAR2] ) RETURN SDO_GEOMETRY; 功能:指定的线段内进行偏移 例子: SELECT SDO_lrs.OFFSET_GEOM_SEGMENT(a.route_geometry,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,segment_2 OUT SDO_GEOMETRY); 功能:将一个几何体分为两个 例子见1 8、SDO_lrs.@R_301_5990@_MEASURE(过程) 语法: SDO_lrs.@R_301_5990@_MEASURE( geom_segment IN OUT SDO_GEOMETRY [,dim_array IN SDO_DIM_ARRAy]); 功能:将起始点到终止点的测量值都清空 例子: -- @R_301_5990@ 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.@R_301_5990@_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,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; 功能:将测量值设为一个特定的点 -- 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,SDO_ORDINATE_ARRAY(8,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');

大佬总结

以上是大佬教程为你收集整理的Oracle_spatial的主要函数全部内容,希望文章能够帮你解决Oracle_spatial的主要函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: