转载自http://wenku.baidu.com/link?url=3TG7c0cERbdnZwFBLq6n2v-chB-k4ja5ikNYSyRQHyLf4yvYCGBEGrlhch8GD5e-96PfkAi-r_98QwDqLe6kw-4Ek8aBTLh1yFaKOXic2w7
ESRI的Shapefile文件向Google Earth中KML文件的格式转换
【摘要】:21世纪,是科学技术与信息技术高速发展的时期,地理信息技术也不例外。为了促进GIS技术与产业的发展,促进地理信息系统的开发,实现海量地理数据的共享和存储,我们有必要从实际应用出发,研究地理信息系统开发过程中出现的各种数据结构、数据格式以及它们之间的转换。本文以ESRI的Shapefile文件和Google Earth中KML文件为例,利用ArcGIS软件中的二次开发功能,以VBA语言为依托,将Shapefile文件转换为Google Earth中KML文件,并给出最终的转换结果和程序代码。
【关键词】:KML文件 Shapefile文件 ArcGIS 地理信息系统 Google Earth
1.引言
Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件。 Shapefile将空间特征表中的非拓扑几何对象和属性信息存储在数据集中,特征表中的几何对象存为以坐标点集表示的图形文件—SHP文件,Shapefile文件并不含拓扑(Topological)数据结构。一个Shape文件包括三个文件:一个主文件(*.shp),一个索引文件(*.shx),和一个dBASE(*.dbf)表。主文件是一个直接存取,变长度记录的文件,其中每个记录描述构成一个地理特征(Feature)的所有vertices坐标值。在索引文件中,每条记录包含对应主文件记录距离主文件头开始的偏移量,dBASE表包含SHP文件中每一个Feature的特征属性,表中几何记录和属性数据之间的一一对应关系是基于记录数目的ID。在dBASE文件中的属性记录必须和主文件中的记录顺序是相同的。图形数据和属性数据通过索引号建立一一对应的关系。
Shapefile中坐标文件(.shp)由固定长度的文件头和接着的变长度空间数据记录组成。文件头由100字节的说明信息组成,主要说明文件的长度、Shape类型、整个Shape图层的范围等等,这些信息构成了空间数据的元数据。在导入空间数据时首先要读入文件头获取Shape文件的基本信息,并以此信息为基础建立相应的元数据表。而变长度空间数据记录是由固定长度的记录头和变长度记录内容组成,其记录结构基本类似,每条记录都由记录头和记录内容组成(空间坐标对)。记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length)两个记录项,Shapefile文件中的记录号都是从1开始的,坐标记录长度是按16位字来衡量的。记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X,Y),记录内容因要素几何类型的不同,其具体的内容和格式都有所不同。
属性文件(.dbf)用于记录属性信息。它是一个标准的DBF文件,也是由头文件和实体信息两部分构成。其中文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明,其中最主要的是对这个DBF文件的记录项的信息进行了详细的描述,比如对每个记录项的名称,数据类型,长度等信息都有具体的说明。属性文件的实体信息部分就是一条条属性记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。
索引文件(.shx)主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的文件头的偏移量。通过索引文件可以很方便地在坐标文件中定位到指定目标的坐标信息。索引文件也是由文件头和实体信息两部分构成的,其中文件头部分是一个长度固定(100 bytes)的记录段,其内容与坐标文件的文件头基本一致。它的实体信息以记录为基本单位,每一条记录包括偏移量(Offset)和记录段长度(Content Length)两个记录项。
KML全称是Keyhole Markup Language (KML),是一个基于XML语法和文件格式的文件,用来描述和保存地理信息如点、线、图片、折线并在Google Earth客户端之中显示(图2),(KML以前的版本能够被Google Earth读取并保存为KML 2.0) KML 2.0提供以下功能:
(1)指定一个地点的图标和标注来区分每一个地点
(2)为每一个视图指定明确的视角来创建不同的特写镜头
(3)使用指定到屏幕或地理位置的图片标注
(4)为特定种类的标注定义显示样式
(5)为标注指定基于简单HTML语法的描述,支持超级链接和图片的显示
(6)使用目录(folders)对标注进行树形的分类管理(为了便于理解和符合习惯,将"folder"翻译为"目录",实际上是代表一组地理标注,请谅解)
(7)基于时间戳记的标注可以用来进行动态的播放
(8)从本地或远程的网络地址动态的加载KML文件
图1
图2
2.课题研究的背景
2.1国内外研究现状
由于编辑XML文件并不复杂,只要懂编程就可以进行一些简单的KML文件编程。尽管如此,在网上还是很难找到关于KML文件编程的详细教程,一般都是一些基础性的说明文档,以GOOGLE官方说明文档居多。GE虽然很有名,但对普通用户来说,只要能使用GE软件进行一些基本的操作就够了,一般不涉及编程。而会编程的人员却不一定懂得GIS的开发,或是从事其它方面的软件开发,或是出于对软件知识产权的保护而不公开相关的开发代码和研究资料。所以就国内来说,本科生从事相关研究还是很少见的。
2.2 GE地标点的编程研究还未结束
随着Internet应用的普及,社会经济的发展,GIS的应用越来越广范。而GE正处于起步阶段,但发展很迅速,且KML文件已成为地理信息系统行业标准。从网上搜索来看,GE编程的资料还是偏少的。一般以其它文件格式转化为KML文件格式较常见,而KML格式转换为其它格式的资料几乎搜索不到。
2.3 课题的研究意义
(1)GE地标点文件的转换可以加快地理信息系统软件的开发和应用,使GIS软件开发模块化,GE地标点文件的编程转换可作为GIS软件的一个模块来运行。而KML文件已成为一种通用的数据格式,GE所产生的地标点数据是非常大的,如果能够转换,可以实现数据共享,促进地理信息系统的开发。
(2)研究此课题可更加深入的学习GIS相关的知识,为更深入的编程打下基础。
(3)做为大学学习的总结,提高自己的学习能力,实现自我价值
3.GE地标点文件概述
GE地标点文件是一种KML文件格式的文件。KML,是 Keyhole 标记语言(KeyholeMarkup Language)的缩写,是一种采用 XML 语法与格式的语言,用于描述和保存地理信息(如点、线、图像、多边形和模型等),可以被 Google Earth 和 Google Maps 识别并显示。KML是XML的一种派生语言,所以KML和XML语言的语言格式差不多。下面分别对XML文件和KML文件的格式做一简单的介绍。
3.1 XML文件格式简介
XML是可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。XML是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据。XML文件格式如下:
XML-stylesheettype="text/xsl" href="yxfqust.xsl" ?>
<学生名单>
<学生>
<学号>0507079054〈学号〉 <姓名>朱明姓名>
<班级>
05地理班级>
学生>
<学生>
学生名单>
其中,文件头:是XML文件的标记,“GB2312”是指文件的编码类型,除此外还有UTF8,ANSI,UNICODE等文件格式。而<*>里面的则是XML树里的节点。和XML格式相似,KML格式也有类似的结构。KML的格式如下:
……,省略部分代码
……,省略部分代码
,标签
注意:“,”后面为注释部分.
其中是其文件头,其中的编码是UTF8格式。
中间
3.2KML文件格式介绍
基本格式的KML文件是指可以直接由Google Earth创建的KML文件,它包括地点标记、叠层、路线和多边形,下面分别介绍。
3.2.1文件格式
(1) 地点标记(Placemarks)
上一节我们给出了一个地点标记(Placemarks)的示例。地点标记是Google Earth中最常用的地理特征,它使用一个黄色的图钉在地球表面标记一个位置。一个简单的地点标记的KML代码如下所示:
at the height of the underlying terrain.
它包括以下几个部分:
①XML头:
②KML命名空间定义:
③地点标记对象,包括:
名称(name):用于对地点标记进行注记。
描述(description):对地点标记进行描述,“气球(ballon)”中的显示内容。
点(Point):指定地点标记的位置。
(2)使用HTML描述地点标记
有两种方式来使用HTML描述地点标记,一种是直接在
CDATA Tags are useful!
Text is morereadable and
easier to write when you can avoid using entity
references.
]]>
当然,还有一种使用转义字符来表示特殊符号的方式,这就不需要CDATA元素,如下所示:
<h1>Entity referencesare hard to type!</h1>
<p><fontcolor="green">Text is
<i>more readable</i>
and <b>easier to write</b>
when you can avoid using entity references.</font></p>
(3)叠层
叠层是覆盖在地球表面的图像。一个简单的叠层KML代码如下所示:
在
Google Earth支持JPEG,BMP, GIF, TIFF, TGA和PNG等格式的图像。
(4)路线
在KML里面,路线由
-112.2550785337791,36.07954952145647,2357 -112.2549277039738,36.08117083492122,2357 -112.2552505069063,36.08260761307279,2357 -112.2564540158376,36.08395660588506,2357 -112.2580238976449,36.08511401044813,2357 -112.2595218489022,36.08584355239394,2357 -112.2608216347552,36.08612634548589,2357 -112.262073428656,36.08626019085147,2357 -112.2633204928495,36.08621519860091,2357 -112.2644963846444,36.08627897945274,2357 -112.2656969554589,36.08649599090644,2357
(5)多边形
多边形由
-77.05788457660967,38.87253259892824,100 -77.05465973756702,38.87291016281703,100 -77.05315536854791,38.87053267794386,100 -77.05552622493516,38.868757801256,100 -77.05844056290393,38.86996206506943,100 -77.05788457660967,38.87253259892824,100
-77.05668055019126,38.87154239798456,100 -77.05542625960818,38.87167890344077,100 -77.05485125901024,38.87076535397792,100 -77.05577677433152,38.87008686581446,100 -77.05691162017543,38.87054446963351,100 -77.05668055019126,38.87154239798456,100
3.2.2 语法规则
和任何程序语言与脚本语言一样,KML有一些必须遵循的语法规则。
文档结构 一个KML文档应该完全遵循KML格式,文档也和基本的XML语法规则差不多,有以下几点要特别注意的地方。
XML标签必须关闭,XML标签是大小写敏感的。对于KML语法,首字母大写的标签是复合标签,否则就是单一标签,在实体和标签介绍之中有更多相关信息。XML标签必须正确嵌套XML文档,必须只有一个根标签对于KML文件,这意味着你可以使用
) 。
XML的注释方法和HTML是一样的,要了解更多信息,可以去查阅XML参考文档或语法向导。如果你的KML文档结构不符合XML文档规范,将会在Google Earth中产生一个解析错误的对话框 (查看http://www.w3.org/XML/了解根多关于XML的信息。) 注意: XML Schema 验证还没有被Google Earth支持。
标记类型 有两种基本的KML标记类型: 单一标签和复合标签。复合标签的标签名首字母是大写的,而单一标签都是小写的,复合标签能够作为其他标签(单一标签或复合标签)的父元素,而单一标签只能是其他复合标签的子元素,而自身不能包含其他元素。
字符串 在KML文件中的任何字符串,例如 name 和 description标签中的值,都可以是utf-8或者Unicode编码的字符串。
KML标签列表这一节包含所有能用的KML标签的参考,按字母顺序排列,每一段列出了该标签正确的大小写格式,类型、值和层次(省略)。
KML标签列表:
Print#1, "
Print#1, "
Print#1, "
Print#1, "
Print#1, "
Print#1, "
Print#1, "
Print #1, " "
Print #1, " "
Print #1, "
Print #1, "
Print #1, "
Print #1, " "
Print#1, "
Print #1, "
Print #1, "
Print#1, "
Print#1, "
Print#1, "
DimstrXYZCoordinates(10000) As String
c= 0
Dimm_strXCoord As String
Dimm_strYCoord As String
Dimm_strZCoord As String
DimpPoly As IPolygon
DoUntil pf Is Nothing
Setpf = pfcur.NextFeature
Ifpf.Shape.GeometryType = esriGeometryPolygon Then
Set pPoly = pf.Shape
m_strXCoord = pPoly.FromPoint.X
m_strYCoord = pPoly.FromPoint.Y
m_strZCoord = pPoly.FromPoint.Z
EndIf
strXYZCoordinates(c) = m_strXCoord &"," & m_strYCoord & "," & m_strZCoord
Print #1, " " &strXYZCoordinates(c)
c = c + 1
Set pf = pfcur.NextFeature
Loop
Print#1, " "
Print#1, " "
Print#1, " "
Print#1, " "
Print#1, " "
Print#1, " "
Print#1, " "
Print#1, " "
EndSub
【程序测试】:
开发环境:WINDOWS XP SP2,CPU 2.8G, 内存4GB
运行环境:WINDOWS 2000以上, 内存512MB以上 基于ArcGIS中的VBA平台(数据为ArcGIS中自带的country.shp数据)
【参考文献】:
1.曹礼刚,王绪本.空间数据转换与考古数据探测WebGIS.计算机工程(
Computer Engineering).2007,33(18)
2. ShapeFile文档技术白皮书[Z]. (2006-08-14). http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
3. CSDN博客
http://blog.csdn.net/carlbiao/archive/2009/01/02/3685728.aspx
http://blog.csdn.net/suen/archive/2007/07/05/1679983.aspx
4. Google Earth官方网站
http://earth.google.com/
5. 中国XML编程站
http://www.xml.org.cn/index.html
6. GIS帝国论坛
http://www.gisempire.com/bbs/
7. 地理信息系统论坛社区
http://www.gisforum.net/bbs/