将 Oracle Spatial 与 Google Earth 集成
现在全世界都在使用定位技术。人们在 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 默认加载的内容。为此,请遵循以下步骤
- 启动 GeoServer 并导航进入 GeoServer 主页:http://localhost:8080/geoserver.
- 单击 Config :http://localhost:8080/geoserver/config/index.do.
- 使用 admin/geoserver 以默认用户名/口令登录。
- 再次单击 Config:http://localhost:8080/geoserver/config/index.do。
- 单击 Data:http://localhost:8080/geoserver/config/data/index.do。
- 单击 Stores:http://localhost:8080/geoserver/config/data/store.do。
- 单击 New:http://localhost:8080/geoserver/config/data/storeNew.do。
注意,如果事前没有为 GeoServer 安装 Oracle DataStore Extension,当您创建新的数据存储时,列表中不会显示 Oracle 连接选项。
安装 Oracle DataStore Extension
为 GeoServer 安装 Oracle DataStore Extension:
- 解压缩 geoserver-1.5.0-oracle-plugin.zip 到其本身目录下。
- 复制 gt2-oracle-spatial-2.3.1.jar 和 ojdbc14.jar 到 [GEOSERVER_HOME]/Webapps/geoserver/WEB-INF/lib 目录。
- 重启 GeoServer。
- 如果您遵循上面步骤 4 的子步骤到达步骤 g,当您创建新的数据存储时,您应该会在描述列表中看到 Oracle 的两个列表。
配置 GeoServer 查询 Oracle 数据库
为 GeoServer 成功安装 Oracle DataStore Extension 后,您可以使用 GeoServer 直接查询 Oracle 数据库。
为 Oracle 数据库创建 GeoServer 数据存储
启动运行了 GeoServer 并已安装 Oracle DataStore Extension,现在准备配置 GeoServer 以查询先前导入的 COUNTIES 表。请遵循以下步骤:
- 再次单击 Config.:http://localhost:8080/geoserver/config/index.do。
- 单击 Data:http://localhost:8080/geoserver/config/data/index.do。
- 单击 Stores :http://localhost:8080/geoserver/config/data/store.do。
- 单击 New:http://localhost:8080/geoserver/config/data/storeNew.do。
- 从描述列表中选择 Oracle,并为您的存储 oragis 取名(参见图 1)。
图 1:选择 Oracle 作为新的 GeoServer 数据存储[放置在 /technology/pub/images/lokitz-spatial-geoserver-f1.gif 下;其他所有图像都使用同一命名规则]
- 保留 topp 为默认命名空间,并填写导入 COUNTIES 表的 Oracle 实例的主机、端口、用户名、口令和实例(SID 或服务)信息(参见图 2)。
- 单击 Submit。
图 2:在 GeoServer 框架内创建新的 Oracle 数据存储
- 单击 Apply(在左上角),然后单击 Save。此时,您的数据存储应该已顺利保存并载入(以 XML 文件格式)。
为县创建 GeoServer 地理特征类型
载入数据后,要创建地理特征类型(数据存储中某些数据的表示形式)。请遵循以下步骤
- 再次进入 Config -> Data 菜单:http://localhost:8080/geoserver/config/data/index.do
- 单击 FeatureType:http://localhost:8080/geoserver/config/data/typeSelect.do。
- 单击 New :http://localhost:8080/geoserver/config/data/typeNew.do。
- 从 Feature Type Name 列表中选择 oragis:::COUNTIES(参见图 3)。
图 3:为新的 GeoServer 特征选择 COUNTIES 表
- 单击 New。
- 用下列值填写地理特征表(参见图 4):
a. Style:polygon。
b. SRS:4326.
c. Title:COUNTIES。
d. Bounding Box:单击Generate。
e. 保留其余的值为默认值。
*注意:项目 d 配置对 Oracle Spatial 初效过滤器边框查询。GeoServer 当前不支持定位智能(如“最近的邻居”或“在……距离内”或其他关系查询类型)的普通地理空间查询。但是,Oracle Application Server MapViewer(每个 Oracle 应用服务器都有的特性)完全支持这些类型以及更多的查询。 - 单击 Submit
。
图 4:为您的 COUNTIES 数据创建地理特征类型
- 单击 Apply(在左上角),然后单击 Save。此时,您的地理特征类型(元数据)应该已顺利保存并载入(以 XML 文件格式)。
地图样式
现在准备测试 GeoServer 与数据存储和地理特征类型的连接。此时,您应该能够根据 COUNTIES 表以多种格式输出数据。但是,由于您只对我们的地理特征应用了多边形样式,您可能看不到多种格式。快速测试连接后,您要创建更有趣的数据集样式。现在
- 在 GeoServer 主页上单击 WMS Capabilities:http://localhost:8080/geoserver/wms?service=WMS&request=GetCapabilities。
- 在这里您将看到一个带有 GeoServer 可实施的功能列表的 XML 文档/页面。滚动查看列表,找到 <Name>topp:COUNTIES</Name>。这将告诉您 WMS 服务器(作为部分 GeoServer)能够输出什么内容(参见图 5)。
图 5:GeoServer WMS-XML 输出
使用浏览器从 GeoServer 中获取地图图像
要测试 COUNTIES 地理特征,打开一个新的浏览器窗口并进入以下 URL:
http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=image/
png&width=800&height=600&srs=EPSG:4326&layers=topp:COUNTIES
&styles=polygon&bbox=-177.1,13.71,-61.48,76.63
这是一个 WMS 请求,告诉 GeoServer 输出一个类型为 PNG、宽为 800 象素、高为 600 象素、SRS(坐标系统)为 4326、COUNTIES 地理特征的、非常简单的多边形样式的、尺度为下列值的边框内的图像:最小经度 (-177.1),最小纬度 (13.71),最大经度 (-61.48),最大纬度 (76.63)。
GeoServer 处理请求后应返回一个类似图 6 的图像:
此时,准备集成您的 Oracle 表与 Google Earth(使用一个 GeoServer 特性)。进行集成之前,我们先探讨如何使用地图样式定义更有趣更具说明性的县信息呈现。要进行探讨,则需要在您的地理特征上应用一个新样式(即样式化图层描述符)。
创建样式化图层描述符
样式化图层描述符(即 SLD)使您的地图富有色彩。它告诉服务器应如何提交地图,例如,是要用黑色画线还是要用蓝色上色并带好看的轮廓和文本标签。SLD 是一种基于 XML 的语言,在开放规范方面较详细,从这里可获得相关信息。为 GeoServer 创建的 SLD 文件可被任何与 Web 地图服务 (WMS) 兼容的应用重复利用 (http://docs.codehaus.org/display/GEOSDOC/1.3+Style+Your+Map)。
下一步就是创建一个 SLD 样式化美国县城的地图。GeoServer Web 站点上的参考教程提供了详细的说明。或者,可以将 GeoServer 说明自带的几个 SLD 用作模板。能够满足我们需要的 SLD 称作 popshade.sld。要查看此 SLD 的描述,请遵循以下步骤:
- 导航到 [GEOSERVER_HOME]/data_dir/styles 目录。
- 在文本编辑器中打开 popshade.sld。
使用 SLD 规则和过滤器部分
通读本文挡过程中,您可能注意到:- <FeatureTypeStyle> 标记内有多个 <Rule> 部分。
- 在规则部分内又有过滤器部分 (<ogc:Filter..>),描述了在给定地理特征内需要什么标量属性以及将要执行什么逻辑。例如,在第一个规则部分内,有一个过滤器定义此规则仅适用于人数在 2,000,000 到 4,000,000 之间的地理特征内的数据。
<ogc:Filter xmlns:gml="http://www.opengis.net/gml">Oracle 数据库中的 COUNTIES 表包括县属性数据以及 GEOM 栏中存储的定位数据。该属性数据可用于帮助我们定义在商务智能设置中有意义的规则、逻辑和样式。一则有趣的数据是 POPPSQMI(每县每平方米的人口)。当您将规则应用到该数据集时(使用 POPPSQMI 的值),结果将发送到地图上。
<ogc:PropertyIsBetween>
<ogc:PropertyName>PERSONS</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>2000000</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>4000000</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>
为 COUNTIES 表创建 SLD
通过编辑 SLD 为 COUNTIES 表(和 COUNTIES 地理特征)定制 popshade.sld SLD:
- 保存一份 popshade.sld 到另一个(data_dir 之外的)目录,另存为 countypopshade.sld。
- 编辑名称、标题和摘要部分:<Name>CountyPopDensity</Name>
- 创建两个新的规则部分,使 GeoServer 在提交数据时返回 5、6 个基于 POPPSQMI 的渲染样式。
- 第一个规则定义一个过滤器,查看 POPPSQMI 的值并基于 POPPSQMI 小于 10 的行应用特定的颜色和文本样式:
<Rule>
<!-- like a linesymbolizer but with a fill too -->
<ogc:Filter xmlns:gml="http://www.opengis.net/gml">
<ogc:PropertyIsLessThan>
<ogc:PropertyName>POPPSQMI</ogc:PropertyName>
<ogc:Literal>10</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:Filter>
<PolygonSymbolizer>
<Fill>
<!-- CssParameters allowed are fill (the color) and fill-opacity -->
<CssParameter name="fill">#0000FF</CssParameter>
<CssParameter name="fill-opacity">0.7</CssParameter>
</Fill> </PolygonSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>COUNTY</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">10</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule> - 然后,创建带有多个过滤器的多个规则,其中 POPPSQMI 在两个数之间:
<Rule>
<!-- like a linesymbolizer but with a fill too -->
<ogc:Filter xmlns:gml="http://www.opengis.net/gml">
<ogc:PropertyIsBetween>
<ogc:PropertyName>POPPSQMI</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>10</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>1000</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>
<PolygonSymbolizer>
<Fill>
<!-- CssParameters allowed are fill (the color) and fill-opacity -->
<CssParameter name="fill">#00FF00</CssParameter>
<CssParameter name="fill-opacity">0.7</CssParameter>
</Fill>
</PolygonSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>COUNTY</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">10</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule> - 最后,创建一个 POPPSQMI 值大于 30000 的规则:
<Rule>
<!-- like a linesymbolizer but with a fill too -->
<ogc:Filter xmlns:gml="http://www.opengis.net/gml">
<ogc:PropertyIsGreaterThan>
<ogc:PropertyName>POPPSQMI</ogc:PropertyName>
<ogc:Literal>30000</ogc:Literal>
</ogc:PropertyIsGreaterThan>
</ogc:Filter>
<PolygonSymbolizer>
<Fill>
<!-- CssParameters allowed are fill (the color) and fill-opacity -->
<CssParameter name="fill">#FF0000</CssParameter>
<CssParameter name="fill-opacity">0.7</CssParameter>
</Fill>
</PolygonSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>COUNTY</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">10</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule> - 您可在示例代码下载中找到已完成的(定义良好的)文件的例子。
- 保存新的 SLD。
载入县 SLD
现在,您需要将新的 SLD 载入 GeoServer。请遵循以下步骤- 导航到 GeoServer 的 Config -> Data -> Style 页面:http://localhost:8080/geoserver/config/data/style.do。
- 单击 New 根据新的 SLD 创建一个新样式:http://localhost:8080/geoserver/config/data/styleNew.do 。给该 popshade.sld 文件取个新名字 countypopdensity(参见图 7)。
图 7:为新的 GeoServer 样式 (SLD) 命名
- 浏览并选择您创建的 countypopshade.sld(参见图 8)。
- 单击 Submit。
图 8:根据定制的 SLD 创建 GeoServer 样式
- 单击 Apply(在左上角),然后单击 Save。此时,您的样式应该已顺利保存并载入(以 XML 文件格式)。
将 Counties SLD 与 Counties 地理特征相关联
- 导航到 Config -> Data -> FeatureType 菜单。
- 从 Feature Types 列表中选择 oragis:COUNTIES,然后单击 Edit。
- 从 Style 列表中选择 countypopdensity(参见图 9)。
图 9:用新样式更新 COUNTIES 地理特征类型
- 滚动至页面底部,单击 Submit。
- 单击 Apply,在左上角,然后单击 Save。此时,您已更新的地理特征类型应该已顺利保存并载入(以 XML 文件格式)。
- 现在,再次运行您的 WMS 请求,用 countypopdensity 代替多边形 Style 参数:
http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=image/png&width=800&height=600&srs=
EPSG:4326&layers=topp:COUNTIES&styles=countypopdensity&bbox=-177.1,13.71,-61.48,76.63。 - 返回的图像现在应类似于图 10:
图 10:使用新样式后,COUNTIES 地理特征类型的示例 WMS 输出
正如您所见,GeoServer 使用一些过滤器和其他元数据创建 Oracle 数据库查询,返回适合主题渲染的数据集。在后台,创建返回边框 (-177.1,13.71,-61.48,76.63) 内结果集的查询使用了叫作 SDO_FILTER 的 Oracle Locator/Oracle Spatial 运算符。虽然没有一种简单的方法可扩展 GeoServer 的 WMS 服务器的功能,使其能够使用更高级的询查(如您在“查询数据”部分中使用的查询),但您一定能使用 Oracle Spatial 和 Oracle Application Server MapViewer 开发出通过 Oracle Application Server MapViewer 的固有 WMS 服务可输出高级查询的应用程序。 - 要反映您自己的首选项,您需要使用以上过程按照您的喜好更新 countypopshade.sld。
现在,准备将新地理特征集成到 Google Earth。
集成 Oracle Locator/GeoServer 与 Google Earth
完成所有 GeoServer 到 Oracle 的工作后,现在准备进行最后几个步骤,通过 GeoServer 集成 Oracle 与 Google Earth。
使用 Google Earth GUI 查看 Oracle 数据库中的 Counties 数据
Google Earth 提供经济灵活的查看方式,即可查看定位信息,又可查看其中的地理空间关系。正因为 Oracle Locator 与 Oracle Spatial 可用于提供基于服务器的地理空间和非地理空间分析,Google Earth 可用作此类信息与分析的前端用户接。然而,迄今为止有一点需要注意:如果要结合 Oracle 数据库与 Google Earth,您必须为 Oracle 数据库创建能够输出 KML 或 KMZ(Google Earth 的标记语言,压缩或未压缩的)的自定义接口,或者购买 Google Earth Enterprise,然后利用 Google 地理空间销售工程团队的服务为您执行集成。现在,您还有第三种更简单、更灵活的选择:使用 GeoServer 从 Oracle Spatial 输出 KML/KMZ,无需您亲自动手。GeoServer 可从 Oracle Spatial 自动输出 KML/KMZ,或者使用我们在前面见过的标准 WMS 格式,其中“格式”值由 PNG 变为 application/vnd.google-earth.kml+XML,例如:
http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=application/
vnd.google-earth.kmz+XML&width=1024&height=1024&srs=EPSG:4326&layers=topp:COUNTIES
&styles=countypopdensity
或者,我们只使用 KML Reflector(GeoServer 的另一个特性),只是将我们会包括在 WMS 调用中的大部分信息封装为简化的 URL。
GeoServer Web 站点 (docs.codehaus.org/display/GEOSDOC/Google+Earth ) 上有一些很好的说明能帮助您成功完成操作,简言之为:
- 启动 Google Earth。
- 移动地球,将中心定在美国版图上您最想要的一部分(参见图 11)上。
图 11:将 Google Earth 的中心定在美国您最想要的位置上
- 从 Add 菜单中选择 Network Link (参见图 12)。
图 12:打开 Google Earth 的 Network Link 菜单
- 为您的网络链接命名,如 County Pop Density。
- 从您的 GeoServer 中将 KML/KMZ URL 输入链接字段(参见图 13):
http://localhost:8080/geoserver/wms/kml_reflect?layers=COUNTIES.
图 13:为您的 GeoServer 实例添加网络链接信息
注意:根据上面提到的 GeoServer-Google Earth Web 页面所述,KML reflector 公用程序已开发为用户无需调整 WMS 请求即可轻松输出 KML/KMZ。 - 单击 OK。
- 现在,您应该能看到您的县数据已放置在 Google Earth 所提供数据的顶端(参见图 14 和 15)。非常酷!
图 14:放大/缩小和移动地图到不同的区域以查看数据的新视图
图 15:已与 Google Earth 集成的 Oracle 县数据
自动刷新 Google Earth 中的网络数据
您还可以建立网络链接定期刷新数据的视图。请遵循以下步骤
- 在 Google Earth 上右击 Places 部分中的 County Pop Density 链接(参见图 16)。
图 16:编辑网络链接属性
- 单击 Refresh 选项卡,然后切换某些刷新选项。
结论
随着定位信息的作用不断增大,能够利用现有定位信息的技术也在不断增加。此外,与多数其他技术的发展趋势相同,扩展数据的用法就意味着增加应用程序和数据格式的数量,从而导致更高的复杂性。例如, 即使 Oracle Locator/Oracle Spatial 和 Google Earth 这样功能强大的工具使问题数据达到难以置信的透明程度并使其立即可用,这两种工具也增加了整个体系结构的复杂性,因为它们并不是生来就集成在一起的(这只是其中的一个例子)。如今,解决由商业软件解决方案带来的内在复杂性问题最有效最广泛的一个方法就是使用开源软件。
在定位信息领域内,起到桥梁作用的开源软件解决方案中最好的例子是 GeoServer。若具备了 GeoServer 这样的解决方案,在创建、存储、管理和使用定位数据时,我们就再不必进行艰难的平台选择。取而代之的是,我们可以为这项工作挑选最好的解决方案,并求助于开源社区帮助我们完成剩余的工作。
这篇文章探讨的正是这个话题:如何使用广为人知的、受到良好支持的 GeoServer 连接两个使用极其广泛、功能极其强大的定位信息解决方案 Oracle Locator/Oracle Spatial 和 Google Earth。最终,您不仅开创了一种分析 Oracle 数据库内的定位信息的方法,而且您还能通过 Google Earth 直接连接顶端的重要用户接口。总之,您已经创建了一个高级企业商务智能系统。