shapefile文件结构
2019-07-28 本文已影响0人
清远_03d9
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 << 24) | (bit1 << 16) | (bit2 << 8) | (bit3);
return reverse;
}
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) | 各种字符。 |