Shapefile将空间要素的非拓朴的几何结构和属性信息存储在数据集中。这种几何结构包含一系列的矢量坐标。Shapefile支持点状、线状和面状要素。其中面状要素是封闭的环路,并且相邻两个面状要素的公共边是重复画两次的,也就是分别存储于属于这个面状要素的几何结构中。
目前有四种方式获得Shapefile格式的数据:
(1)导出成Shapefile格式:用ARC/INFO,PC ARC/INFO,SDE,ArcView GIS或者BusinessMAP软件从其他数据源导出成为Shapefile数据。
(2)数字化:用ArcView GIS的要素创建工具可以通过数字化直接创建Shapefile数据。
(3)程序:用Avene(ArcView GIS),MapObjects,ARC 宏语言(AML)(ARC/INFO)或简单宏语言(SML)(PC ARC/INFO)软件可以用程序创建Shapefile数据。
(4)通过创建程序直接写入Shapefile定义中。
Shapefile的文件
一个ESRI的shapefile数据包含一个主文件(.shp),一个索引文件(.shx)和一个dBASE(.dbf)表。主文件是直接访问的,变长记录的文件,每一条记录都描述一个形状的一系列结点。在索引文件中,每一条记录包含主文件相应记录相对于主文件头的偏移量。dBASE表中每条记录表示一个要素的属性。这种几何结构和属性要素一对一的关系是通过记录号来控制的,表中的属性记录的顺序必须和主文件中的记录顺序相同。
Shapefile存储整型和双精度型的数据。整型数据是有符号32位整型(4字节),双精度数据是有符号64位IEEE双精度浮点数据(8字节)。浮点数必须是数字的值,正无穷、负无穷和非数字(NaN)值都是不允许的。不过,shapefile支持“无数据”的值,但是通常只能用于测量。任何小于-10(38)浮点数都被认为是“无数据”。
一、主文件:
主文件(.shp)包含一个定长的文件头,之后就是变长的记录。每一条变长的记录都是由一个定长的记录头和变长的记录内容组成的。Shapefile的内容分为两类:一是数据相关,包括主文件记录内容和主文件头的数据描述范围(形状类型,最小矩形外框等);二是文件管理相关,包括文件和记录的长度和记录的偏移量等。主文件中用于记录数据相关的整型和双精度整型的字节序是little endian(PC或Intel),而用于文件管理相关的字节序则是big endian(Sun or Motorola)。
主文件头长度为100字节。下表列出头的字节位置、值、类型和字节序。
位置
|
字段
|
字段值
|
字段类型
|
字节序
|
Byte 0
|
文件代码
|
9994
|
整型
|
Big
|
4
|
未使用
|
0
|
整型
|
Big
|
20
|
未使用
|
0
|
整型
|
Big
|
24
|
文件长度
|
文件长度
|
整型
|
Big
|
28
|
版本
|
1000
|
整型
|
Little
|
32
|
几何形状
|
形状类型
|
整型
|
Little
|
36
|
边界框
|
X最小值
|
双精度浮点型
|
Little
|
44
|
边界框
|
Y最小值
|
双精度浮点型
|
Little
|
52
|
边界框
|
X最大值
|
双精度浮点型
|
Little
|
60
|
边界框
|
Y最大值
|
双精度浮点型
|
Little
|
68*
|
边界框
|
Z最小值
|
双精度浮点型
|
Little
|
76*
|
边界框
|
Z最大值
|
双精度浮点型
|
Little
|
84*
|
边界框
|
M最小值
|
双精度浮点型
|
Little
|
92*
|
边界框
|
M最小值
|
双精度浮点型
|
Little
|
注意:如果不是测量或者Z型,带*的部分就没有使用,其值为0.0。
文件长度是文件的所有长度,用16位字表示(即包括50个16位字长度的文件头)。
几何类型的对应值为:无形状(0),点(1),线(3),多边形(5),多点(8),Z型点(11),Z型线(13),Z型多边形(15),Z型多点(18),M型点(21),M型线(23),M型多边形(25),M型多点(28),MultiPatch(31)。
每一条记录的头保存该条记录号和内容长度。记录头是定长的,占8字节。前4字节整型表示记录号,字节序是Big;后4字节整型表示记录内容长度,字节序是Big。内容长度只是内容的长度,用16位字表示。所以,每条记录的长度就是(4+内容长度)的16位字表示。
主文件的记录内容包含几何类型和几何数据。记录内容的长度取决于形状的部分和结点的数量,每一种几何类型有其相应的记录内容。
(1)无形状:通常无形状是用来占位的,在shapefile创建时设置为无形状,之后再
添加几何数据。
位置
|
字段
|
字段值
|
字段类型
|
个数
|
字节序
|
Byte 0
|
几何形状
|
0
|
整型
|
1
|
Little
|
(2)X,Y空间的点:包括一对双精度的X,Y坐标值。
位置
|
字段
|
字段值
|
字段类型
|
个数
|
字节序
|
0
|
几何形状
|
1
|
整型
|
1
|
Little
|
4
|
X
|
X坐标
|
双精度
|
1
|
Little
|
12
|
Y
|
Y坐标
|
双精度
|
1
|
Little
|
(3)X,Y空间的多点:是一个点集。包括边界框、点个数和各个点的坐标。
位置
|
字段
|
字段值
|
字段类型
|
个数
|
字节序
|
0
|
几何形状
|
8
|
整型
|
1
|
Little
|
4
|
边界框
|
矩形顶点值
|
双精度
|
4
|
Little
|
36
|
点数
|
点的个数值
|
整型
|
1
|
Little
|
40
|
点集
|
各个点坐标
|
点型
|
点的个数
|
Little
|
(4)X,Y空间的线:是一个有序的顶点集合,包括一个或多个部分。部分是指连接两个或两个以上顶点的序列。部分可能会相连也可能不相连,可能相交也可能不相交。包括边界框、部分数、点数、每个部分第一个点的索引序号和各个点的坐标。
注意:X=44+4×部分的个数。
位置
|
字段
|
字段值
|
字段类型
|
个数
|
字节序
|
0
|
几何形状
|
3
|
整型
|
1
|
Little
|
4
|
边界框
|
矩形顶点值
|
双精度
|
4
|
Little
|
36
|
部分数
|
部分个数值
|
整型
|
1
|
Little
|
40
|
点数
|
点的个数值
|
整型
|
1
|
Little
|
44
|
部分集
|
每个部分第一个点在点集中的序号
|
整型
|
部分的个数
|
Little
|
X
|
点集
|
各个点坐标
|
点型
|
点的个数
|
Little
|
(5)X,Y空间的多边形:一个多边形包含一个或多个环。环是一个首尾连接的由4个或4个以上的点组成的一个封闭的,非自交的环路。一个多边形可能包含多重外环路。一个环的顶点顺序或方向显示了环是否位于多边形的内部。内部环是逆时针的,而简单的环状多边形通常是顺时针的。和线类似,多边形也包括边界框、部分数、点数、每个部分第一个点的索引序号和各个点的坐标,只是多边形中把环看做是部分。其内容表同线相同,略。
下面这个例子是一个包含一个内环的共有8个顶点的多边形。对于多边形类型有几点需要注意:
l 环是封闭的,也就是第一个和最后一个顶点必须是相同的。
l 每一个环的顶点组成的点的数组中,环的顺序是不重要的。
l 存储在shapefile中的多边形必须是“干净的”。这里干净的多边形是指:
Ø 不自交。就是说属于一个环的部分不能也属于另一个环。顶点可以共用,但环中的部分不能共用。
Ø 内部环是逆时针顺序的。“不干净的”多边形中内环的顺序也是顺时针的,会造成内部重叠。
以上图为例,该多边形部分个数为2,顶点个数为10。
部分:0(第一部分由v1、v2、v3、v4、v1组成,第一个顶点在点集中的序号为0)
5(第二部分由v5、v8、v7、v6、v5组成,第一个顶点在点集中的序号为5,
且为内环,所以点的顺序是逆时针)
点集: v1 v2 v3 v4 v1 v5 v8 v7 v6 v5
(序号) 0 1 2 3 4 5 6 7 8 9
(其他的几何类型比较类似,就先略掉了)
二、索引文件:
索引文件包括100字节文件的头和定长为8字节的若干条记录。
索引文件头中的文件长度也是用16位字来计算的,为50个16位字和记录的条数乘以4倍的字数。
第I条索引记录存储其在主文件中的偏移量和主文件中该条记录的内容长度。
位置
|
字段
|
字段值
|
字段类型
|
字节序
|
0
|
偏移量
|
偏移量值
|
整型
|
Big
|
4
|
内容长度
|
内容长度值
|
整型
|
Big
|
注意:记录的偏移量是从主文件的开头到该条记录头的第一个字节的以16位字来计算的偏移量。所以,第一条记录的偏移量就是50,因为主文件有100字节的头。
三、dBASE文件
dBASE文件包括要素的属性或者让其他表可以连接的属性关键值。它的格式是标准的
数据库文件格式。有3个要求:
l 文件名必须与主文件和索引文件的名字相同,文件名后缀必须是.dbf。
l 表中必须每一个要素都有一条记录。
l 记录的顺序必须和主文件中的要素记录的顺序相同。
l dBASE头中的年份值必须是1900年之后的。