基于libGPE读写KML文件的研究

基于libGPE的读写KML文件的研究



摘要:GoogleEarthWorldWind等地学浏览器的流行,OGCKML格式也逐渐成为各种GIS软件支持的标准格式之一。目前大多数GIS软件都有导出KML文件的功能,主流商业软件的新版本ArcGIS10也基本实现了导入KML文件的功能,但实现导入KML文件功能的开源软件并不多。gvSIG是一个类似ArcView的开源桌面GIS软件,通过libGPE库,gvSIG实现了导入导出KML文件的功能。本文介绍了libGPE库的架构及其导入导出KML文件的原理,并分析了libGPE库在导入导出KML功能的不足之处。

关键词:KML;地理信息系统;gvSIGlibGPE;开源软件

1引言

GoogleEarth的出现,引发了GIS普及的一个浪潮,地理信息可以通过网络方便快捷地传递到每一个终端设备上。借助GoogleEarthGoogleMap的普及,其原生数据格式KML也成为业界的一种标准格式,几乎所有的GIS软件都有导出KML的功能,并且大部分商业软件的新版本ArcGIS10提供了很好的KML导入导出功能,相比之下,目前大多数开源GIS软件导入导出KML文件的功能要弱的多。

gvSIG是一款基于Java的开源桌面地理信息系统,其读写KML的功能是通过libGPE库来实现的。本文通过分析gvSIG读取KML文件的实现原理,来讨论GIS软件导入导出KML文件的方法及目前在导入导出KML文件中遇到的一些困难。

2研究背景

2.1KML/KMZ数据格式

KMLKeyholeMarkupLanguage的缩写,是基于XML语法标准的一种标记语言,最初由Keyhole公司(现已被Google收购)推出,在2008年正式成为OGC的一个编码标准,目前最新的版本为KML2.2[1]。在地学浏览器中,KML类似于HTML,通过标签和相应的值来显示文档。KML的基本单元是元素(elements),元素在KML中通过标签(tag)来表示[2]KML文档一般体积很小,因为其中体积比较大的元素大多是通过引用的方式来获取。KMZKMLzip压缩格式,里面包含KML文件及其相关的数据。

2.2基于KML的应用

KML文件自开放以来,其出色的地图渲染能力就得到了广泛的关注,Sandvik使用KML进行二维、三维和时态专题地图的制作[3]Pezanowski等人利用KMLGoogleEarthGeoServer进行了混搭(Mashup),使用GeoServer提供的WPS服务弥补了GoogleEarth在空间分析功能上的不足[4]Byoung-JunKang等使用KML存储三维建筑信息,利用Googleearth APIISA引擎创建了一个三维地图服务[5]YongLiu等使用KML文件来展现降水及积水随时间变化的三维场景[6]DePaorWhitmeyer提出了使用KMLGoogleEarth上制作地质和地球物理的二维、三维以及时态模型的方法[7]Deligiannidis则使用KMLGoogleEarth上显示学校生源分布的时态专题地图,从而辅助学校招生政策的制定[8]Conroy等人则将KML用于古生物学的研究,为考古人员提供了一种简单易用的地图制图和信息分享方法[9]Calado等人进行了KML在表达二维、三维的水道专题图方面的研究[10]WoodSlingsby等人则进行了使用Landserf来生成KML方面的研究[11]。国内的学者也做了很多KML关的研究,曾建刚等进行了基于GMLKML的空间数据库的研究[12];杨湘燕等探索了使用KML来实现GIS数据的复用[13];宋艳敏进行了使用OGR与使用ArcGISShapefile文件转为KML文件的对比[14]

2.3gvSIG-GPE简介

gvSIG是使用Java编写的一款跨平台的开源桌面地理信息系统软件,其最大的特点是用户界面友好,支持众多空间数据格式。该系统不仅能够访问本地的矢量数据或者栅格数据,而且也能够通过支持开放空间协会OGC规范的远程服务器访问该类数据。gvSIG与其它地理信息系统的最大区别支持网络地图服务(WMS)、网络要素服务(WFS)、网络覆盖服务(WCS)、目录服务以及地名辞典服务等一系列地理信息网络服务规范[1]

libGPE是使用Java编写的一个类库,GPEGeographymarkuplanguagePersistentEngine的缩写,其最初的设计是用于读写GML文件,后来增加了读写KML文件的功能。图1libGPE的组件图,从图中可以看出libGPE具有这些特点:

  • 通用库。尽管libGPE目前仅用于gvSIG,但libGPE是一个具有框架特征的库,不会与使用它的应用程序有紧耦合,因此可以被gvSIG之外的其他应用程序使用。

  • 可扩展。libGPE的最初目标是提供对GMLKML的读写支持,但libGPE支持增加读写新格式尤其是基于XML文件格式的能力。

  • 读写分离。libGPE中使用解析器(parser)来读取文件,写入器(writer)来写文件,这两个接口是分离的,因此可以只实现其中的一个,而不必同时实现文件读写。

  • 格式透明。libGPE作为一个引擎,其给用户程序提供的是一个与具体数据格式无关的抽象层,这样可以保证libGPE的通用性[15]



