一个完整的ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表文件。主文件是一个直接存取,变记录长度文件,其中每个记录描述一个由其顶点列表组成的shape。在索引文件中,每条记录是在主文件中对应记录距离主文件头部的偏移量。dBASE中记录的是对应主文件中记录的属性记录,每条主文件记录对应dBASE中的一条属性记录。几何对象和属性间的一一对应关系是基于记录编号的。在dBASE文件中的属性记录必须和主文件中的记录保持相同的顺序。
所有文件名都遵循8.3命名习惯。主文件,索引文件和dBASE文件有相同的前缀。前缀必须是由字符或数字(a-Z,0-9)开始,后跟0到7个字符(a-Z,0-9,_,)主文件的后缀是.shp,索引文件的后缀是.shx,dBASE表的后缀是.dbf。在对文件名敏感的操作系统中,文件名中的所有字母都是小写的。
例子 :
主文件:counties.shp
索引文件:counties.shx
dBASE表:ounties.dbf
Shape格式文件存储整数型和双精度型数据,本文档的余下部分将涉及到以下类型:
整数:有符号32位整数(4字节)
双精度:有符号64位IEEE双精度浮点数(8字节)
浮点数必须是数字值。负无穷,正无穷和无效数字(NaN)在shape文件中是不合法的。然而,shape文件支持“没有数据”这样的概念,但是目前只用于带有measure值的情况。所谓Measure值,是用于存储需要的附加数据,可以用来记录各种数据,例如权值、道路长度等信息。某些小于-1038被shape文件读取程序用来表示为“没有数据”的值。
下面的第一节描述shape文件的总体结构和组织。第二节描述shape文件支持的每种shape类型的记录内容。
主文件(.shp)由固定长度的文件头和后面变长的记录组成。每个变长记录是由固定长度的记录头和紧接着的变长记录内容组成。图1是主文件的结构。
图 1 主文件的结构
文件头 |
|
记录头 |
记录内容 |
记录头 |
记录内容 |
记录头 |
记录内容 |
。。。。。。 |
。。。。。。 |
。。。。。。 |
。。。。。。 |
记录头 |
记录内容 |
字节序
Shape文件中所有的内容可以被分为两种类型:
n 与数据相关的:
l 主文件记录内容
l 主文件头的数据描述域(Shape 类型,边界盒等)
n 与文件管理相关的:
l 文件和记录长度
l 记录偏移量等
在主文件的文件头和记录内容中的描述域中的整型和双精度浮点数据是按照little endian(PC或Intel)的字节顺序形式组织的。组成文件的其余部分和文件管理的整数和双精度浮点数是big endian(Sun或Motorola)字节顺序。
主文件头100字节长。表1描述了文件头中数据的字节位置,值,类型和字节顺序。 在此表中,位置是相对于文件头的。
表 1 主文件头的描述
位置 |
字段 |
值 |
类型 |
字节顺序 |
Byte 0 |
File Code(文件代码) |
9994 |
Integer |
Big |
Byte 4 |
Unused |
0 |
Integer |
Big |
Byte 8 |
Unused |
0 |
Integer |
Big |
Byte 12 |
Unused |
0 |
Integer |
Big |
Byte 16 |
Unused |
0 |
Integer |
Big |
Byte 20 |
Unused |
0 |
Integer |
Big |
Byte 24 |
File Length(文件长度) |
File Length |
Integer |
Big |
Byte 28 |
Version |
1000 |
Integer |
Little |
Byte 32 |
Shape Type |
Shape Type |
Integer |
Little |
Byte 36 |
Bounding Box |
Xmin |
Double |
Little |
Byte 44 |
Bounding Box |
Ymin |
Double |
Little |
Byte 52 |
Bounding Box |
Xmax |
Double |
Little |
Byte 60 |
Bounding Box |
Ymax |
Double |
Little |
Byte 68* |
Bounding Box |
Zmin |
Double |
Little |
Byte 76* |
Bounding Box |
Zmax |
Double |
Little |
Byte 84* |
Bounding Box |
Mmin |
Double |
Little |
Byte 92* |
Bounding Box |
Mmax |
Double |
Little |
*是未被使用的域,值为0.0,如果没有measure值或Z轴。
文件长度的值指的是16位字的个数,即文件的字节长度除以2(包括组成文件头的50个16位字)。
在shape文件中的所有非空shape必须是同一种shape类型。Shape类型的值如下:
值 |
Shape类型 |
0 |
Null Shape |
1 |
Point |
3 |
PolyLine |
5 |
Polygon |
8 |
MultiPoint |
11 |
PointZ |
13 |
PolyLineZ |
15 |
PolygonZ |
18 |
MultiPointZ |
21 |
PointM |
23 |
PolyLineM |
25 |
PolygonM |
28 |
MultiPointM |
31 |
MultiPatch |
没有被定义的Shape 类型值(2,4,6等直到33)为将来可能的使用而保留。目前shape文件被局限于包含以上定义的同种shape类型。但在将来shape文件可能会允许包含多种shape类型。若混合shape类型被实现,文件头中的shape类型将标识该文件。
主文件头的边界盒存储文件中shape的实际范围。所有的shape记录将都处于这个范围定义的矩形边界以内。如果shape文件是空的(没有记录),Xmin,Ymin,Xmax,Ymax的值则将是未被定义的。如果shape文件的类型是带有measure的,而实际却又没有记录measure数据的话,Mmin和Mmax可以是“没有数据”的值(参见2页的数字类型)。
每个记录的头存储了记录的数目和记录内容的长度。记录头固定长度为8字节。表 2显示文件记录头中域的字节位置,值,类型和字节顺序。在表中,位置是相对于记录的开始位置。
表 2 主文件记录头文件的描述
位置 |
字段 |
值 |
类型 |
字节顺序 |
Byte 0 |
Record Number (记录数目) |
Record Number |
Integer |
Big |
Byte 4 |
Content Length (内容长度) |
Content Length |
Integer |
Big |
记录数目从1开始。
一个记录的内容长度是按16位字计算的记录内容长度。每个记录因此为文件的总长度贡献(4+内容长度)个16位字,正如文件头是100字节一样。
完整内容见附件。