由于篇幅限制本篇就来单独介绍一下.shp文件的结构;下面会持续更新,下一篇帖代码,介绍读取.shp文件和生成.shp文件的方法。
Shape files数据说明
Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件。 Shapefile将空间特征表中的非拓扑几何对象和属性信息存储在数据集中,特征表中的几何对象存为以坐标点集表示的图形文件—SHP文件,Shapefile文件并不含拓扑(Topological)数据结构。一个Shape文件包括三个文件:一个主文件(*.shp),一个索引文件(*.shx),和一个dBASE(*.dbf)表。主文件是一个直接存取,变长度记录的文件,其中每个记录描述构成一个地理特征(Feature)的所有vertices坐标值。在索引文件中,每条记录包含对应主文件记录距离主文件头开始的偏移量,dBASE表包含SHP文件中每一个Feature的特征属性,表中几何记录和属性数据之间的一一对应关系是基于记录数目的ID。在dBASE文件中的属性记录必须和主文件中的记录顺序是相同的。图形数据和属性数据通过索引号建立一一对应的关系。
1. 坐标文件的结构说明
坐标文件(.shp)用于记录空间坐标信息。它由头文件和实体信息两部分构成。
1) 坐标文件的文件头
坐标文件的文件头是一个长度固定(100 bytes)的记录段,一共有9个int型和7个double型数据。
坐标文件的结构:
文件头 |
|
记录头 |
记录内容 |
记录头 |
记录内容 |
记录头 |
记录内容 |
记录头 |
记录内容 |
……
……
记录头 |
记录内容 |
shapefiles 头文件表:
起始位置 |
名称 |
数值 |
类型 |
位序 |
0 |
File Code |
9994 |
Integer |
big |
4 |
Unused |
0 |
Integer |
big |
8 |
Unused |
0 |
Integer |
big |
12 |
Unused |
0 |
Integer |
big |
16 |
Unused |
0 |
Integer |
big |
20 |
Unused |
0 |
Integer |
big |
24 |
文件长度 |
文件的实际长度 |
Integer |
big |
28 |
版本号 |
1000 |
Integer |
Little |
32 |
几何类型 |
表示这个Shapefile文件所记录的空间数据的几何类型 |
Integer |
Little |
36 |
Xmin |
空间数据所占空间范围的X方向最小值 |
Double |
Little |
44 |
Ymin |
空间数据所占空间范围的Y方向最小值 |
Double |
Little |
52 |
Xmax |
空间数据所占空间范围的X方向最大值 |
Double |
Little |
60 |
Ymax |
空间数据所占空间范围的Y方向最大值 |
Double |
Little |
68* |
Zmin |
空间数据所占空间范围的Z方向最小值 |
Double |
Little |
76* |
Zmax |
空间数据所占空间范围的Z方向最大值 |
Double |
Little |
84* |
Mmin |
最小Measure值 |
Double |
Little |
92* |
Mmax |
最大Measure值 |
Double |
Little |
(2) Shapefile文件支持的几何类型(ShapeType)
Shapefile文件所支持的几何类型:
编号 |
几何类型 |
0 |
Null Shape(表示这个Shapefile文件不含坐标) |
1 |
Point(表示Shapefile文件记录的是点状目标,但不是多点) |
3 |
PolyLine(表示Shapefile文件记录的是线状目标) |
5 |
Polygon(表示Shapefile文件记录的是面状目标) |
8 |
MultiPoint(表示Shapefile文件记录的是多点,即点集合) |
11 |
PointZ(表示Shapefile文件记录的是三维点状目标) |
13 |
PolyLineZ(表示Shapefile文件记录的是三维线状目标) |
15 |
PolygonZ(表示Shapefile文件记录的是三维面状目标) |
18 |
MultiPointZ(表示Shapefile文件记录的是三维点集合目标) |
21 |
PointM(表示含有Measure值的点状目标) |
23 |
PolyLineM(表示含有Measure值的线状目标) |
25 |
PolygonM(表示含有Measure值的面状目标) |
28 |
MultiPointM(表示含有Measure值的多点目标) |
31 |
MultiPatch(表示复合目标) |
2) 实体信息的内容
实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目标的坐标信息,每个记录段分为记录头和记录内容两部分。
记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length) 两个记录项。它们的位序都是big。记录号(Record Number)和坐标记录长度(Content Length) 两个记录项都是int型,并且shapefile文件中的记录号都是从1开始的。
记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X、Y) ,记录内容因要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标(Point)、线状目标(PolyLine)和面状目标(Polygon)三种几何类型的.shp文件的记录内容:
(1) 点状目标
shapefile中的点状目标由一对X、Y坐标构成,坐标值为双精度型(double)。点状目标的记录内容如表2.4:
记录项 |
数值 |
数据类型 |
长度 |
个数 |
位序 |
几何类型(ShapeType) |
1(表示点状目标) |
int型 |
4 |
1 |
Little |
X方向坐标 |
X方向坐标值 |
double型 |
8 |
1 |
Little |
Y方向坐标 |
Y方向坐标值 |
double型 |
8 |
1 |
Little |
(2) 线状目标
shapefile中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子线段之间可以是相离的,同时子线段之间也可以相交。Shapefile允许出现多个坐标完全相同的连续点,当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度为0的子线段出现。线状目标的记录内容:
记录项 |
数值 |
数据类型 |
长度 |
个数 |
位序 |
几何类型(ShapeType) |
3(表示线状目标) |
int型 |
4 |
1 |
Little |
坐标范围(Box) |
表示当前线目标的坐标范围 |
double型 |
32 |
4 |
Little |
子线段个数(NumParts) |
表示构成当前线目标的子线段的个数 |
int型 |
4 |
1 |
Little |
坐标点数(NumPoints) |
表示构成当前线目标所包含的坐标点个数 |
int型 |
4 |
1 |
Little |
Parts数组 |
记录了每个子线段的坐标在Points数组中的起始位置 |
int型 |
4×NumParts |
NumParts |
Little |
Points数组 |
记录了所有的坐标信息 |
Point型 |
根据点个数来确定 |
NumPoints |
Little |
(3) 面状目标
shapefile中 的面状目标是由多个子环构成,每个子环是由至少四个顶点构成的封闭的、无自相交现象的环。对于含有岛的多边形,构成它的环有内外环之分,每个环的顶点的排列顺序或者方向说明了这个环到底是内环还是外环。一个内环的顶点是按照逆时针顺序排列的;而对于外环,它的顶点排列顺序是顺时针方向。如果一个多边形只由 一个环构成,那么它的顶点排列顺序肯定是顺时针方向。
每条多边形记录的数据结构与线目标的数据结构完全相同,
Polygon
{
Double[4] Box // 当前面状目标的坐标范围
Integer NumParts // 当前面目标所包含的子环的个数
Integer NumPoints // 构成当前面状目标的所有顶点的个数
Integer[NumParts] Parts // 每个子环的第一个坐标点在Points的位置
Point[NumPoints] Points // 记录所有坐标点的数组
}
对于一个shapefile中的多边形,它必须满足下面三个条件:
l 构成多边形的每个子环都必须是闭合的,即每个子环的第一个顶点跟最后一个顶点是同一个点;
l 每个子环在Points数组中的排列顺序并不重要,但每个子环的顶点必须按照一定的顺序连续排列;
l 存储在shapefile 中的多边形必须是干净的。所谓一个干净的多边形,它必须满足两点:
¨ 没有自相交现象。这就要求任何一个子环不能跟其它的子环相交,共线的现 象也将被当作相交。但是允许两个子环的顶点重合;
¨ 对于一个不含岛的多边形或者是含岛的多边形的外环,它们的顶点排列顺序必须是顺时针方向;而对于内环,它的排列顺序必须是逆时针方向。所谓的“脏多边形”就是指顶点排列顺序为顺时针的内环。
面状目标的记录内容:
记录项 |
数值 |
数据类型 |
长度 |
个数 |
位序 |
几何类型(ShapeType) |
5(表示面状目标) |
int型 |
4 |
1 |
Little |
坐标范围(Box) |
表示当前面目标的坐标范围 |
double型 |
32 |
4 |
Little |
子线段个数(NumParts) |
表示构成当前面状目标的子环的个数 |
int型 |
4 |
1 |
Little |
坐标点数(NumPoints) |
表示构成当前面状目标所包含的坐标点个数 |
int型 |
4 |
1 |
Little |
Parts数组 |
记录了每个子环的坐标在Points数组中的起始位置 |
int型 |
4×NumParts |
NumParts |
Little |
2. 属性文件的结构说明
属性文件(.dbf)用于记录属性信息。它是一个标准的DBF文件,也是由头文件和实体信息两部分构成。
文件头 |
|
记录1 |
|
记录2 |
|
记录3 |
|
记录4 |
|
……
……
记录n |
1) 属性文件的文件头
其中文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明(见表2.7),其中最主要的是对这个DBF文件的记录项的信息进行了详细地描述,比如对每个记录项的名称、数据类型、长度等信息都有具体的说明。
属性文件(.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表示记录项的个数。这个数组的结构在表2.8中有详细的解释。 |
X+1 |
1个字节 |
作为记录项终止标识。 |
记录项信息描述:
位置 |
内容 |
说明 |
0-10 |
11个字节 |
记录项名称,是ASCII码值。 |
11 |
1个字节 |
记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见表2.9)。 |
12-15 |
4个字节 |
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。 |
16 |
1个字节 |
记录项长度,二进制型。 |
17 |
1个字节 |
记录项的精度,二进制型。 |
18-19 |
2个字节 |
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。 |
20 |
1个字节 |
工作区ID。 |
21-30 |
10个字节 |
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。 |
31 |
1个字节 |
MDX标识。如果存在一个MDX 格式的索引文件,那么这个记录项为真,否则为空。 |
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) |
各种字符。 |
2) 属性文件的实体信息
实体信息部分就是一条条属性记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。
3. 索引文件的结构说明
索引文件(.shx)主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的文件头的偏移量。通过索引文件可以很方便地在坐标文件中定位到指定目标的坐标信息。
索引文件也是由头文件和实体信息两部分构成(如图2.5),其中文件头部分是一个长度固定(100 bytes)的记录段,其内容与坐标文件的文件头基本一致。它的实体信息以记录为基本单位,每一条记录包括偏移量(offset)和记录段长度(Content Length)两个记录项,它们的位序都是big,两个记录项都是int型。
索引文件的结构:
文件头 |
|
记录1 |
|
记录2 |
|
记录3 |
|
记录4 |
|
……
……
记录n |
索引文件的记录内容:
记录项 |
数值 |
数据类型 |
长度 |
个数 |
位序 |
位移量(Offset) |
表示坐标文件中的对应记录的起始位置相对于坐标文件起始位置的位移量。 |
int型 |
4 |
1 |
Big |
记录长度 (Content Length) |
表示坐标文件中的对应记录的长度。 |
int型 |
4 |
1 |
Big |
转自:http://blog.csdn.net/gis0911178/article/details/52162072