基于libGPE读写KML文件的研究


3主流桌面GIS软件对KML支持现状及原因分析

3.1主流商业桌面GIS软件对KML文件的支持

1列举了主流商业桌面GIS软件对KML的支持。其中,ArcGIS9.3之前的版本可以在3DAnalyst扩展里面获得将图层和地图导出为KML的工具[16]ArcGIS10则内置导入导出KML的工具。SuperMap虽然不能直接导入KML,但可以通过EV-Globe软件来将KML转为SuperMapSDB格式[17]MapInfo8.5可以通过插件导出KML[18]GeoMedia则从6.1.4开始支持导出KML[19]。从上面的分析可以看出,大多数主流商业桌面GIS软件对导出KML的支持基本都支持,并且往往都是先在早期版本实现导出KML,然后才在更新的版本中添加导入KML的工具。

1主流商业桌面GIS软件对KML的支持

Tab1. KML support of mainstream commercialdesktop GIS softwares

软件名称

导入KML

导出KML

ArcGIS9.3

ArcGIS10

SuperMap

MapInfo8.5+

MapInfo10.5+

MapGISK9

GeoMedia6.1.4+



3.2主流开源桌面GIS软件对KML文件的支持

2列举了几款主要OSGeo旗下的几款商业桌面GIS软件对KML的支持情况,其中GRASSGISQuantumGIS是通过OGR库来实现KML的导出,但导入功能依赖于另一个libexpat库。GRASSGIS导入KML的功能则是通过libexpat来实现[20]gvSIG则是通过libGPE来实现KML的导入导出[1][21]。从上面的分析可以看出,开源软件跟商业软件类似,对导出KML的支持普遍要强于对导入KML的支持。

2主流开源桌面GIS软件对KML文件的支持

Table 2 KML support of mainstream open sourcedesktop GIS softwares

软件名称

导入KML

导出KML

GRASSGIS

部分

QuantumGIS

部分

gvSIG



3.3转换KML的插件

Arc2EarthArc2Earth,LLC公司的一个商业软件,其设计目的是使ESRIArcGISGoogleEarth能够协作[22]Arc2Earth插件提供了丰富的功能来实现ArcGISGoogleEarth的互动,其支持的特性可以在这里找到[23]

3转换KML的插件

Table3 PluginsonKML conversion

软件名称

导入KML

导出KML

Arc2Earth



3.4原因分析

3.3中的分析可以看出,大多数GIS软件对导出KML的支持要比导入KML的支持实现的早。我认为出现这种现象的主要原因有这些:

  • KML文件的长处在于能在GoogleEarth等地学浏览器中显示,其可视化效果很好,因此将传统GIS中的数据导出为KML格式进行显示,可以弥补传统GIS在可视化方便的不足,因此众多软件将注意力集中到导出KML上。

  • KML的格式很灵活,可以选择性地实现其中的标签,这样尽管在转换过程中可能丢失一些信息,但仍能将核心的坐标信息保存下来,生成KML文件。

  • KML文件是文本格式的文件,大多数的编程语言可以方便地实现。

  • KMLXML的一种扩展,因此需要和系统原有的XML模块进行整合,不能单独开发。

  • KML中和地理位置相关的注释信息如文字描述、图片和视频等是镶嵌到html中的,不易提取。

  • KML中点、线、面可以混合存储,而多数传统GIS软件每个图层只有一种要素。

  • KML的版本更新较快。

(+总结性的话)

4实现方法

4.1libGPE中数据抽象层的表示

libGPE给应用程序提供的是一个与具体数据格式无关的抽象层,使用这个抽象层可以将应用程序与具体的数据格式隔离,从而实现libGPE的通用性。为了实现这种通用性,抽象层必须尽量简单,只保留空间数据模型中最核心的部分。这个抽象层主要是由LayerFeatureGeometry这三个类实现的。图2表达了这三个类的基本关系,Layer类表示libGPE所使用的抽象层,Layer类中与空间要素相关的标签元素存储在Feature类对象的ArrayList中。Feature类中包含坐标系和空间要素的几何形状(Geometry)信息。Feature类中的几何形状信息是由Geometry类对象存储。


基于libGPE读写KML文件的研究

2libGPE中数据抽象层的结构图

Fig.2The composite structure diagram of abstract layer in libGPE

