摘自:Oracle Spatial for Oracle Database 11g
tolerance与几何体维度有关,每个空间图层的维度信息都记录在Oracle的元数据表中,通过USER_SDO_GEOM_METADATA视图中DIMINFO属性指定特定图层的每一维度的信息,包括维度的名称(如经度'Latitude')、维度的上下限以及每个维度的tolerance。
如下图:
简单的讲,Oracle spatial中tolerance决定了一个空间几何体是否有意义。
- 有两个空间几何体A和B,A是多边形,B是点。A和B之间的距离是d,如果d小于tolerance,B则被认为是最A的外边界上,如果d>=tolerance,A和B则被认为是disjoint的,也就是不相交的;
- 如果p和s的垂直距离(或水平距离)小于tolerance,则p和s被认为是两个重复的顶点,oracle spatial不允许一个几何体内有两个重复顶点,所以几何体A会被认为是无效的。如果垂直距离(或水平距离)大于等于tolerance,顶点就被认为是可区分的,几何体A也就被认为是一个有效的oracle spaital几何体。
作为一个通用规则,tolerance的值应该被设置为你的应用中的最小可区分距离,大多数应用中这个距离对应着两个独立坐标值之差的一半。例如如果你的应用中最靠近的两个点某个维度的坐标值分别为0.1和0.2,你就可以将tolerance设为 (0.2-0.1)/2 = 0.05。这确保了任意两个点都是可区分的。注意tolerance与坐标值的单位相同。
这个技巧可直接用在本地坐标系统(CAD/CAM应用中)和投影坐标系统中,但是对以地球表面建模的大地坐标系统(Geodetic)来说,两个不同位置经度差和纬度差与它们之间的实际距离并不一致。因此,大地坐标系统中tolerance的单位为米(虽然坐标单位为角度)。
有些空间函数在计算时可以额外指定一个tolerance。如果geometry列的数据类型是ST_GEOMETRY及其子类,tolerance默认为0.005;如果是SOD_GEOMETRY,Oracle将从USER_SDO_GEOM_METADATA视图中获得tolerance。
几何体的验证函数:
在进行空间查询时Oracle是不会主动验证的,因为性能代价太高了。
Oracle Spatial提供了两个验证函数(VALIDATE_GEOMETRY_WITH_CONTEXT和VALIDATE_LAYER_WITH_CONTEXT)以保证几何体数据的合法性。前者对单个的几何体进行验证,后者对一个表中的几何体进行验证。如果几何体有问题会返回一个错误字符串(例如坐标值超出范围)或者'FALSE',如果合法则返回'TRUE'。
这类函数使用tolerance判断一个geometry是否合法。tolerance有两种形式,一种是数字值,一种是DIMINFO对象值,后者可以在多个空间维度规定不同的tolerance,以及空间范围。
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT
(
geometry IN SDO_GEOMETRY,
tolerance IN NUMBER
) RETURN VARCHAR2;
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT
(
geometry IN SDO_GEOMETRY,
diminfo IN SDO_DIM_ARRAY
) RETURN VARCHAR2;
除了tolerance,验证标准还包括几何体是否与SDO_GTYPE类型一致,是否超出范围