Oracle Spatial 产品概要以及使用概述
Oracle Spatial 11g1是Oracle数据库11g企业版的一个选件,它提供全面高级的空间数据管理功能,用于支持地理空间应用程序、基于位置的服务和企业空间信息系统。所有Oracle数据库都已经具备由Oracle Locator提供的基本空间数据管理功能,Oracle Spatial则在Oracle Locator的基础上增加了许多更高级的功能。这些高级的空间数据运算和空间分析特性包括空间聚合、面积和长度计算以及线性参照。它还包括 GeoRaster 数据类型,用于存储和管理图像和网格化栅格数据及元数据;网络和拓扑数据模型;地理编码和路线搜索引擎;用于轻松快速部署绘图、地理编码和路线搜索服务的API,以及空间数据分析和挖掘函数。这些重要的功能满足了政府公共部门、国防、土地管理、测绘、物流、能源勘探、数字地球和生命科学等领域的业务需求。
11g 版本的 Oracle Spatial 提供了重要的新功能,使之成为强大的综合数据管理平台,可以满足任何地理空间应用和支持位置信息的企业级应用的高需求。增强后的空间几何数据类型支持三维数据,同时也增加了新数据类型用于支持点云和地形模型的存储和管理,这些模型用于城市规划、国土安全或基于 Lidar 的地图生产等领域。随着Oracle Spatial 11g版本2的发布,加强了和开放地理空间联盟(OGC)和国际标准ISOTC211标准的融合,Oracle数据库和Oracle融合中间件提供了一个强大的,事务性服务为导向的具备企业级安全性的架构平台,Oracle Spatial支持OGC关键的基于XML的地理空间网络标准如:Open Location Services (OpenLS) 1.1, Web Feature Service(WFS) 1.0, Web Feature Service – Transactional (WFS-T) 1.0, and Web Catalogue Service(CSW) 2.0, 开发人员可以通过调用Java和PL / SQL客户端的API进行部署。
ORACLE 空间数据存储模式
-
数据建模
SDO_GEOMETRY 对象结构:
其中的SDO_GTYPE属性是一个4位的NUMBER类型对象,该4位的数字表示了这个几何对象的类型,让我们来看看这4个数字如何来约定几何类型。这4个数字的形式为“DLTT”,其中D代表维数,可以取值为2、3、4;L代表线性参考,如果没有取值为0;TT代表几何类型,取值为00到09
下面的列表解释了该函数不同的数值所描述的不同的几何类型:
DLTT值 |
几何类型 |
描述 |
DL00 |
未知几何类型 |
该值未被采用 |
DL01 |
点 |
只有一个点的几何 |
DL02 |
线/曲线 |
包含一条线串的几何,可以是直线或曲线或两者都有 |
DL03 |
多边形或面 |
一个有洞或没有洞的多边形,或是有一个或多个多边形的一个面 |
DL04 |
集合 |
包含不同类型几何的几何体 |
DL05 |
多点 |
含有一个或多个点的几何体 |
DL06 |
多线(直线/曲线) |
含有一条或多条线的几何体 |
DL07 |
多面或多边形 |
含有多个,不相连的多边形或面 |
DL08 |
多面体 |
含有多个面且是一个完全闭合的三维体,可以是长方体或椎体 |
DL09 |
多面体集 |
含有多个,不相连的多面体 |
SDO_GEOMETRY中的SDO_SRID属性代表了几何对象的坐标系统,它要么是空,要么是一个在SDO_COORD_REF_SYS中定义的SRID。
SDO_GEOMETRY中的SDO_POINT属性是一个SDO_POINT_TYPE类型的对象,该类型很简单:
在SDO_GEOMETRY中,只有当SDO_ELEM_INFO和SDO_ORDINATES属性都为空的时候,这个SDO_POINT属性才会被解析,如果是一个空间表中只有点数据,那么使用SDO_POINT进行存储会大大提高性能。
SDO_GEOMETTRY的SDO_ELEM_INFO和SDO_ORDINATES属性分别是SDO_ELEM_INFO_ARRAY和SDO_ORDINATE_ARRAY类型,返两个类型都是存放NUMBER的数组。SDO_ELEM_INFO和SDO_ORDINATES属性是要配合起来解析的:SDO_ELEM_INFO指定了在SDO_ORDINATES属性中存储的坐标形式应当如何解释,依次每3个值一组,每个组代表一个“Element”,每组中的3个值分别是:
(SDO_STARTING_OFFSET、
SDO_ETYPE、
SDO_INTERPRETATION)
SDO_STARTING_OFFSET代表了从SDO_ORDINATES中开始解析的坐标序号;SDO_ETYPE和SDO_INTERPRETATION则需要配合起来解析:(详见Spatial11gDevGuid.pdf)
传统的关系数据库数据模型概念适用于处理空间数据。Oracle 数据库支持许多传统的数据类型,包括为字符提供的VARCHAR2、为日期提供的DATE类型、为数字提供的NUMBER 类型,以及为存储空间特征坐标而提供的SDO_GEOMETRY 数据类型。Oracle 数据库没有特殊的空间表,只有包含一个或多个SDO_GEOMETRY 列的普通 Oracle 数据库表。当您创建规范化的空间数据字典时,只需要在需要的表中包含SDO_GEOMETRY 列,其中表内的所有其它列与SDO_GEOMETRY 列均存在一对一关系。考虑下面这个为道路空间特征和河流空间特征建模的例子。道路信息可能包含车道数、街道地址范围等。河流信息可能包含盐度、最大深度等。尽管它们都是线性特征,但因为道路信息与河流不相关,且河流信息也与道路不相关,所以建议不要将它们的坐标存储在表的同一个SDO_GEOMETRY 列中。一个规范化的数据模型将把道路空间特征保存在Roads 表中,而表中其它列则与道路坐标存在一对一的关系。同理,一个类似的规范化数据模型可用于 Rivers 表。在查询时您将体会到将道路信息与河流信息分开存储的好处。当只搜索道路信息时,您就无需从既包含道路条目又包含河流条目的表中进行筛选了。
创建空间表例子:
-
常见空间几何对象在ORACLE数据库中的存储示例:
点 |
SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(12, 14, NULL), NULL, NULL ) |
矩形 |
SDO_GEOMETRY( 2003, — two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(1,1, 5,7) ) |
复合线 |
SDO_GEOMETRY( 2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), SDO_ORDINATE_ARRAY(10,10,10,14,6,10,14,10) ) |
有洞的多边形 |
SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,7,5, 7,10, 10,10, 10,5, 7,5) ) |
复合多边形 |
SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1005,2,1,2,1, ,2,2), SDO_ORDINATE_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10) ) |
有方向的点 |
SDO_GEOMETRY( 2001, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,1, 3,1,0), SDO_ORDINATE_ARRAY(12,14, 0.3,0.2) ) |
-
元数据、容差和坐标系
任何表中的每一个SDO_GEOMETRY 列都需要在 Oracle Locator/Spatial 元数据字典USER_SDO_GEOM_METADATA 中有一条记录,我们称之为空间数据表的注册。元数据条目包含以下信息:
-
含有SDO_GEOMETRY 类型列的表的名称
-
用SDO_GEOMETRY 数据类型定义的列的名称
-
SDO_GEOMETRY列的轴(维)数
-
每一个轴的上下界
-
每个轴的容差值,一般所有轴的该值相同
-
空间坐标系标识符 (SRID)
每个轴的上下界不是 SDO_GEOMETRY 列中数据的最小限定矩形(MBR)。轴边界应该是可以包含当前和未来的所有几何结构的数值。定义的第一个轴必须始终是x,第二个轴是y。此外,还可定义可选的z轴和测量轴。当处理大地测量数据(经度/维度数据)时,第一个轴的范围必须定义为 (-180, 180),第二个轴的范围定义为 (-90,90)。x轴和y轴的容差一般相同。容差是定义区分两个坐标点之间的最小距离。Oracle 的几何结构验证例程、空间操作符和空间函数全都使用容差。定义一个反映您采集数据所用真实分辨率的容差非常重要。当存储非经度/维度数据时,容差单位与和空间数据相关的坐标系单位相同。当存储经度/维度数据时,容差单位为米。Oracle Locator/Spatial支持的所有坐标系都定义在一个称为MDSYS.CS_SRS的字典表中。此外,Oracle 10g 第 2 版引入了欧洲石油调查组织 (EPSG) 标准中代表坐标系的数据模型。每个EPSG 定义的坐标系在MDSYS.CS_SRS中都有对应的条目。Oracle Locator/Spatial 预先配置有4000 多个定义好的坐标系。这些预先配置的坐标系满足了众多用户的需求。如果这些预先配置的坐标系都无法满足您的要求,您可以添加自定义坐标系。从Oracle数据库10g第2版开始,自定义坐标系必须通过在Oracle数据库中定义的EPSG数据模型输入。每个自定义的EPSG条目会自动在MDSYS.CS_SRS 表中生成一个条目。添加自定义坐标系的流程详见《Oracle Spatial Users Guide and Reference》。
在MDSYS.CS_SRS 字典中,一个称为SRID的数值型主键标识了每一个被支持的坐标系。该字典表还采用符合Open GIS Consortium (OGC)标准的通用文本 (WKT) 语法定义每个支持的坐标系。将空间数据与坐标系相关联只需简单地将空间数据与SRID值相关联。建议将空间数据与SRID相关联,特别是在您的数据是地理数据即与地球相关的数据时。地理数据可以分为两类:大地测量数据(经度/维度数据)和投影数据(非经度/维度数据)。Oracle 采用由大地测量SRID定义的几何结构连续坐标之间的大地测量距离。
USER_SDO_GEOM_METADATA表结构:
空间索引
Oracle Spatial中的空间索引极其重要。在Oracle Spatial中,空间索引的索引类型是MDSYS.SPATIAL_INDEX,是基于R树的空间索引机制就是把几何对象的边界范围拿出来作为一个检索的依据,这是一个矩形的范围,也就是MBR(Minimum Bounding Rectangle)。再对它进行管理。
Oracle Spatial中几何对象的MBR
在Oracle Spatial中,一个空间表里所有的几何对象就是通过它们的MBR的R树索引进行管理的,从下面的图中很容易可以理解,MBR索引的根节点包括A、B两个较大的MBR,当一个查询可以很快速地找到A后,再查找其中的a或b这两个比较小的MBR,如果找到了a,那么再最终找到1或者2这两个最小的MBR。
Oracle Spatial中基于R Tree索引的MBR示意图
对于空间数据库进行空间查询的操作一般都有两个阶段,对于Oracle Spatial而言,一个空间查询分为两个步骤,一个称为主过滤(Primary Filter),另外一个称为二级过滤(Secondary Filter)。主过滤通过矩形的MBR相交从海量的数据中首先过滤出可能符合空间查询的一小部分数据,然后再用二级过滤中具体的空间关系算法来判断这个小的结果集中到底哪些是满足空间关系的。如下图:
Oracle Spatial 优化的空间索引查询机制
使用Oracle Spatial的主要步骤:
-
创建空间数据表,将SDO_GEOMETRY数据类型作为数据表的一个列。
CREATE TABLE RIVER (
ID NUMBER ,
NAME VARCHAR2(32),
GEOM SDO_GEOMETRY
);
- 填写空间元数据。
INSERT INTO user_sdo_geom_metadata VALUES(
‘RIVER’,
‘GEOM’,
sdo_dim_array(
sdo_dim_element(‘X’, -100,100, 0.000005),
sdo_dim_element(‘Y’, -100,100, 0.000005),
),
NULL ——-坐标系SRID
);
-
创建空间索引。
CREATE INDEX river_idx
ON RIVER(GEOM)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
至此,空间数据表的创建才算正式完成。
-
插入空间数据。
INSERT INTO RIVER VALUES(
001,
‘长江’,
SDO_GEOMETRY (
2002,
null,
null,
SDO_ELEM_INFO_ARRAY (1,2,1),
SDO_ORDINATE_ARRAY ( 10,10, 20,25, 30,10, 40,10)
)
);
批量的数据导入可以使用开源项目GDAL2中的OGR2OGR包加载其他矢量空间格式的数据到ORACLE SPATIAL空间数据库,也可以使用ORACLE提供的MAPBUILDER3将SHAPE格式的空间数据导入进来,如果使用MAPBUILDER,它会自动创建空间索引并执行属性数据的注册。
-
空间分析查询示例
查询在某点2公里内所有的水源:
SELECT W.ADDRESS, W.NAME
FROM waterSource W,office O
WHERE O.site_id = 1604 AND
SDO_WITHIN_DISTANCE(W.location, — waterSource表的SDO_GEOMETRY列
O.location, — office表的SDO_GEOMETRY列
‘distance=2 unit=KM’) = ‘TRUE’;
1 http://www.oracle.com/technetwork/database/options/spatial/index.html
2 http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries
3 http://www.oracle.com/technetwork/middleware/mapviewer/overview/index.html
转载自:https://blog.csdn.net/zonwang/article/details/6213239