4.2libGPEKML的原理

KML本质上是一个自定义的XML文档,因此对KML的基本操作是由对XML基本模型的解析和对KML标签元素语义的提取两部分组成的。XML标签的键和值的提取是由XMLPULL库提供的SAXAPI来实现,而对KML标签语义的解析,则依靠自定义的解析器,如对于<Document>标签,由相应的DocumentBinding类来解析。这种架构将标签的词法解析与语义解析分离,从而得到了很强的灵活性。这样,在升级或添加对新标签的支持时,只需添加或修改相应的解析器即可,大大降低了维护成本。

libGPE解析KML的过程是KMLLayer类对象的映射过程:在解析KML的根元素<Document>时,便创建一个相应的Layer类;而在遇到Feature类标签(如<Placemark>等)时,则创建Feature类对象,并添加到所属的Layer对象中;若在Feature类标签中遇到Geometry类标签(如<Point>)时,则创建相应的Geometry类对象,并添加到所属的Feature中。当整个文档解析完成后,相应的Layer类对象也就生成了。

4.3libGPEKML的原理

libGPEKML的过程是读KML的逆过程:将Layer类中的信息映射到KML文件中。这个过程是通过writer控制器类来实现的。GPE中所支持的每个KML标签都有对应的writer类,GPE使用这些writer类来按照顺序生成每个标签,从而生成一份完整的KML文档。

目前libGPE所能写的KML标签有限,原因主要有这几方面:

  • libGPE为实现其通用性,其Layer类定义的十分精简。

  • KML中含有很多传统GIS中没有的信息

  • libGPE需要升级

5 我做的工作

5.1更新libGPE所识别的KML的版本

KML的版本升级到2.2后,我们升级了libGPE,增加对KML2.2版本的支持。工作的重点是检查libGPE中所能解析的标签在2.2版本中的变化,以及讨论对新标签的支持。

libGPE中解析KML是通过GPEKml2_2_Parser类来实现的。GPEKml2_2_Parser类继承自GPEDeafultKmlParser类。GPEDeafultKmlParser将对KML解析的通用操作封装起来,因此如图3所示,GPEKml2_2_Parser类只需添加不同的实现IBindingProfile接口的类即可。Kml2_2_BindingProfile是一个实现了IBindingProfile接口的类,它封装了libGPE所支持的所有KML标签的类,每个KML标签时依靠对应的Binding类来解析,图4表现了它的类结构。这种结构十分灵活,或需添加新的KML标签解析功能,只需创建一个Binding类并将其添加到Kml2_2_BindingProfile中即可使用。

每个Binding都对应于KML特定的版本,因此在设计时也将Binding类与KML标签进行最大程度的解耦合,这种版本之间的隔离是通过Kml2_2_Tags类来实现。因此,在升级时,首先修改的是Kml2_2_Tags类。通过对比,发现在KML2.1版本和2.2版本中libGPE支持的标签的区别有两个,一个是XML命名空间的不同,另一个是KML2.2版本不再使用<Element>标签。因此将Kml2_2_Tags中的NAMESPACE常量改为http://www.opengis.net/kml/2.2即可。

基于libGPE读写KML文件的研究

3GPEKml2_1_Parser类结构图4Kml2_2_BindingProfile类结构图

Fig.3The class diagram ofGPEKml2_1_Parser Fig.4The class diagram ofKml2_2_BindingProfile




5.2测试更新后的代码

在完成libGPE升级所需的代码编写工作后,必须对升级后的libGPE进行全面的测试。测试所用的KML文件不仅包括以前的KML文件,还需要在GoogleEarth中生成新的KML文件来进行测试,以保证libGPE能够真正用于实际的工业应用中。测试过程中,发现libGPE所使用的XMLPULL库有一个bug,使得对KMZ文件的导入测试总是失败,在修正完这个bug后,新版本的libGPE顺利通过了测试。

6结论

目前导入导出KML的难点在于实现这个功能的最佳方式是与原有软件系统中的XML管理系统相结合,在原有的XML读写体系上加入KML特有的标签。但如果仅实现导出KML则相对容易,仅需编写相应的脚本即可。在开源软件领域,使用OGRlibGPE等开源库赖实现导入导出KML是一种被广泛接受的方案;在商业软件领域,使用第三方的插件往往能取得更好的效果。

虽然libGPEKML的支持在开源类库领域比较出色,但相比商业软件,其功能仍然有限,需要升级和改进。在当前版本libGPE中,属性信息和文件渲染信息信息在KML的读写过程中都无法保存,其支持的KML标签也有限,并没有充分利用KML的能力。



参考文献

[1]维基百科gvSIG词条[EB/OL].http://en.wikipedia.org/wiki/GvSIG/:2010-11-30

