首页 理论教育 常用空间操作符:空间数据库实验教程

常用空间操作符:空间数据库实验教程

时间:2023-08-29 理论教育 版权反馈
【摘要】:找出与查询位置最近的邻居:该操作符被称为SDO_NN或简称为NEAREST_NEIGHBER操作符。图6-2SDO_DISTANCE函数的使用如果采用SDO_WITHIN_DISTANCE,实现上面同样的功能,代码如下:SDO_WITH_DISTANCE操作符的参数子句除了指定距离,单位之外,还可以指定下面两个参数。

常用空间操作符:空间数据库实验教程

Oracle Spatial提供了很多空间操作符,包括缓冲分析、邻近分析等。以邻近分析为例,Oracle Spatial提供不同的操作符来执行邻近分析,几种不同空间操作符的语义如下。

(1)找出在查询位置指定距离内的所有数据:该操作符称为SDO_WITHIN_DISTANCE或简称WITHIN DISTANCE操作符。

(2)找出与查询位置最近的邻居:该操作符被称为SDO_NN或简称为NEAREST_NEIGHBER操作符。

(3)找出与查询位置相交或关联的所有邻居:可达到这个目标的主要操作符被称为SDO_RELATE。另外,还有一些其他的变种可用于确定专有关系。如果只使用索引的近似值,那么可以使用一个简单的变种(操作符),称为SDO_FILTER。

下面依次讨论上述的每个操作符以及如何在应用中使用它们进行分析。

6.2.2.1 SDO_WITHIN_DISTANCE

SDO_WITHIN_DISTANCE操作符和SDO_DISTANCE函数(见6.3.2)都可以找出在查询位置指定距离内的所有数据。例如,要找出在指定的竞争对手商店(STORE ID=1)周围0.25英里范围内的所有客户,可以使用SDO_DISTANCE,代码如下:

运行结果如下:

运行界面如图6-2所示。需要说明的是,SDO_GEOM.SDO_DISTANCE函数是Locator的一部分。SDO_GEOM.SDO_DISTANCE函数将满足SDO_WITHIN_DISTANCE谓词的客户位置和商店位置作为前两个参数,其第三个参数指定容差,而第四个参数指定可选的单位参数,以便用合适的单位返回所得距离。

图6-2 SDO_DISTANCE函数的使用

如果采用SDO_WITHIN_DISTANCE,实现上面同样的功能,代码如下:

SDO_WITH_DISTANCE操作符的参数子句除了指定距离,单位之外,还可以指定下面两个参数。

(1)min_resolution=<a>,从查询结果中排除了太小的几何数据。

(2)max_resolution=<b>,从查询结果中排除了太大的几何数据。

如果min_resolution被指定为a,在查询时最小限定矩形的长和宽都小于a个单位(对大地测量数据,单位为米)的数据将会被排除。同理,如果max_resolution被指定为b,那么在查询时最小限定矩形的长和宽都大于b个单位的数据将会被排除。因此查询只会处理没有被排除的几何体数据。min_resolution和max_resolution的单位总是坐标系的默认单位(例如,如果street_name的SRID属性是8307,那么它的单位就是米),而不受查询查询中指定的UNITS影响。例如,获取竞争对手商店周围0.25英里内的长度至少为200m的街道的名称。代码如下:

运行结果如图6-3所示。

那么如何排除大于500m的街道呢?可以使用max_resolution参数来实现,如图6-4所示。需要注意的是,参数子句中的min_resolution和max_resolution可用于SDO_FILTER、SDO_WITHIN_DISTANCE和SDO_RELATE操作符,但是不能用SDO_NN操作符。

6.2.2.2 SDO_NN

SDO_WITHIN_DISTANCE操作符返回在查询位置指定距离d范围之内的所有对象。那如果距离d之内没有任何对象,情况会怎样呢?如果最近的对象与查询位置的距离为2d,情况又会怎么样呢?SDO_WITHIN_DISTANCE操作符不适合获取指定数量的邻近对象,不管它们离查询位置有多远,而SDO_NN操作符可解决以上问题。

