【转】Oracle Spatial 空间分析操作函数——SDO_GEOM.RELATE
(2014-09-16 09:34:09)
标签:
oracle
spatial
sdo
geom
一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 )
< 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 ) distance
FROM i_exch_s comp, l_interest_s ct
WHERE comp.gw