1、Shape技术描述
一个完整的ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表文件。主文件是一个直接存取,变记录长度文件,其中每个记录描述一个由其顶点列表组成的shape。在索引文件中,每条记录是在主文件中对应记录距离主文件头部的偏移量。dBASE中记录的是对应主文件中记录的属性记录,每条主文件记录对应dBASE中的一条属性记录。几何对象和属性间的一一对应关系是基于记录编号的。在dBASE文件中的属性记录必须和主文件中的记录保持相同的顺序。
1.1命名习惯
所有文件名都遵循8.3命名习惯。主文件,索引文件和dBASE文件有相同的前缀。前缀必须是由字符或数字(a-Z,0-9)开始,后跟0到7个字符(a-Z,0-9,_,)主文件的后缀是.shp,索引文件的后缀是.shx,dBASE表的后缀是.dbf。在对文件名敏感的操作系统中,文件名中的所有字母都是小写的。
例子 :
主文件:counties.shp
索引文件:counties.shx
dBASE表:ounties.dbf
1.2数字类型
Shape格式文件存储整数型和双精度型数据,本文档的余下部分将涉及到以下类型:
整数:有符号32位整数(4字节)
双精度:有符号64位IEEE双精度浮点数(8字节)
浮点数必须是数字值。负无穷,正无穷和无效数字(NaN)在shape文件中是不合法的。然而,shape文件支持“没有数据”这样的概念,但是目前只用于带有measure值的情况。所谓Measure值,是用于存储需要的附加数据,可以用来记录各种数据,例如权值、道路长度等信息。某些小于-1038被shape文件读取程序用来表示为“没有数据”的值。
下面的第一节描述shape文件的总体结构和组织。第二节描述shape文件支持的每种shape类型的记录内容。
2、主文件的组织
主文件(.shp)由固定长度的文件头和后面变长的记录组成。每个变长记录是由固定长度的记录头和紧接着的变长记录内容组成。图1是主文件的结构。
图 1 主文件的结构
文件头 |
|
记录头 |
记录内容 |
记录头 |
记录内容 |
记录头 |
记录内容 |
。。。。。。 |
。。。。。。 |
。。。。。。 |
。。。。。。 |
记录头 |
记录内容 |
字节序
Shape文件中所有的内容可以被分为两种类型:
n 与数据相关的:
l 主文件记录内容
l 主文件头的数据描述域(Shape 类型,边界盒等)
n 与文件管理相关的:
l 文件和记录长度
l 记录偏移量等
在主文件的文件头和记录内容中的描述域中的整型和双精度浮点数据是按照little endian(PC或Intel)的字节顺序形式组织的。组成文件的其余部分和文件管理的整数和双精度浮点数是big endian(Sun或Motorola)字节顺序。
2.1主文件头
主文件头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页的数字类型)。
2.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字节一样。
3、主文件记录内容
Shape文件记录内容包含一个shape类型标记,然后是该shape类型的几何数据。记录内容的长度依赖于在一个shape中部分和顶点的数目。对每种shape类型,我们首先描述该shape,然后是它在磁盘上的存储形式。在从表3到16中,位置是相对于记录内容的起始位置。
3.1空shape
shape类型为0,代表一种不带几何数据的空shape,每种图形类型(点,线,多边形等)都支持空shape,在同一个shape文件中可以同时存在点和空的点。一般来说,空shape是用于占据空间位置;在shape文件创建时被使用并在创建后填充入几何数据。
表 3 空shape记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
0 |
Integer |
1 |
Little |
3.2以X,Y记录位置的Shape类型
3.2.1 Point
一个点包括一对以X,Y顺序排列的双精度的坐标
Point
{
Double X //X坐标
Double Y //Y坐标
}
表 4 点记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
1 |
Integer |
1 |
Little |
Byte 4 |
X |
X |
Double |
1 |
Little |
Byte 12 |
Y |
Y |
Double |
1 |
Little |
3.2.2 MultiPoint
一个MultiPoint代表一个点的集合:
MultiPoint
{
Double[4] Box //边界盒
Integer NumPoints //点的数目
Point[NumPoints] Points //在集合中的点
}
边界盒定点存储在Xmin,Ymin,Xmax,Ymax中。
表 5 MultiPoint记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
8 |
Integer |
1 |
Little |
Byte 4 |
Box |
Box |
Double |
4 |
Little |
Byte 36 |
NumPoints |
NumPoints |
Integer |
1 |
Little |
Byte 40 |
Points |
Points |
Point |
NumPoints |
Little |
3.2.3 PolyLine
一条PolyLine是指一条包含一个或多个部分的有序的顶点集合。一个部分是指两个或多个点彼此连接的序列。部分间彼此可以相连或不连。部分间彼此可能相交也可能不相交。
因为该定义没有禁止有相同坐标的连续点,读取shape文件的程序必须注意这样的情况。另外,退化(degenerate)和可能导致零长度的情况是不被允许的。
PolyLine
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
}
PolyLine的详细描述:
u Box PolyLine的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在PolyLine中部分的数目。
u NumPoints 所有部分的点的总数目。
u Parts NumParts长度的数组。为每条PolyLine存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在PolyLine中的每一部分的点被首尾相连得存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。 在不同部分间的点之间没有分隔符。
表 6 PolyLine记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
3 |
Integer |
1 |
Little |
Byte 4 |
Box |
Box |
Double |
4 |
Little |
Byte 36 |
NumParts |
NumParts |
Integer |
1 |
Little |
Byte 40 |
NumPoints |
NumPoints |
Integer |
1 |
Little |
Byte 44 |
Parts |
Parts |
Integer |
NumParts |
Little |
Byte X |
Points |
Points |
Point |
NumPoints |
Little |
注意:X=44+4* NumParts
3.2.4 Polygon
一个多边形包含一个或多个环。一个环是四或多个点彼此相连组成的一个闭合的彼此不相交的环。一个多边形可能包括多个外环,一个环的顶点顺序和方向指示环的哪一边是多边形的内部。在多边形中表示洞的环的顶点是逆时针方向的。一个环组成的多边形总是顺时针方向的。多边形的每个环被定义为多边形的一个部分。
由于该定义没有禁止有相同坐标的连续的点,shape文件读程序必须注意这种情况。在另外,退化(degenerate)和可能导致零长度的结果是不被允许的。多边形的结构被定义为PolyLine结构,正如下文:
Polygon
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
}
多边形的详细描述:
u Box 多边形的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在多边形中环的数目。
u NumPoints 所有环的点的总数目。
u Parts NumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。Parts数组保存的是每个环中第一个点在数组中的索引位置。在环的点之间没有分隔符。
图 2中的例子图演示了多边形的表现。该图中的多边形有一个洞,总共是8个顶点。 关于多边形shape有以下重要注意事项:
n 环是闭合的(第一个和最后一个定点必须是一样的)
n 在点数组中环的顺序是不重要的。
n 存储在shape文件中的多边形必须是clean的,一个clean的多边形是指这样的一个多边形:
1. 没有自交。这意味着属于一个环的一段不与另一个环的一段相交。一个多边形的环可能在顶点处彼此相交,但不可以在边上相交。重合的边被认为是相交的。
2. 正确的定点顺序。当观察者以顶点顺序沿环前进时,右边是多边形的内部。一个只有一个环的多边形,它的顶点顺序必然是顺时针的。而作为多边形中洞的环的定点顺序则是逆时针方向的。当定义在多边形中的洞同样是顺时针时,将发生"Dirty"多边形错误。这会导致内部的重叠。
图 2 一个多边形的实例
在此例中,NumParts等于2,NumPoints等于10。注意洞多边形的点的顺序是逆时针顺序的。
表 7 多边形记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
5 |
Integer |
1 |
Little |
Byte 4 |
Box |
Box |
Double |
4 |
Little |
Byte 36 |
NumParts |
NumParts |
Integer |
1 |
Little |
Byte 40 |
NumPoints |
NumPoints |
Integer |
1 |
Little |
Byte 44 |
Parts |
Parts |
Integer |
NumParts |
Little |
Byte X |
Points |
Points |
Point |
NumPoints |
Little |
注意:X=44+4* NumParts
3.3在X,Y空间中带有measure的shape类型
该种shape有一个额外的坐标 M,注意"没有数据"的值可以被指定为M的值。
3.3.1 PointM
一个PointM包括一对以X,Y顺序排列的双精度的坐标,再加上M。
PointM
{
Double X //X 坐标
Double Y //Y 坐标
Double M //M measure
}
表 8 PointM记录内容
位置 |
域 |
值 |
类型 |
数目 |
字节顺序 |
Byte 0 |
shape类型 |
1 |
Integer |
1 |
Little |
Byte 4 |
X |
X |
Double |
1 |
Little |
Byte 12 |
Y |
Y |
Double |
1 |
Little |
Byte 20 |
M |
M |
Double |
1 |
Little |
3.3.2 MultiPointM
一个MultiPointM代表一个PointM的集合:
MultiPoint
{
Double[4] Box //边界盒
Integer NumPoints //点的数目
Point[NumPoints] Points //在集合中的点
Double[2] M Range //measure M的上下界
Double[NumPoints] M Array //measure 数组
}
MultiPointM的详细描述:
u Box MultiPointM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumPoints 点的总数目。
u Points NumPoints长的点数组。
u M Range 以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。
u M Array NumPoints长的measure数组。
表 9 MultiPointM记录内容
注意:X = 40+(16* NumPoints) *可选的
3.3.3 PolyLineM
一条shape文件的PolyLineM可以包含一个或多个部分。指一条包含一个或多个部分的有序的顶点的集合。一个部分是指两个或多个点彼此连接的序列。部分间彼此可以相连也可以不连。部分间彼此可以相交也可以不相交。
PolyLineM
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
Double[2] M Range //measure M的上下界
Double[NumPoints] M Array //所有点的measure数组
}
PolyLineM的域在以下为更详细的描述
u Box PolyLineM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在PolyLineM中部分的数目。
u NumPoints 所有部分的点的总数目。
u Parts NumParts长度的数组。为每条PolyLineV存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在PolyLineM中的每一部分的点被尾到尾存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。
在部分间点之间没有界限。
u M Range 以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。
u M Array NumPoints长的measure的数组,在MultiPointM每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在部分间点之间没有界限。
表 10 PolyLineM记录内容
注意:X=44+4* NumParts Y = 40+(16* NumPoints) *可选的
3.3.4 PolygonM
一个PolygonM包含一个或多个环。一个环是四或更多个点彼此相连组成的一个闭合的彼此不相交的环。注意,相交是指的在X,Y二维空间,而不是在X,Y,M三维空间。一个多边形可能包括多个外环,多边形中的每个环是被做为多边形的一个部分。
PolygonM的结构被定义为PolyLineM结构,正如下文:
PolygonM
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
Double[2] M Range //measure M的上下界
Double[NumPoints] M Array //所有点的measure数组
}
PolygonM的详细描述:
u Box PolygonM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在PolygonM中环的数目。
u NumPoints 所有环的点的总数目。
u Parts NumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。部分数组对每一环保持开始点的数组索引。在不同环的点之间没有分隔符。
u M Range 以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。
u M Array NumPoints长的measure的数组,在MultiPointM每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。
关于PolygonM shape有以下注意事项:
n 环是闭合的(第一个和最后一个顶点必须是一样的)
n 在点数组中环的顺序是不重要的。
注意:X=44+4* NumParts Y = 40+(16* NumPoints) *可选的
3.4在X,Y,Z空间中带measure的shape类型
该种shape有一个额外的坐标 M,注意"没有数据"的值可以被指定为M的值。
3.4.1 PointZ
一个PointZ包括一对以X,Y,Z顺序排列的双精度的坐标,再加上M。
{
Double X //X 坐标
Double Y //Y 坐标
Double Z //Z 坐标
Double M //M measure
}
表 12 PointZ记录内容
3.4.2 MultiPointZ
一个MultiPointZ代表一个PointZ的集合:
MultiPoint
{
Double[4] Box //边界盒
Integer NumPoints //点的数目
Point[NumPoints] Points //在集合中的点
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //measureM的上下界
Double[NumPoints] M Array //measure 数组
}
边界盒是以Xmin,Ymin,Xmax,Ymax的顺序存储。Z Range是以Mmin,Mmax顺序存储的,M Range是以Mmin,Mmax顺序存储的。
表 13 MultiPointM记录内容
注意:X = 40+(16* NumPoints)Y=X+16+(8* NumPoints) *可选的
3.4.3 PolyLineZ
一条shape文件的PolyLineZ包含一个或多个部分。指一条包含一个或多个部分的有序的顶点的集合。一个部分是指两个或多个点彼此连接的点序列。部分间彼此相连或不连。部分间彼此可能相交也可能不相交。
PolyLineZ
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //measure M的上下界
Double[NumPoints] M Array //所有点的measure 数组
}
PolyLineZ的域在以下为更详细的描述:
u Box PolyLineZ的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在PolyLineZ中部分的数目。
u NumPoints 所有部分的点的总数目。
u Parts NumParts长度的数组。为每条PolyLineZ存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在PolyLineZ中的每一部分的点被尾到尾存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。
u ZRange 以Zmin,Zmax顺序存储的MultiPointZ的最小,最大值。
Z Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。
u M Range 以Mmin,Mmax顺序存储的MultiPointZ的最小,最大值。
u M Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在部分的点之间没有分隔符。
表 14 PolyLineZ记录内容
注意:X=44+4* NumParts Y = X+(16* NumPoints)Z=Y+16+(8* NumPoints) *可选的
3.4.4 PolygonZ
一个PolygonZ 包含一个或多个环。一个环是四或多个点彼此相连组成的一个闭合的彼此不相交的环。一个多边形可能包括多个外环, PolygonZ 的每个环被做为它的一个部分。
PolygonZ的结构被定义为PolyLineZ结构,正如下文:
PolygonZ
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Point[NumPoints] Points //所有部分的点
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //measureM的上下界
Double[NumPoints] M Array //所有点的measure
}
多边形Z的域在以下为更详细的描述:
u Box PolygonZ的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在多边形Z中环的数目。
u NumPoints 所有环的点的总数目。
u Parts NumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u Points NumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。部分数组对每一环保持开始点的数组索引。在不同环的点之间没有分隔符。
u ZRange 以Zmin,Zmax顺序存储的MultiPointZ的最小,最大值。
u Z Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分点之间没有分隔符。
u M Range 以Mmin,Mmax顺序存储的MultiPointZ的最小,最大值。
u M Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分点之间没有分隔符。
关于PolygonZ shape有以下注意事项:
n 环是闭合的(第一个和最后一个顶点必须是一样的)
n 在点数组中环的顺序是不重要的。
表 15 多边形Z的记录内容
注意:X=44+4* NumParts Y = X+(16* NumPoints)Z=Y+16+(8* NumPoints) *可选的
3.4.5 MultiPatch
一个MultiPatch 包括许多表面块。每个表面块描述了一个表面。MultiPatch的表面块是作为它的部分,部分的类型决定了一个MultiPatch部分的顶点顺序。一个MultiPatch的部分可以是以下类型:
n 三角形条带 三角形的连接条带,此处每个顶点(在开始二个后)完成一个新三角形。一个新三角形总是通过把新顶点和二个临近的原有点相连而得到。
n 三角形扇 三角形的连接扇,此处每个顶点(在开始二个后)完成一个新三角形。一个新三角形总是通过把新顶点和一个个临近的原有点及这部分的第一个顶点相连而得到。
外环 多边形的外环。
n 内环 多边形的洞。
n 第一环 未定义类型的多边形的第一个环。
n 环 未定义类型的多边形的环。
一个简单的三角形条带或三角形扇代表一个简单的表面斑块。参见图 3 看这些部分类型的例子。带环的部分的序列能描述有洞的多边形表面。该序列典型包括一个外环,代表斑块的外边界,用许多内环代表洞。当用代表表现带洞的多边形斑块环的集合的个体环是不知道,整个序列以第一环开始,接着是其他的环。不跟着第一环后的环的序列被认为是没有洞的外环的序列。
图 3 MultiPatch 部分例子
用来对部分类型进行编码的值有:
值 部分类型
0 三角形条带
1 三角形扇
2 外环
3 内环
4 第一环
5 环
MultiPatch
{
Double[4] Box //边界盒
Integer NumParts //部分的数目
Integer NumPoints //点的总数目
Integer[NumParts] Parts //在部分中第一个点的索引
Integer[NumParts] PartsTypes //部分类型
Point[NumPoints] Points //所有部分的点
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //measureM的上下界
Double[NumPoints] M Array //所有点的measure
}
多边形Z的域在以下为更详细的描述:
u Box 多边形的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
u NumParts 在多边形Z中环的数目。
u NumPoints 所有环的点的总数目。
u Parts NumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。
u PartsType NumParts长度的数组,存储每一部分的类型。
u Points NumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。部分数组对每一环保持开始点的数组索引。在不同环的点之间没有分隔符。
u ZRange 以Zmin,Zmax顺序存储的MultiPointZ的最小,最大值。
u Z Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。
u M Range 以Mmin,Mmax顺序存储的MultiPointZ的最小,最大值。
u M Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符
关于MultiPatch有以下的注意事项:
n 如果该部分是环,它必须是是闭合的(第一个和最后一个顶点必须是一样的)
n 在点数组中环的顺序是重要的(内环必须参照它的外环)。
n 表示Single Surface的面必须以一个第一环的环类型开始。
n 面可以共享边,但面不能互相相交。
表16 MultiPatch的记录内容
4、索引文件的组织
索引文件(.shx)包含一个100字节的文件头,紧跟后面是8字节的定长记录。
图四演示了索引文件的组织
4.1索引文件头
索引文件头与上面描述的头文件组织方式一致。文件长度的值是在16位字下文件的总长度(包括组成文件头的50个16位字,50+4×记录数)。
4.2索引记录
索引文件中的第n个记录保存的是主文件中第n条记录的偏移量和数据长度。表17描述了文件头中数据的字节位置,值,类型和字节顺序。在此表中,位置是相对于每条记录数据的起始位置。
主文件中一条记录的offset是指的从文件头到当前记录的第一个字节的16-bit数。也就是当前记录前面文件字节长度除以2。因此,主文件中第一条记录的offset应当是50,因为前面有100个字节是文件的头数据。
索引文件记录中的Content Length与主文件中记录头数据中的是一致的。
5、dBase文件的组织
文件名必须与主文件和索引文件形同,后缀必须是dbf。
表中每一个shape特征必须有一条记录。
记录顺序必须与主文件中的shape特征相对应。
dBASE头中的年份数据必须是从1900开始。
翻译自ShapeFile白皮书