学习如何使用 Oracle Locator/Oracle Spatial、GeoServer 和 Google Earth 创建具有定位功能的强大的无缝 BI 系统。
现在全世界都在使用定位技术。人们在 Google Earth 上搜索他们的住所,使用具有 GPS 功能的移动电话追踪自己孩子的行迹,充分利用其企业 Oracle 体系架构中内置的固有定位功能,这些似乎表明不仅个人对定位技术感兴趣,人们的生活和工作也离不开定位技术。然而,正如其他新兴技术一样,随着技术选择的增多,数据格式的数量与复杂程度也在增长。这便是开源社区的切入点。
地理空间技术的开源社区与其他开源社区并无不同。它由各学院、工程师、架构师反馈,目的是创建强大的易于使用的框架和技术,以便帮助填补由商业资源造成的空缺。
例如,在跨数字鸿沟共享数据方面,无论是否使用地图,Confluence GeoServer(一种开源服务器,可连接异构地理空间数据源)表现都较突出。GeoServer 的开发人员认为他们的项目是地理空间 Web 理想的“粘胶剂”。
GeoServer 的原理出奇地简单。比如,您在 Oracle Spatial 数据库中存储了一些数据,并想以其他软件包(如 Google Earth)可以使用的格式将这些数据发布到 Web 上。为此,您一定会定义一个 XML 电子表格或一些其他输出进程将源数据转换为 KML(Google Earth 的标准标记语言)。然而,为了更有效地做到这一点,您或许需要将所有已知的几何类型以及与这些几何(真正重要的材料)关联的任何元数据和/或数据包含在内。
对于一次性项目而言,这样做或许并不算差。但是,如果您要在多个数据集和数据设计上应用自己的转换引擎,您就不得不做大量工作来首先创建一个转换框架,此转换框架要既能够处理您的数据源与 Google Earxth 中的所有复杂事务,又能处理实际转换。
然而,当您的需求或数据(源或输出)发生改变时,您该怎么办?GeoServer 极大地简化了这一过程。通过在 Oracle 数据库中提供与 Oracle Locator/Oracle Spatial 地理特征表的连接,GeoServer 能够执行简单的边框查询(初效过滤器查询)、将结果转换为 KML 并将 KML 输出作为一种服务提供给 Goggle Earth 以便表现在地图上。对于简单的地理空间查询,这是一种具有吸引力的低成本的解决方案。
此篇文章将向您展示如何使用 Oracle Locator/Oracle Spatial、GeoServer 和 Google Earth 创建具有定位功能的强大的无缝商务智能系统。最后,我希望您在阅读完本练习之后, 能够对如何使用开源技术来扩展商业技术的使用方法有更深入的理解。
Oracle Locator/Oracle Spatial 入门指南
在 Oracle 关系数据库管理系统(从 Oracle 快捷版到 Oracle 企业版)的特性中,功能最强大但人们了解最少的特新之一就是 Oracle Locator。按照定义,“Oracle Locator 是 Oracle 数据库 10g 标准版和企业版的一个特性,提供多数客户应用程序所需的核心定位功能。”但实际上,Oracle Locator 能够提供大量更多的功能。按字面意思,Oracle Locator 在与其余数据相同的表和行中为用户提供存储(地理空间的或相反的)定位信息(如经度和纬度)的选项。然而,Oracle Locator 还有更多功能:使用这一标准地理特征,用户还可以使用相同数据进行定位分析。
所以,当您只是想返回有关正好存在于另一事物一定距离内的某一事物的所有信息时,为什么还要求助于地图或 GIS 呢?Oracle Locator 可以在数据库中为您完成这一切。当然,对于 Oracle Spatial(Oracle 企业版的一个选项),这个“兔子洞”会延伸得更深。从基本原理上而言,Oracle Locator 与 Oracle Spatial 是相同的。它们共享相同的核心对象类型 (SDO_GEOMETRY) 以及相同的元数据和索引方案。
然而,尽管 Oracle Locator 提供给人印象深刻的核心定位分析功能(如可以找到与其他数据具有某种拓扑关系的所有数据),Oracle Spatial 却构建在这种功能之上来存储和管理图像与栅格数据和元数据;创建和分析线性参照数据模型、网络数据模型和拓扑数据模型;使用地理编码将基于文本的地址信息转变为经度/纬度;通过综合路由引擎提供驱动方向;并在定位和其他数据上进行深入的多维空间分析和挖掘。Oracle Locator 和 Oracle Spatial 的特长在于,数据和分析对于任何 能与某个 Oracle 数据库连接并从中查询的客户端都可用。
载入县数据集
示例代码 counties.dmp 中包含的示例数据集由两个表 COUNTIES 和 STATES 以及 Oracle Spatial 元数据和关联索引组成。要将这个数据集载入您自己的 Oracle 数据库,完成下列操作:
- 以具有系统权限的用户身份登录您的 Oracle 数据库实例:$> SQLPLUS system/password。
- 创建新的数据库用户(随便起一个名字 - 我的数据库叫 ORAGIS):SQL> create user oragis identified by oragis.
- 为新用户授予资源和连接权限:SQL> grant resource,connect to oragis.
- 退出 Oracle:SQL> exit。
- 将 COUNTIES 转储(导出)文件导入 ORAGIS(即您用户的)模式:$> imp oragis/oragis file=counties.dmp full=y。
查看数据库对象
至此,您已经具备了所需的一切,可以开始“询问”Oracle Locator 有关地理空间与非地理空间数据间关系的有趣问题。但是,在询问之前,查看一下您已经添加到数据库的结构以及它的工作方式。要进行查看,则
- 以“拥有”县数据的用户身份登录您的 Oracle 数据库:$> sqlplus oragis/oragis。
- 在县表上执行 DESCRIBE,查看它的组成:SQL> desc counties.
输出应与以下类似:
|
Name |
Null?Type |
|
GEOM |
MDSYS.SDO_GEOMETRY |
|
COUNTY |
VARCHAR2(31) |
|
FIPSSTCO |
VARCHAR2(5) |
|
STATE |
VARCHAR2(30) |
|
STATE_ABRV |
VARCHAR2(2) |
|
FIPSST |
VARCHAR2(2) |
|
LANDSQMI |
NUMBER |
|
TOTPOP |
NUMBER |
|
POPPSQMI |
NUMBER |
正如您所见,此表中的大部分信息由文本 (VARCHAR2) 和数字 (NUMBER) 组成。然而,GEOM 行(存储组成您的县几何表示形式的实际坐标)指定 MDSYS.SDO_GEOMETRY 数据库类型。仔细查看这个类型,您可以看到它可描述为:
SQL> desc SDO_GEOMETRY
|
Name |
Null?Type |
|
SDO_GTYPE |
NUMBER |
|
COUNTY |
NUMBER |
|
SDO_POINT |
MDSYS.SDO_POINT_TYPE |
|
SDO_ELEM_INFO |
MDSYS.SDO_ELEM_INFO_ARRAY |
|
SDO_ORDINATES |
MDSYS.SDO_ORDINATE_ARRAY |
通过这个描述以及 Oracle Spatial 用户指南与参考,您可以确定这些正在存储的数据的几个特征:
- SDO_GTYPE 描述几何类型(点、线串或多边形)。
- SDO_SRID 用于识别坐标系统。
- SDO_POINT 描述纬度和经度。
- SDO_ELEM_INFO 描述如何使用存储在 SDO_ORDINATES 部分的数字。
- SDO_ORDINATES 描述组成一个空间对象的边界的坐标值。
检查单个栏的数据....
SQL> select geom from counties where county = 'San Francisco';
GEOM(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
SDO_GEOMETRY(2003, 8265, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),
SDO_ORDINATE_ARRAY(-122.3915, 37.707813, -122.3916, 37.708401,
-122.38088, 37.710056, -122.37258, 37.718094, -122.36247, 37.715759, -122.35625, 37.730015,
-122.36532, 37.732609....))
您可以看到,无论您是存储点、线还是多边形(如本例所示),所有这些文件都在单个类型(及单个栏)中进行管理,您无需为使用二进制数据的复杂操作而担忧;换句话说,这是偏重于白匣子而非黑匣子实施。以这种方式存储定位数据实现了灵活性,并且允许通过标准访问接口(如 SQL、JDBC 和 ODBC)进行访问。
Oracle Spatial R-Tree 索引
Oracle Spatial 提供功能强大的索引 R-tree 索引。按照 Oracle Spatial 用户指南与参考的描述,“空间索引与其他索引一样,提供限制搜索的机制,但在空间索引中,这种机制以空间标准(如交会和容量)为基础。空间索引用于:
- 在某个已编入索引的数据空间内查找与给定的感兴趣的(window 查询)点或区域进行交互的对象
- 在两个已编入索引的数据空间内查找在空间上彼此交互(空间连接)的对象对”。
因此,如果您在 Oracle 数据库中创建包含定位(即地理空间)信息的表格,那么使用空间索引索引那些定位数据是很好的方法。
查询数据
载入数据之后,您便可以执行如下有趣的分析操作:
“给出加州境内和/或与加州相邻的所有的县(有关标量属性州的非空间查询无法满足此查询)。”
select /*+ ordered */ c.COUNTY,c.STATE_ABRV,c.TOTPOP,c.POPPSQMI
from states s, counties c
where s.state = 'California'
and sdo_anyinteract (c.geom, s.geom) = 'TRUE';
此处,您在要求 Oracle 数据库返回与加州具有任何拓扑交互的所有的县。这个查询的结果应返回加州以及俄勒冈州、内华达州和亚利桑那州的县,即美国 3,300 个县中的 74 个县。仅使用 COUNTIES 表中的 STATE 一栏是不可能解决这个查询的,因为这一栏不包括与加州邻接的或与加州具有任何交互的其他州的县。
从这点上来说,您有很好的基础来进行基于 COUNTIES 表的甚至更有趣、可见的分析。在决定进行实践并只使用 Oracle Locator 或 Oracle Spatial 管理您所有的数据之前,您需要查看以下 Web 站点和文档:
oracle.com/technology/products/spatial/index.html
oracle.com/technology/products/spatial/htdocs/training.html
oracle.com/technology/obe/10gr2_db_vmware/datamgmt/spatial/spatial.htm
使用 GeoServer 转换 Oracle 数据
按照 Confluence Web 站点的描述,GeoServer “是连接用户信息与 Geospatial Web 的开源服务器。”换句话说,如本文章前面所述,GeoServer 是其他地理空间服务/服务器间的通信桥梁,数据借此可进行轻松、动态的(即席)格式转换。就我们的目的而言,这是个极大的优势。然而,虽然您总是可以通过编写一丁点代码(PL/SQL、Java、PHP)就以 Google Earth KML 格式输出 Oracle Locator/Oracle Spatial 数据,但这不一定切实可行。此外,这正是 GeoServer 之类开源服务器的亮点所在。
安装 GeoServer
要启动 GeoServer,请遵循以下步骤:
- 进入 Confluence-GeoServer 主页。
- 阅读快速启动文档中的部分注意事项和前提条件。
- 下载并安装 GeoServer 最新版本。
- 下载并为 GeoServer 安装 Oracle DataStore Extension 最新版本。
在此之前,您需要了解 GeoServer 默认加载的内容。为此,请遵循以下步骤