ArcSDE vs. Oracle Spatial 13

来源:互联网 发布:网络拓扑的分层结构 编辑:程序博客网 时间:2024/05/21 19:36

I. 空间关系运算

以上两个章节是必不可少的基础,涉及到空间数据在数据库中的存储和通过索引加速空间数据的获取。从这句话也可以看出,后续的章节并不是必须的,也就是说某些基于空间数据的应用可能并不需要诸如空间关系判断、几何对象处理等功能。这并不是说这些功能就用不着了,而是这些功能并不一定需要在数据库端执行。比如基于ArcSDE,这些空间算法和功能在ArcGIS的产品线中无处不在,很多时候都不会把这些功能放到数据库上去。

· Oracle Spatial

在Oracle Spatial中,主要的空间关系操作在下表中列出:

空间操作

描述

SDO_FILTER

主过滤,判断哪些几何对象可能和给定的几何对象相交

SDO_JOIN

基于一定空间关系的表连接

SDO_NN

查询离某个几何对象最近的几何对象

SDO_NN_DISTANCE

查询离某个几何对象最近的几何对象与当前对象的距离

SDO_RELATE

判断两个几何对象是否满足某种空间关系

SDO_WITHIN_DISTANCE

判断两个几何对象间距离是否小于某给定值

其中SDO_RELATE操作比较特殊,它通过mask参数来判断几何对象间是否满足某种空间关系,但是事实上如果都用参数来指定空间关系的话使用上就不太方便,因此,Oracle Spatial还提供了基于SDO_RELATE不同参数代表的不同空间关系的一些操作,如下表:

衍生自SDO_RELATE的空间操作

描述

SDO_ANYINTERACT

任意部分有相交

SDO_CONTAINS

 

SDO_COVEREDBY

SDO_COVERS

SDO_EQUAL

SDO_INSIDE

SDO_ON

SDO_OVERLAPBDYDISJOINT

SDO_OVERLAPBDYINTERSECT

SDO_OVERLAPS

SDO_TOUCH

image

下面我们看一些空间关系操作的大概用法,比如我用一个三角形去查询所有满足“INSIDE”关系的几何对象,我们可以通过以下两种等价的方式操作:

SQL> select continent from continent where sdo_inside(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)))='TRUE';

CONTINENT

---------------------------------------

Australia

SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE')='TRUE';

CONTINENT

---------------------------------------

Australia

image

图 13 判断和图示三角形满足一定空间关系的几何对象

虽然有一些比较方便的SDO_RELATE的衍生操作,不过SDO_RELATE支持更灵活的空间关系判断,比如以下的SQL语句可以查询和上面的三角形满足“OVERLAPBDYDISJOINT”关系、“INSIDE”关系及同时满足这两种关系的几何对象:

SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=OVERLAPBDYDISJOINT')='TRUE';

CONTINENT

---------------------------------------

North America

SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE')='TRUE';

CONTINENT

---------------------------------------

Australia

SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE+OVERLAPBDYDISJOINT')='TRUE';

CONTINENT

---------------------------------------

North America

Australia