1. 引言
World Wind是由NASA的科研人员开发的开放源代码三维地图平台。它可以将Landsat 7、MODIS (Moderate-Resolution Imaging Spectroradiometer,中分辨率成像光谱仪)、SRTM(Shuttle Radar Topography Mission,航天飞机雷达地形测图任务)等多颗卫星的数据及其它WMS(Web地图位置服务,Web Map Service)服务商提供的图像通过一个三维的地球模型展现 [1] [2] 。World Wind软件包括Java SDK(Java开发版)和.Net SDK (.Net框架开发版) 2个版本,其中Java SDK即可以用于开发桌面版系统,也可以开发成为Java applet嵌入网页中运行 [3] 。ARC SDE (空间数据库引擎,Spatial Database Engine)是ARC GIS(地理信息系统,Geographic Information System)的空间数据引擎,提供空间和非空间数据进行高效率操作的数据库服务,支持多用户同时并发访问和操作同一数据。
本文在World Wind Java三维开源平台的基础上,通过ARC SDE的空间操作函数扩展了平台对WMS图层数据源的空间检索能力,构建具备点、线、复杂面和缓冲查询能力的WebService接口,并在“北海区海洋综合信息一张图”系统中得到了应用,证明此类方法有效的解决了海量数据表现与空间检索的矛盾问题。
2. 需求分析和设计
2.1. 需求分析
World Wind Java使用Applet和Application两种框架,支持多种文件格式和网络数据源,可以满足构建实用的三维地理信息应用系统的需求。World Wind Java支持KML/KMZ、SHP、GPX等多种格式的文件数据源,它使用UserSurfaceIcon类表示点图元,使用UserPolyLines和UserPolygons类分别表示线和面图元,这些图元都可以通过实现鼠标和键盘接口响应用户操作,使程序具有良好的地图空间交互能力 [4] 。
World Wind Java对以上三类图元提供了巧妙的拾取操作支持能力。由于三维地理信息系统在表现过程中存在一个三维向二维的投影,要从用户点击的屏幕点(像素位置)获取图元是存在一定困难的。屏幕是一个二维的画布,而用户真正要提取的实际上是三维球体上的位置,这个二维像素坐标与三维地理坐标并不存在明确的一对一的关系。如果先从二维像素坐标转换成三维的地理坐标,再通过复杂的空间逻辑运算决定与哪些图元相交的话,效率是非常低的。为了克服这个问题,World Wind Java非常巧妙地使用了窗口颜色缓冲相交检验的方法来处理图元拾取过程中的判断,使拾取操作的处理变得简单和可行。
World Wind Java在拾取(Pick)操作时,World Wind调用每一个图层的AbstractLayer接口的doPick方法,就像它绘图时要逐个调用DrawContext方法一样。World Wind Java在调用这两种接口的顺序恰好相反,绘图时从最底层开始,而拾取时从最表层开始。当应用程序发出指定点(区域)的拾取消息时后,各图层顺序负责根据指定区域检查是否有相交对象,并提交对象描述,在全部图层循环后,应用程序就获得了指定点的图元清单。在这一过程中,控制器首先将当前的选取点(区域)对应的范围颜色缓存清除,这个操作是在后台缓存中进行的,所以并不影响用户的视觉效果。然后控制器遍历每一个图层,每个图层用特定的拾取标志色进行绘制,这个过程同样是在后台进行。图层中每个可拾取(Pickable)的图元使用不同的标识颜色,通过读取指定区域的颜色缓冲区的值,就可以判断出该图元是否应当被拾取。所有图层循环过后,应用程序就可以获得一份拾取图元的清单,这种方法避免了复杂的空间逻辑运算,效率非常高。
这种空间要素拾取的解决方法存在一个缺陷,对WMS服务提供的栅格数据的数据源支持能力不足。针对此问题,目前主流方法是采用在栅格图上直接绘制矢量图形的办法来解决,但是该方法无法使用大数据,且不适合本文应用平台技术体系。World Wind Java对WMS等空间栅格数据格式支持非常好,可以兼容大部分WMS服务器发布的空间影像数据服务。当我们面临大量的遥感影像数据和几十万节点乃至几百万节点的空间图元数据时,使用矢量数据源通过WMS发布是保证系统效率的最好办法。这种数据表现方式面临着一个问题:所有图元都被栅格化成了空间影像,World Wind Java无法再通过“渲染”的方法区分用户点击的是哪一个图元,也就失去了高效实现空间检索的一个重要途径。
国家海洋局北海信息中心在构建“北海区海洋综合信息一张图”系统时面临海量数据的检索和操作问题,由于确权用海、海洋功能区划、道路、居民点等图层空间数据量非常大,系统使用了WMS图层来发布这些空间要素。同时针对用户提出的空间要素的地图检索功能,系统通过ARC SDE提供函数实现了这一需求,从而通过两种技术的结合,为用户提供了优良的用户体验。
2.2. 解决方法
“北海区海洋综合信息一张图”系统使用oracle数据库存储数据,并使用ARC SDE for Oracle提供了ST_Geometry类型来存储和处理几何数据,st_geometry是一种遵循ISO(国际标准化组织,International Organization for Standardization)和OGC(开放地理信息系统协会,Open GIS Consortium)规范的,可以通过SQL(结构化查询语言,Structured Query Language)直接读取的空间信息存储类型。采用这种存储方式能够更好的利用oracle的资源并兼容oracle的特征。使用st_geometry存储空间数据,可以把业务数据和空间数据存储到一张表中,因此可以很方便的在业务数据中增加空间数据。
如前所述,可以通过监听World Wind Java在屏幕上的鼠标操作,系统将二维屏幕坐标通过World Wind Java画布提供的方法转为三维坐标,并判断三维坐标的合法性。当用户点击的是一个合法的三维坐标时,通过ARC SDE的空间检索函数就可以获取保存在ARC SDE数据表中的记录集。使用这种方法的优点在于:首先,它扩展了World Wind Java的空间数据检索能力,使得我们对海量数据进行表现和操作时,在充分发挥WMS服务的用户操作快速响应能力的同时提供高效的空间数据检索能力;其次,利用这种方法可以将多个数据表进行“UNION”或“UNION ALL”检索并在后台形成一个数据集,从而将一些业务逻辑的调整从前端移到服务器端,符合分层开发的设计趋势,降低了系统的耦合度。
3. 功能实现
3.1. ARC SDE空间检索函数
st_geometry的存储格式是由ESRI(美国环境系统研究所公司,Environmental Systems Research Institute)提出的一种新空间数据存储标准,在空间数据检索效率、复杂空间数据的支持方面比oracle spatial表现更专业。要通过SQL函数访问存储在Oracle中的st_geometry类型的数据,需要通过扩展Oracle的external procedure agent或者extproc来实现 [5] 。
ARC SDE提供了一系列空间检索、数据操作和空间运算函数,本文仅关注实现World Wind Java空间数据检索操作相关部分方法。在空间检索过程中,系统最关注的是用户的点击位置检索、图元缓冲检索、用户指定位置和半径的范围检索以及用户指定区域的交叉检索(如矩形、多边形区域),相关主要函数如表1所示。
根据不同用户的操作要求,使用st_intersects,或利用st_geometry构建空间图元作为指定的检索区域,也可以在前两者的基础上再使用st_buffer进行缓冲查询。ARC SDE提供了相当多的空间数据操作方法,但是只要掌握这几个方法就完全可以满足我们利用ARC SDE扩展World Wind Java空间检索能力的需要。
3.2. 空间检索效率分析
在实际应用中,为了提高数据检索效率,我们要针对不同的用户需求优化检索方法,尤其是面对海量空间数据操作时。尽管用户的空间检索包含了点、线、面和缓冲检索,归纳起来其实只有两种情况:
(1) 用户指定的空间范围(线、面,含缓冲面)是否与数据表空间记录有交叉;
(2) 用户指定的空间点是否在数据表空间记录的范围内;
前者只能使用使用st_intersects函数,后者还可以使用st_within函数和st_contains函数,三者的使用方法与效率存在一些差距。st_intersects函数和st_within函数是通过空间索引进行数据检索比对,效率相对较高,而st_contains函数则是利用全表扫描方式进行数据检索比对,效率相对较低。但st_intersects函数执行时会对后一个传入参数先进行全表扫描后再利用空间索引进行比对,所以应用该函数时应当将数据量小的参数作为后面的传入参数以提高检索效率。下面进行一些比较,假设在ARC SDE的空间数据库中已经存在空间数据类型为面图元的数据表TABLEA,记录约25万左右,表2分别列出了针对点、线、面的语句和运行时间。
由表2可以看到,实现相同功能的不同检索语句的执行时间效率差距巨大,有些空间检索甚至可以达到近2000倍,最少的也达到了160倍左右。oracle在执行SQL时,数据表是从后向前按顺序检索的。
![](Images/Table_Tmp.jpg)
Table 1. Spatial retrieve function of ARC SDE
表 1. ARC SDE空间检索相关函数表
![](Images/Table_Tmp.jpg)
Table 2. Efficiency of spatial retrieve function of ARC SDE
表 2. ARC SDE空间检索函数效率表
执行表2的第一条SQL语句时,oracle先生成一个point对象,然后与TABLEA中的每条记录的索引对比;执行表2的第二条SQL语句时,oracle会从TABLEA中取出每个图元,再与生成的POINT对象进行空间运行对比,这样在执行一个对比25万条记录的SQL语句时,就要生成25万次对象,而且不能充分利用ARC SDE的索引进行加速。
3.3. 发布空间数据检索的Web Service服务
为了提高集成系统模块的复用性,降低系统间各模块的耦合程度,我们在Apache Tomcat平台上使用Apache CXF(Apache Celtix + XFire)对刚才描述的ARC SDE的存储过程进行了封装。CXF建立的Web Service分为接口部分和实现部分 [6] ,系统对确权用海项目封装的Web Service如图1所示。图1中的ISDESpatialElementsFactory.java是Web Service实现部分,用户通过调用该方法获取需要检索的经纬度坐标列表,SDESpatialElementsFactoryImpl.java是Web Sevice接口部分,此接口首先利用st_buffer方法获取用户选择区域,再利用st_within方法获取与用户选择区域相交的图元。参考World Wind Java的空间检索方式,系统对指定的空间点进行了一定的扩展,也就是对用户选择位置设置了一定的缓冲半径,避免要求用户必须进行“精确点击”才能拾取图元。
在完成Webs Service发布后,集成框架内的应用系统都可以通过Web Service接口来检索指定位置的确权用海数据,其返回值可以通过两种方法调用:
(1) 通过AJAX进行无刷新检索,然后更新系统网页;
(2) 通过Applet的JavaScript接口,也就是Object.getWindow(this).eval (javaScriptString)方法获取返回值后直接在Applet中解析应用;
通过Web Service服务的发布,ARC SDE的空间数据检索函数已经能够被World Wind Java和其他Web应用系统所调用,通过这种方法解决了大数据量下WMS空间数据服务与ARC SDE数据源的显示效率和空间检索功能的矛盾,图2显示了利用这种技术构建的“北海区海洋综合信息一张图”中的空间数据检索结果。
![](//html.hanspub.org/file/7-1540825x9_hanspub.png)
Figure 1. Web service of spatial retrieve for point by CXF
图 1. 使用CXF封装的指定空间点检索的Web Service服务
![](//html.hanspub.org/file/7-1540825x10_hanspub.png)
Figure 2. User view of application world wind java
图 2. 利用本文方法实现的World Wind Java应用界面
4. 结束语
系统利用ARC SDE的空间检索函数扩展了World Wind Java中的WMS服务图层的空间数据操作能力,在World Wind Java平台上实现了点、线、面检索和空间缓冲检索等多种功能,并利用Web Service服务提供了可复用的空间数据检索与操作接口,降低了系统耦合度,提高了开发和应用的灵活性。利用该方法所构建的系统已经在国家海洋局北海分局建立的“北海区海洋综合信息一张图”得到了应用,为北海区海洋管理信息化和集成框架建设提供了有力的支持。
基金项目
本项目受国家海洋局海洋公益性行业科研专项基金201305026、山东省海洋生态环境与防灾减灾重点实验室开放基金201605支持。