接下来将描述如何对单个几何体进行深入分析。这些单个几何体在已有的表中以列的形式存储,或者是其他操作如合并和相交所得的结果。
6.3.4.1 面积、长度和体积函数
将先从用于计算输入的SDO_GEOMETRY对象的面积、长度和体积的函数开始。可以在一个二维的或者三维的几何体上使用这些函数。这些函数有如下的PL/SQL通用语法:其中,Geometry表示将被分析的几何体;tolerance表示在这个分析中的容差;units_params是可选的第三个参数,表示返回的面积、长度和体积单位。这个参数的形式是“unit=<value_string>”。可以查看MDSYS.SDO_DIST_UNITS表的length函数和MDSYS.SDO_ARES_UNITS表的面积函数获得这些单位的可能取值。体积函数没有类似的表。
这一类的函数主要有SDO_LENGTH、SDO_AREA和SDO_VOLUME。SDO_AREA函数计算SDO_GEOMETRY对象的面积;SDO_LENGTH返回一条线的长度和多边形、平面和立方体的周长,对于点,这个函数返回0。对于SDO_VOLUME,如果输入的几何体是三维的立方体或者是多重立方体,那么这个函数将一个几何体和一个容差值作为参数并且返回体积。对所有其他的几何体类型,这个函数返回0。
例如,计算sales_regions表中销售区域51和43相交区域的面积,其实现代码如下:
运行结果如图6-17所示。
图6-17 SDO_AREA函数使用示例
6.3.4.2 MBR函数
如果想在地图上显示一个几何体,通常需要确定一个范围——也就是指在每一个维度上的下界和上界。可以使用最小边界矩形(MBR)来达到这个目的。这个矩形通常是由左下角点(所有最小值)和右上角(所有最大值)确定。如图6-18所示是一个不同几何体MBR的例子。
图6-18 不同几何体的MBR(“☆”表示MBR的左下角和右上角点)
注意,几何体MBR经常要比原始的几何体覆盖更多的面积。对于一个点几何体,MBR也是一个点(也就是说,是一个退化的MBR,它的左下角和右上角点是一样的)。Oracle Spatial提供了一些函数来计算MBR和相关的组件。
1.SDO_MBR(www.xing528.com)
SDO_MBR函数把SDO_GEOMETRY作为一个输入参数,并计算这个几何体的MBR。它返回的是一个SDO_GEOMETRY对象。如果输入的是一个点,那么SDO_MBR函数返回的是一个点几何体。如果输入的是一条平行于X轴或Y轴的线串,那么函数返回一个线性几何体。否则,函数返回输入几何体的MBR,将它作为一个SDO_GEOMETRY对象。
2.SDO_MIN_MBR_ORDINATE和SDO_MAX_ORDINATE
除了获得两个维数上的范围,有时可能对获得指定的维数上的范围感兴趣。可以通过SDO_MIN_MBR_ORDINATE和SDO_MAX_ORDINATE函数来获得指定的维数上的范围,这两个函数返回指定维数上几何体的最小坐标值和最大坐标值。
6.3.4.3 其他各种分析函数
除了MBR函数之外,还有其他一些函数可以用来进行简单的几何分析,如计算质心或者计算凸包。每个函数都有如下的通用语法:
1.SDO_CONVEXHULL
SDO_CONVEXHULL函数计算一个SDO_GEOMETRY的凸包。MBR是对一个几何体对象非常粗糙的近似,一个较精确的近似是对象的凸包。对于一个几何体集,如果在这个集合中连接每一对点的线完全被包含在几何体中,那么这个几何体集是凸起的。一个几何体的凸包是最小的凸集,包含了整个几何体,因此,一个多边形的凸包通过消除凹定点(在这个地方,边界向内弯曲),在它的边界线内得到简化。例如:
2.SDO_CENTROID
假设想在地图上标记每一个相交区域的名字,把这个标签放在哪里合适呢?放置标签的一个比较合适的地方是几何体的质心(也就是,质量或重力的中心)。从数学上来说,一个几何体的质心是由这个物体所有点的平均位置确定的。SDO_CENTROID函数计算一个SDO_GEOMETRY对象的几何质心。例如,计算美国新罕布什尔州的质心,其代码如下:
3.SDO_POINTONSURFACE
一个多边形的质心有可能在也有可能不在这个多边形内,那么在几何体表面的其他点放置一个标签也可能是有用的。可以通过使用SDO_POINTONSURFACE函数来得到这样的几何体表面上的点。例如,获得马萨诸塞州几何体表面的一点,代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。