shapefile文件结构

1. shp文件

1. 文件结构

Position Field Value Type Order
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
  • Unused, with value 0.0, if not Measured or Z type
    说明:Big表示大尾(big endian)型字节顺序,即是高低位字节是反序的,主要适用于Sun® or Motorola®平台,而Little表示小尾(little endian)型字节顺序,高低位字节顺序不变,主要使用在PC or Intel®平台。在读取的字节为Big时,需要进行字节顺序交换,才能得出正确的值。

一个把Big顺序转换为Little顺序的函数可以如下:

int Big2LittleEndian(int num)
{
   int reverse; //返回结果
   char bit0, bit1, bit2, bit3;  
   bit0 = (num & 0x000000ff);
   bit1 = (num & 0x0000ff00) >> 8;
   bit2 = (num & 0x00ff0000) >> 16;
   bit3 = (num & 0xff000000) >> 24;  
   reverse = (bit0 

2. shapefile的图形对象类型

文件头中第32-35位字节为一个整型,其值反映了shapefile的图形对象类型,具体值对应含义如下:

Value Shape Type
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

3. 图幅的范围大小

第36-67个字节包含了图幅的范围大小,每条记录由记录头和实体内容组成,记录头格式固定,具体组成如下所示:

Position Field Value Type Byte Order
Byte 0 Record Number Record Number Integer Big
Byte 4 Content Length Content Length Integer Big

说明:记录头包含8个字节,0-3表示记录的顺序号,4-7表示记录实体自身的大小。 实体的内容根据对象类型不同而变化,需根据具体情况处理。

2. shx文件

1. 文件结构

.shx文件由文件头和记录组成,文件头与前述.shp文件一致,但需注意File Length字段的值不一样。而每条记录由2个整型组成,具体内容如下:

Position Field Value Type Byte Order
Byte 0 Offset Offset Integer Big
Byte 4 Content Length Content Length Integer Big

说明:offset表示该条记录在.shp文件中的字节位置,而Content Length说明了记录的大小。

3. DBF文件

标准的DBF文件,是由头文件和实体信息两部分构成。文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明(表),其中最主要的是对这个DBF文件的记录项的信息进行了详细地描述,比如对每个记录项的名称、数据类型、长度等信息都有具体的说明。

1. 文件(.dbf)的文件头

在文件中的位置 内容 说明
0 1个字节 表示当前的版本信息
1-3 3个字节 表示最近的更新日期,按照YYMMDD格式。
4-7 1个32位数 文件中的记录条数。
8-9 1个16位数 文件头中的字节数。
10-11 1个16位数 一条记录中的字节长度。
12-13 2个字节 保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
14 1个字节 表示未完成的操作。
15 1个字节 dBASE IV编密码标记。
16-27 12个字节 保留字节,用于多用户处理时使用。
28 1个字节 DBF文件的MDX标识。在创建一个DBF 表时 ,如果使用了MDX 格式的索引文件,那么 DBF 表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX 文件。
29 1个字节 Language driver ID.
30-31 2个字节 保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
32-X (n*32)个字节 记录项信息描述数组。n表示记录项的个数。这个数组的结构在下表中有详细的解释。
X+1 1个字节 作为记录项终止标识。

2. 记录项信息描述

位置 内容 说明
0-10 11个字节 记录项名称,是ASCII码值。
11 1个字节 记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见下表)。
12-15 4个字节 保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
16 1个字节 记录项长度,二进制型。
17 1个字节 记录项的精度,二进制型。
18-19 2个字节 保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
20 1个字节 工作区ID。
21-30 10个字节 保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
31 1个字节 MDX标识。如果存在一个MDX 格式的索引文件,那么这个记录项为真,否则为空。

3. dbf文件中的数据类型

代码 数据类型 允许输入的数据
B 二进制型 各种字符。
C 字符型 各种字符。
D 日期型 用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。
G (General or OLE) 各种字符。
N 数值型(Numeric) – . 0 1 2 3 4 5 6 7 8 9
L 逻辑型(Logical) ? Y y N n T t F f (? 表示没有初始化)。
M (Memo) 各种字符。