Oracle Spacial(空间数据库)sdo_Geom包的函数
2017-11-30 09:08
585 查看
sdo_Geom包的函数:
SDO_GEOM (geometry) subprograms, except for thefollowing, which aresupported for both two-dimensional and three-dimensionalgeometries:
– SDO_GEOM.RELATE with the ANYINTERACT mask
– SDO_GEOM.SDO_AREA
– SDO_GEOM.SDO_DISTANCE
– SDO_GEOM.SDO_LENGTH
– SDO_GEOM.SDO_MAX_MBR_ORDINATE
– SDO_GEOM.SDO_MBR
– SDO_GEOM.SDO_MIN_MBR_ORDINATE
– SDO_GEOM.SDO_VOLUME
– SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT
– SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT
– SDO_GEOM.WITHIN_DISTANCE
■ SDO_SAM (spatial analysis and mining)subprograms
■ SDO_MIGRATE.TO_CURRENT procedure
用于表示两个几何对象的关系(结果为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
ORDERBY 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
ORDERBY 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'
ORDERBY sra.gwm_fid;
2、SDO_GEOM. WITHIN_DISTANCE
SDO_GEOM.WITHIN_DISTANCE(geom1 INSDO_GEOMETRY,
dim1 INSDO_DIM_ARRAY,
dist IN NUMBER,
geom2 INSDO_GEOMETRY,
dim2 INSDO_DIM_ARRAY
[, units IN VARCHAR2]
) RETURN VARCHAR2;
or
SDO_GEOM.WITHIN_DISTANCE(
geom1 INSDO_GEOMETRY,
dist IN NUMBER,
geom2 INSDO_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'andd.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中指定的单位。
例子:
--创建表
CREATETABLE 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
whererownum<10;
由于i_exch_s表中的srid为null,所以arc_tolerance不能指定单位
--插元数据
INSERTINTO user_sdo_geom_metadata
SELECT'SALES_REGIONS',
'GEOM', diminfo, srid
FROM user_sdo_geom_metadata
WHERE table_name =
'I_EXCH_S'
--建空间索引
CREATEINDEX sr_sidx
ON sales_regions(geom) INDEXTYPEIS 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
ORDERBY 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'
ORDERBY ct.gwm_fid;
对于三维的大地测量几何体,计算的距离通常是二维的距离
5、几何组合函数(sdo_Geom.)
A SDO_INTERSECTIONB:返回A和B共有的区域。A SDO_UNION B:返回A和B覆盖的区域的并。
A SDO_DIFFERENCEB:返回被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
CREATETABLE sales_intersection_zonesAS
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
SELECTcount(*)FROM (SELECT SDO_GEOM.SDO_UNION(sra.geom, srb.geom,
0.5) geom
FROMsales_regions srb, sales_regions sra
WHEREsra.gwm_fid =
50076211
andsrb.gwm_fid =
50076218) srb,
i_exch_s sra
WHERE SDO_RELATE(sra.gwm_geometry, srb.geom,
'mask=anyinteract') =
'TRUE';
CREATETABLE 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);
ENDLOOP;
INSERTINTO sales_region_coverage
values(coverage);
COMMIT;
END;
5.3 SDO_DIFFERENCE
SDO_DIFFERENCE函数是从第一个几何体中减去第二个几何体。结果,它返回的是只属于第一个几何体的区域。注意,它只有在以下情况下才有意义:第一个和第二个几何体都必须有区域(也就是说,区域为多边形,多重多边形等)。
第二个几何体是一个多边形或者一条线并且第一个几何体是一条线。
第一个几何体是一个点。
如果这些条件不满足,SDO_DIFFERENCE操作的结果是返回第一个几何体。
--竞争对手区域2和销售区域6的SDO_DIFFERENCE操作
CREATETABLE 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'
ORDERBY 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'
ORDERBY ct.id;
5.4 SDO_XOR
--不被共享的客户SELECTcount(*)
FROM (SELECT SDO_GEOM.SDO_XOR(a.geom, b.geom,
0.5) geom
FROMsales_regions srb, sales_regions sra
WHEREsra.id =
51
andsrb.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
selectname,sdo_geom.sdo_area(a.gwm_geometry,0.05)fromp_region_area a;
6.2SDO_LENGTH
此函数返回一条线的长度和多边形、平面和立方体的周长。对于点,这个函数返回0。selectname,sdo_geom.sdo_length(a.gwm_geometry,0.05)
fromp_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函数返回一个范围,也就是说,返回这个三
维几何体在三个维度上的最小值和最大值。
-- Returnthe 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'
ANDc.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
FROMsales_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
--该函数可用于简化面的顶点(与原来的面仍保持近似)selectname,sdo_geom.sdo_convexhull(a.gwm_geometry,0.5)
fromp_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 INSDO_GEOMETRY,
dim1 INSDO_DIM_ARRAY
) RETURN SDO_GEOMETRY;
or
SDO_GEOM.SDO_POINTONSURFACE(
geom1 INSDO_GEOMETRY,
tol IN NUMBER
) RETURNSDO_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视图)--找出某个面对象的边界值
SELECT SDO_GEOM.SDO_MBR(c.gwm_geometry, m.diminfo)
FROM P_STREET_AREA c, user_sdo_geom_metadata m
WHERE m.table_name =
'P_STREET_AREA'
AND m.column_name =
'GWM_GEOMETRY'
AND c.name =
'新海镇';
--找出某对象x的最大值
SELECT SDO_GEOM.SDO_MAX_MBR_ORDINATE(c.gwm_geometry, m.diminfo,1)
FROM P_STREET_AREA c, user_sdo_geom_metadata m
WHERE m.table_name =
'P_STREET_AREA'
AND m.column_name =
'GWM_GEOMETRY'
AND c.name =
'新海镇';
--找出某对象x的最小值
SELECT SDO_GEOM.SDO_MIN_MBR_ORDINATE(c.gwm_geometry, m.diminfo,1)
FROM P_STREET_AREA c, user_sdo_geom_metadata m
WHERE m.table_name =
'P_STREET_AREA'
AND m.column_name =
'GWM_GEOMETRY'
AND c.name =
'新海镇';
注:SDO_GEOM.SDO_MIN_MBR_ORDINATE中的最后一个参数代表维数,1即x,2代表y
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
) RETURNSDO_GEOMETRY;
-- Arcdensification 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 INNUMBER]); --验证结果每隔多少个提交一次
相关文章推荐
- Oracle Spacial(空间数据库)空间聚集函数
- Oracle Spacial(空间数据库)SDO_MIGRATE包函数
- ArcGIS——数据库空间SQL(一、oracle中使用sql空间查询及st_astext等函数出错问题)
- Oracle Spacial(空间数据库)geometry元数据结构
- Oracle Spacial(空间数据库)查询空间数据2
- Oracle Spacial(空间数据库)空间索引
- Oracle Spacial(空间数据库)sdo_util包的函数
- Oracle Spacial(空间数据库)查询模型和空间索引
- Oracle Spatial 空间分析操作函数——SDO_GEOM.RELATE
- Oracle Spacial(空间数据库)创建空间字段示例
- Oracle Spacial(空间数据库)常见的错误
- Oracle数据库之创建表空间与用户
- Oracle-数据库、表空间、用户、表之间关系以及创建
- Oracle - 数据库的实例、表空间、用户、表之间关系
- 数据库Oracle与Mysql语法对比:函数
- 创建oracle 数据库表空间,角色,用户的sql语句
- Oracle 空间数据库
- Oracle体系结构之-数据库、表空间、实例简介
- oracle 数据库表空间文件收缩
- Oracle数据库常用函数(1)