给定一个位置集,SDO_NN操作符将按它与查询位置的距离顺序来返回数据。图6-5给出了一个示例。A、B、C、D和E是一些位置,它们所在的表含有空间索引,Q是一个查询位置,SDO_NN操作符将A、B、C、D、E按它们与Q的距离进行排序,并按此顺序返回它们。如果只需要一个邻近对象,就返回A。如果需要两个邻居,就返回A和B。

图6-3 SDO_WITHIN_DISTANCE操作符的使用

图6-4 SDO_WITHIN_DISTANCE操作符参数子句

图6-5 SDO_NN在五个位置上:A、B、C、D和E

SDO_NN操作符的语法如下:

其中,table_geometry指定SDO_GEOMETRY列,其所在表的空间索引将被引用;query_geometry为查询位置指定SDO_GEOMETRY,它可以是另一个表的一列或一个绑定的变量;parameter_string是一个可选参数,它指定两个性能调优参数SDO_BATCH_SIZE和SDO_NUM_RES之中的一个;tag是另一个可选参数,它允许SDO_NN操作符绑定到一个辅助距离操作符。该参数只有在parameter_string被指定的情况下才能被指定。

SDO_NN操作符利于在应用中进行邻近分析(图6-6)。例如,可用它找出离竞争对手商店(ID=1)最近的客户。代码如下:

输出结果为:

图6-6 SDO_NN操作符的使用

上面的程序中,查询从CUSTOMER表返回所有3195个客户的id,并按与指定竞争对手商店(id=1)的距离对它们进行排序。但一般情况下,并不想查看所有的客户。相反,只对最近的五个或者十个客户感兴趣。为了执行上述约束,在前面的SQL语句中使用ROWNUM<=N,其中N是我们感兴趣的邻近客户的数量。下面的程序给出了N为5的SQL语句(即只返回离id=1的竞争对手最近的五个客户)(图6-7)。

输出结果为:(www.xing528.com)

图6-7 SDO_NN操作符与ROWNUM的使用

在示例数据中,客户已经被定级为SILVER、GOLD及其他类型。假如希望不惜一切代价地保留GOLD客户,以阻止竞争对手拉走这些重要的客户从而削减市场份额,那么该如何找出这些客户呢?方法之一是关注距离每个竞争对手最近的GOLD客户。可以从上面的程序来返回最近的五个GOLD客户而不是最近的五个任何客户。代码如下:

该程序所有返回的客户都是GOLD客户。SILVER客户被过滤掉了。一般而言,SDO_NN操作符可以用在不同的应用中,还可以和其他谓词一起用在同一个SQL语句中。但它存在以下一些限制:

(1)计算SDO_NN操作符时必须使用空间索引。否则,Oracle会报错。

(2)如果在同一个表上有一个非空间谓词(如customer_grade='GOLD'),且在它相关的列(customer_grade)上存在一个索引,那么在执行过程中该索引不能被使用。

6.2.2.3 用于空间相互关系的操作符

下面学习一些能够找出与查询几何体相互作用的位置/几何体的操作符。这类空间操作符中常见的空间操作符如下。

(1)SDO_FILTER:该操作符可以识别出最小限定矩形与查询几何体的最小限定矩形有相互作用的所有几何体。它主要使用空间索引,并不调用Geometry Engine函数。

(2)SDO_RELATE:该操作符可识别出以某种方式与查询几何体相互作用的所有几何体。指定的相互作用方式可以是相交、与边界接触、完全包含在内等。

(3)SDO_ANYINTERACT、SDO_CONTAINS、SDO_COVERS、SDO_COVEREDBY、SDO_EQUAL、SDO_INSIDE、SDO_ON、SDO_OVERLAPS和SDO_TOUCH:这些操作符是针对某些特定相互作用的SDO_RELATE操作符的简单变种。可以直接使用简单变种替代使用适当的参数来识别相应的特定关系的SDO_RELATE操作符。

