DOM采用基于树型的解析技术将XML文档一次性解析,生成一棵位于内存中的对象用以描述该文档。树的节点是一个个对象,通过操作这些对象就能操作XML文档的内容。
图2-6 DOM解析过程
图2-7 生成的DOM树示例
2.2.4.2 SAX
SAX解析XML采用事件驱动的方式。虽然并不是W3C的标准,但它的API是公认的,很多解析器都是基于它的。与DOM比较而言,SAX是一种轻量级的方法。当SAX解析器读取文档的时候会引发很多事件,这些事件会交给对应的时间处理者(event handlers)。三种基本的事件:DTDHander访问XML的DTD内容;ErrorHander解析错误;ContentHandler访问文档的内容。
图2-8 SAX解析过程
SAX模型内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。另外,无需像DOM那样为所有节点创建对象,开发人员可以根据需
13
要创建自己的XML对象模型。
2.2.4.3 StAX
StAX在完美地体现XML“拉”式解析器的卓越性能和低内存,并且突破了该类解析器在功能上的有限性。与SAX一样,StAX也是基于时间流驱动的,具有类似于流媒体的优点:分析能够立即开始,而不是等待所有的数据被处理,而且由于应用程序只是在读取数据时检查数据,文档的读入过程和解析过程同时进行,所以不需要将数据存储在内存中。
StAX只解析应用程序所需要的时间流发送给应用程序,减少了向应用程序发送一些不必要的时间反馈
图2-9 StAX解析过程
2.2.4.4 三种解析技术的比较
三种技术各有各的优缺点,现将他们的优点、局限和使用地方列表如下:
图2-10 XML Parsing Techniques at a Glance(XML解析技术一览)
14
2.3 空间数据库技术概述
空间数据库是以空间数据为研究对象,在实现对空间数据的存储和操作的基础上进行空间分析和应用。空间数据库在空间信息系统中占有十分重要的地位,其投资占整个系统建设的70%甚至更多。因此,空间数据库的建设是空间信息系统建设中的一个关键问题,同时也是一项费时费力的基础性工作。在一个完整的空间数据库中,每个空间对象是由反映其几何特征的“空间数据”和非几何特征的“属性数据”表示。空间数据和属性数据是两种异质数据,同时维护两种异质数据是空间数据库区别于其他数据库的典型特征。
空间数据库在地理信息系统中得到了大量的运用,但是地理信息系统技术在取得巨大发展的同时,其孤立性、封闭性的缺陷越来越不适合现代信息社会的要求,开放式地理信息系统(OpenGIS)规范和互操作技术的提出,不仅为数据共享提供了崭新的思路,而且将GIS带入了开放的时代,从而使得各个系统间实现不同类型地理数据和地理处理方法的透明访问成为可能。
本小节的内容就围绕着OpenGIS展开。 2.3.1 OpenGIS简介
OpenGIS(Open Geo data Interoperation Specification,OGIS-开放的地理数据互操作规范)由美国OGC(OpenGIS协会,OpenGIS Consortium)提出。OGC是一个非赢利性组织,目的是促进采用新的技术和商业方式来提高地理信息处理的互操作性(Interoperability),OGC会员主要包括GIS相关的计算机硬件和软件制造商(包括ESRI、Intergraph、MapInfo等知名GIS软件开发商),数据生产商以及一些高等院校,政府部门等,其技术委员会负责具体标准的制定工作。
OpenGIS的目标是,制定一个规范,使得应用系统开发者可以在单一的环境和单一的工作流中,使用分布于网上的任何地理数据和地理处理。它致力于消除地理信息应用(如地理信息系统,遥感,土地信息系统,自动制图/设施管理(AM/FM)系统)之间以及地理应用与其它信息技术应用之间的藩篱,建立一个无“边界”的、分布的、基于构件的地理数据互操作环境,与传统的地理信息处理技术相比,基于该规范的GIS软件将具有很好的可扩展性、可升级性、可移植性、开放性、互操作性和易用性。
15
图2-11 OpenGIS结构图
OpenGIS定义了一组基于数据的服务,而数据的基础是要素(Feature)。所谓要素简单地说就是一个独立的对象,在地图中可能表现为一个多边形建筑物,在数据库中即一个独立的条目。要素具有两个必要的组成部分,几何信息和属性信息。OpenGIS将几何信息分为点、边缘、面和几何集合四种:其中我们熟悉的线(LineString)属于边缘的一个子类,而多边形(Polygon)是面的一个子类。也就是说OpenGIS定义的几何类型并不仅仅是我们常见的点、线、多边形三种,它提供了更复杂更详细的定义,增强了未来的可扩展性。另外,几何类型的设计中采用了组合模式(Composite),将几何集合(GeometryCollection)也定义为一种几何类型,类似地,要素集合(FeatureCollection)也是一种要素。属性信息没有做太大的限制,可以在实际应用中结合具体的实现进行设置。
相同的几何类型、属性类型的组合成为要素类型(FeatureType),要素类型相同的要素可以被存放在一个数据源中。而一个数据源只能拥有一个要素类型。因此,可以用要素类型来描述一组属性相似的要素。在面向对象的模型中,完全可以把要素类型理解为一个类,而要素则是类的实例。
基类Geometry拥有Point(点), Curve(曲线), Surface(面)和GeometryCollection(集合图元)。每一个几何对象都与一个空间参照系相互关联,几何对象所定义的坐标在空间参照系得到反映。类关系图如图2-12所示:
16
图2-12 Geometry 类关系图
Geometry是OpenGIS几何模型层次关系的根类,Geometry是一个抽象(不能实例化)类。其子类实例化可得到空间参照系中的0,1,2维几何对象。
在该层次关系中的所有可实例化类这样定义可以使在系统中是拓扑相关的(例如,所有几何对象定义都包括他们的边界)。
2.3.2 MySQL中对OpenGIS的支持
MySQL是开源数据库的大鳄,从MySQL4.0开始加入了Spatial扩展功能,实现了OpenGIS规定的几何数据类型,在SQL中的简单空间运算。但是从4.0之后到现在,MySQL的Spatial部分一直没有继续的更新和增强。加上早先MySQL在SQL上对空间运算支持的不完善(只支持基于最小外接矩形的关系判断),所以MySQL是开源数据源中一个不太让人满意的选择。不过由于MySQL在小型项目上的广泛引用,在一些情况下也是可以以MySQL为数据源的。
MySQL对OpenGIS的支持主要表现在支持空间数据的数据类型,以及用于创建和检索空间值的函数上。
2.3.2.1 MySQL空间数据类型
MySQL具有与OpenGIS类对应的数据类型。某些类型只能保存单个几何值:
GEOMETRY 、POINT、LINESTRING 、POLYGON 。GEOMETRY能够保存任何类型的几何值。其他的单值类型POINT、LINESTRING以及POLYGON只能保存特定几何类型的值。
17