[2]DavidA,Croxler. Google Earth For Dummies[M].Wiley Publishing, Inc.2007

[3]SandvikB.Using KML for Thematic Mapping[D].2008.

[4]PezanowskiS,Tomaszewski B & MacEachren A. An open geospatialstandards-enabled google earth application to support crisismanagement[M].Geomatics Solutions for Disaster Management.2007:225-238.

[5]KangB,Choi K,Kim I,& Oh, K. Developing a Prototype of 3D Web Map Service using 3DOpen Map APIs[C].Map Asia 2009: PN-164.

[6]LiuY,Hill D,Marini L,Kooper R,RodriguezA& MyersJ.Web 2.0 geospatial visual analytics for improved urban floodingsituational awareness and assessment[C].Proceedingsof the 17th ACM SIGSPATIAL International Conference on Advances inGeographic Information System.2009:554-555.

[7]DePaor D & Whitmeyer S. Geological and geophysical modeling onvirtual globes using KML, COLLADA, and Javascript[J].Computers & Geosciences.2010:In Press, Corrected Proof.

[8]Deligiannidis,L.; Werner, M. & Russo, J. Google Earth as a Decision SupportSystem for Targeting College Admissions Drives[C].Proc.of The 2008 International Conference on Frontiers in Education:Computer Science and Computer Engineering (FECS’08).2008: 225-230.

[9]ConroyG,Anemone R,Van RegenmorterJ& Addison A. Google Earth, GIS, and the Great Divide: a new andsimple method for sharing paleontological data[J].Journal of human evolution.2008,55(4):751--755.

[10]CaladoA,Abreu M,Chumbinho R,Silva A & Sousa L. Integration of Hydrographic Data Products in aGlobal Web Based 2D and 3D GIS[C].Proceedings of the Canadian Hydrographic Conference and NationalSurveyors Symposium.2008.

[11]WoodJ,Dykes J,Slingsby A & Clarke K. Interactive visual exploration of a largespatio-temporal dataset: reflections on a geovisualization mashup[J].Visualizationand Computer Graphics,IEEETransactions on.2007,13: 1176-1183.

[12]曾建刚,苗放,叶成名.基于GML/KML的空间数据库研究[J],计算机与数字工程.2009, 37 : 51-54.

[13]杨湘燕,董槐林,吴清锋.基于KMLGIS数据复用技术研究[J],厦门大学学报:自然科学版.2009, 48(3) : 334-337.

[14]宋艳敏,陈东银.ArcEngineOGRShapefiles文件到KML格式转换方法研究[J].国土资源遥感.2009,20(2):110-113.

[15]gvSIG-libGPE官方站点[EB/OL].http://www.osor.eu/projects/gvsig-gpe/:2010-11-30

[16]ESRI官方博客[EB/OL].http://blogs.esri.com/Info/blogs/gisedcom/archive/2008/07/20/creating-kml-files-in-arcgis-9-3.aspx:2010-11-30

[17]超图软件股份有限公司官方网站[EB/OL].http://www.supermap.com.cn/html/Supernews810.html:2010-11-30

[18]Pitney Bowes Business Insight公司官方网站[EB/OL].http://www.pbinsight.com/support/product-downloads/item/mapinfo-professional-link-utility-for-google-earth: 2010-11-30

[19]Intergraph GeoMediawiki[EB/OL].http://geomediawiki.org/Software+Updates:2010-11-30

[20]OGR库的官方网站[EB/OL].http://www.gdal.org/ogr/ogr_formats.html: 2010-11-30

[21]libGPE库的官方网站[EB/OL].http://www.osor.eu/projects/gvsig-gpe: 2010-11-30

[22]Arc2Earth的官方网站产品介绍[EB/OL].http://www.arc2earth.com/about/:2010-11-30

[23]Arc2Earth的官方网站产品特性列表[EB/OL].http://www.arc2earth.com/about/:2010-11-30












AStudy On The Import and Export KML Files

UsingOpen˙Source Software




Abstract:With the prevalence of GeoBrowsers such as Google Earth and WorldWind, the OGC KML is gradually accepted as one of the mainstream GISfile formats. Although the export of KML files supported by most ofthe GIS softwares and the import of KML is supported by the majorityof the commercial GIS softwares, the import of KML files is notsupported by many open source GIS softwares. gvSIG is an ArcViewlike open source desktop GIS software. With the help of libGPE, ajava library for gvSIG, it can import and export KML files. Thestructure of libGPE and the principal of import and export kml isdiscussed in this paper.



Keywords:KeyholeMarkup Language; GIS; gvSIG; libGPE,; Open Source











你可能感兴趣的:(lib)