1.SDO_FILTER操作符

SDO_FILTER操作符能识别出一张表中所有满足下述条件的行,这些行的几何列的最小限定矩形与指定的查询几何体的最小限定矩形相交。该操作符的结果总是其他基于相互关系操作符的结果的超集。从这个意义上来说,它是这些操作符的近似。SDO_FILTER操作符的语法如下:

其中,table_geometry指定SDO_GEOMETRY列,其所在的空间索引将被引用;query_geometry为查询位置指定SDO_GEOMETRY对象;parameter_string被设为querytype=window。这个参数是可选的,在Oracle 10g及后续版本中可被省略。

例如,获取一个某一指定范围内的所有客户名称(图6-8)。

其实现代码如下:

图6-8 SDO_FILTER操作符的使用

在上述例子中,返回了40个结果。一般情况下,SDO_FILTER操作符返回的结果比实际上与查询几何体相交的结果要多。那为什么要用这个操作符呢?因为与其他空间操作符相比,它的执行速度比较快,并且它删除了CUSTOMERS表中大量不在查询几何体影响区域内的几何体。从这个意义上来说,SDO_FILTER操作符相当于是其他基于相互关系的操作符(如SDO_RELATE)的快速近似。

2.SDO_RELATE操作符

SDO_FILTER操作符返回的对象并不都与查询几何体相交,有时会返回多余的几何体(超集)。那么如何找出与查询几何体有着特定关系的几何体呢?SDO_RELATE操作符提供了这个功能。

其中:table_geometry指定SDO_GEOMETRY列,其所在表的空间索引将被使用;query_geometry为查询位置指定SDO_GEOMETRY;parameter_string被设为“querytype=window MASK=<interaction-type>[min_resolution=<a>][max_resolution=<b>]”,如果table_geometry与query_geometry有<interaction-type>关系,那么SDO_RELATE操作符就为真。参数min_resolution=<a>和max_resolution=<b>用于从结果集合中删除太小或太大的几何体。

下面将要具体讨论interaction-type(或mask-type)。SDO_RELATE中的相互关系有多种,图6-9列出了各种不同的相互关系,其中的两个几何体Q和A对应于前面SDO_RELATE语法中的query_geometry和table_geometry。图中的每种相互关系都有一个与之等价的简化操作符,如表6-1所示。在查询中既可以使用指定了合适的掩码(mask)的SDO_RELATE操作符,也可以是使用等价的简化操作符。和所有其他的空间操作符一样,SDO_RELATE和等价的简化操作都应和字符串“TRUE”比较。

图6-9 数据几何体A和查询几何体Q之间的关系

表6-1 相互关系的名称、语义和操作符

续表6-1

SQL/MM(MM表示多媒体)是一个扩展的标准,用于在SQL语句中指定空间和多媒体操作符。该标准明确规定了一套以ST_为前缀的标准查询关系。在Oracle中,可以用相同的名称使用这些SQL/MM函数:ST_CONTAINS、ST_WITHIN、ST_OVERLAPS和ST_DISJOINT。其中,每个函数作用于一对ST_GEOMETRY对象:一个数据几何体和一个查询几何体。在Oracle中,可以将这些关系作为操作符,作用于数据几何体的表和查询几何体之上。表6-2给出了SQL/MM关系(SOIEC 13249)和与其对应的Oracle Spatial操作符。

表6-2 SQL/MM与空间操作符

前文已经介绍了SDO_RELATE操作符(或等价的简化操作符)确定的各种空间关系。下面将介绍如何使用这个操作符。例如,获取一个某一指定范围内的所有客户名称(图6-10)。

图6-10 SDO_RELATE操作符的使用

这个例子之前采用SDO_FILTER做过,得到的返回结果为40行,而这里采用SDO_RELATE得到的结果为29行。从这里可以看出,SDO_RELATE的计算结果比SDO_FILTER的结算结果更加精确一些,因为SDO_FILTER采用的是粗略计算,也即采用的是索引的包围盒进行计算的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