以上两个章节是必不可少的基础,涉及到空间数据在数据库中的存储和通过索引加速空间数据的获取。从这句话也可以看出,后续的章节并不是必须的,也就是说某些基于空间数据的应用可能并不需要诸如空间关系判断、几何对象处理等功能。这并不是说这些功能就用不着了,而是这些功能并不一定需要在数据库端执行。比如基于ArcSDE,这些空间算法和功能在ArcGIS的产品线中无处不在,很多时候都不会把这些功能放到数据库上去。
在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 |
下面我们看一些空间关系操作的大概用法,比如我用一个三角形去查询所有满足“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
图 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