-
shp
文件格式说明
SHAPE
文件格式
SDE,ARC/INFO,PC ARC/INFO,Data
Automation Kit(DAK)
和
ArcCAD
p>
软件提供了
shape
到
< br>coverage
的数据转换器,
ARC/INFO
同样提供了
coverage
到
shape
的转换器。为了和其他数据格式交<
/p>
换,
shape
文件的格式在本报告中被
出版。
其他数据流,比如来自全球定位系统
< br>(GPS)
接收机的数据能同样被存为
shape
文件或
X,Y
事件表。
Shape
文件技术描述计算机程序能通过使用本节的技术
描述来产生,读,写
shape
文件。
一个
ESRI
的
shape
文件包括一个主文件,一个索引文件,和一个
dB
ASE
表。主文件是一个直接存取,变量记录长度文
件,其中每个记录描述一个有它自己的
vertices
列表的
shape
。在索引文件
中,每个记录包含对应主文件记录离主
文件头开始的偏移,
dBASE
表包含一
feature<
/p>
一个记录的
feature
的特征。
p>
几何和属性间的一一对应关系是基于记录
数目的。在
dBASE
文件中的属性记录必须和主文件中的记录
是相同顺序
的。
命名习惯所有文件名都符合
8.3<
/p>
命名习惯。主文件,索引文件和
dBASE
文件有相同的前缀。前缀必须是
由字符或数字
(
a-Z,0-9
)开始,后跟
0
到
7
个字符(
< br>a-Z,0-9
,
_,
)主文件
的后缀是
.shp
,
索引文件的后缀是
.shx
,
dBASE
表的后
缀是
.dbf
。文件名中的所有字母在对文件名敏感的操作系统中都是小写的。
1
/
31
例子
主文件:
文件
:
dBASE
表:
数字类型一个
shape
文件存储
整数和
双精度数,本文档的余数指以下类型:
整数:
有符号
32
位整数(
4
字节)
双精度:
有符号
64
位
IEEE
双精
度浮点数(
8
字节)浮点数必须是数字的值。负无
穷,正无穷和非数字(
NaN
)值在
shape
文件不被允许。然而
shape
文件支持
'
没有数据<
/p>
'
的值这样的概念,但
是目前只用于衡量
。某些小于-
1038
被
shape
文件读取程序用来代表
'
没有数据
'
的值。
下面的第一节描述
shape
文件的总体结构
和组织。第二节描述
shape
文件
支
持的每种
shape
类型的记录内容。
主文件的组织
主文件(
.shp
)由固定长度的文件头和接着的变长度记录组成。每个变长度
记录是由固定长度的记录头和接着的变
长度
记录内容组成。图
1
图解了主文件的结构。
图
1
主文件的结构
文件头
2
/
31
记录头记录内容
记录头记录内容
记录头记录内容
记录头记录内容
……
……
记录头记录内容
Shape
文件中所有的内容可以被分为二类:
与数据相关的:
。主文件记录内容
。主文件头的数据
描述域(
Shape
类型,边界盒等)
与文件管理相关的:
。文件和记录
xx
。记录偏移等
整数和双精度整数在文
件头中组成数据描述域,在主文件的记录内容是小
ndian
(
PC
或
Intel
)字节顺序。组成文件
的其余部分和文件管理的整数和双
精度浮点数是大
endian
(
Sun
或
Motorola
)字节顺序。
p>
主文件头
主文
件头
100
字节长。表
1
显示带有字节位置,值,类型和字节顺序的文
件头中的域。
< br>
在此表中,位置是相对于文件的开始。
3
/
31
<
/p>
表
1
主文件头的描述
位置域值类型字节顺序
0
字节文
件代码
9994
整数大
4
字节未被使用
0
整数
大
p>
8
字节未被使用
0
整数大
12
字节未被使用
0
整数大
16
字节未被使用
0
整数
大
20
字节未被使用
0
整数大
24
字节文件长度整数大
28
字节版本
1000
整数小
32
字节
p>
Shape
类型整数小
36
字节边界盒
Xmin
双精度小
44
字节边界盒
Ymin
双
精度小
52
字节边界盒
X
max
双精度小
60
字节边界盒
Ymax
双精度小
68
字节
*
边
界盒
Zmin
双精度小
76
字节
*
边界盒
Zmax
双精
度小
84
字节
*
边界盒
Mmin
双精
度小
92
字节
*
边界盒
Mmax
双精度小
*
未被使用,值为
0.0
,若没有被衡
量或是
Z
轴。
文件长度的值是在
16
位字下文件的总长度(包括组成文件头
的
50
个
16
位
字)。
在
shape
文件中的所有非空
shape
被需
要是同种
shape
类型。
Shape
类型的值如下:
值
shape
类型
0
空
shape
1
点
3
多线
5
多边形
8
多点
11
点
Z
13
多线
Z
15
多边形
Z
18
多点
Z
4
/
31
21
点
M
23
多线
M
25
多边形
M
28
多点
M
31
多斑块
没有被定义的
Shape
类型值(
2<
/p>
,
4
,
6
等直到
33
)为将来可能的使用而保
留。
目前
shape
文件被局限于包含以上定义
的同种<
/p>
shape
类型。在将来
shape
p>
文件可以被允许包含多于一种
shape
类
型。若混合
shape
类型被实现,文
件头中的
shape
类型将标识该文件。
p>
主文件头的边界盒存储文件中
shape
的
实际幅度。最小边界
X
和
Y
直交的
(潜在的
M,Z
)
长方形包含了所有的
shape
。
<
/p>
若
shape
文件是空的(没有记录),
min,Ymin,Xmax,Ymax
的值是未被定义
的。
Mmin
和<
/p>
Mmax
能包含
shape
文件用来衡量
不包含衡量的
shape
类型的
'
没有数据
'
的值(参见
2
页的
数字类型),记录
头每个记录的头存储了记录的数目和记录内容的长度。记录头有一个固
定长度
8
字节。表
2
< br>显示文件记录头中域的字
节位置,值,类型和字节顺序
。在表中,位置是相对于记录的开始的。
表
< br>2
主文件记录头文件的描述
位
置域值类型字节顺序
0
字节记录数目整数大
4
字节内容长度整数大记录
数目从
1
开始。
5
/
31
<
/p>
一个记录的内容长度是按
16
位字衡量的
记录内容长度。每个记录因此为文
件的总长度贡献(
4
+内容长度)个
16
位
字,正如文件头是
24
字节一样。
p>
主文件记录内容
Shape
文件记录内容包含一个
shape
类型和接着的该
shape
的几何数据。记
录内容的长度依赖于在一个
shape
中部分和<
/p>
vertices
的数目。对每种
p>
shape
类型,我们首先描述该
shap
e
然后是它在磁
盘上的存储镜像。在表
3
到
16
,位置是相
< br>
对于记录内容的开始。
空
shape
shape
类型为
0
指代一种不带几何数据的空
shape
,每种要素类型(点,
线,多边形等)都
支持空,在同一个
shape
文
p>
件中有点和空的点是有效的。常常空
shape
是放东西的地方;在
shape
文
件产生时被使用和在产生后更被广泛地使用。
表
3
空
shape
记录内容<
/p>
位置域值类型数目字节顺序
0
字节
shape
类型
0
整数
1
小在
X
,Y
位置的
Shape
类型
点一个点包括一对以
X,Y
顺序排列的双精度的坐标
Point{Double
X
//X
坐标
Double
Y /
/Y
坐标
}
表
4
点记录内容
位置域值类型数目字节
顺序
0
字节
shape
类型
1
整数
1
小
4
字节
X
X
双精度
1
小
12
字节
Y
Y
双精度
1
小多点一个多点代表一个点的
集合:
6
/
31
MultiPoint{Double[4]
Box
//
边界盒
Integer
NumPoints
//
点的数目
Point[NumPoints]
Points
//
在集合中的点
< br>}
边界盒以
Xmin,Ymin,Xmax,Ymax<
/p>
存储。
表
5<
/p>
多点记录内容
位置域值类型数目字节顺
序
0
字节
shape
< br>类型
8
整数
1
< br>小
4
字节
Box
p>
Points
点
NumPoints
小
PolyLine
一条
PolyLine
是指一条包含一个或多个部分的有
序的<
/p>
vertices
的集合。一个部分是指二个或多个点彼此
连接的顺序。部分间彼此相连或不连。部分间彼此可能相交或不相交
。
因为该定义没有禁止有确定坐标的连续点,
shape
文件的读程序必须掌握这
样的情况。在另外
,退化
(degenerate)
和可能导致零长度的结果是不被允许的。
PolyLine{Double[4]
Box
//
边界盒
Integer
NumParts
//
部分的数目
Integer
NumPoints
//
点的总数目
Integer[NumParts]
Parts
//
在部
分中第一个点的索引
Point[NumPoints]
Points
//
所有部分的点
< br>}PolyLine
的域在以下为更
详细的描述:
Box
被存储的
P
olyLine
的边界盒,以
Xmin,Ymin,Xmax,
Ymax
的顺序存储。
NumPar
ts
在
PolyLine
中部分的数目
。
NumPoints
所有部分的点
的总数目。
Box
双精度
4
小
36
字节
NumPoints
Num
Points
整数
1
小
40
字节
Points
7
/
31
Parts
NumParts
长度的数列。为每
条
PolyLine
存储它在点数列中的
第一个点的索引。数列索引是从
0
开始的。
< br>
Points
p>
NumPoints
长度的数列。在
Pol
yLine
中的每一部分的点被尾到
尾存储。部分
2
的点跟在部分
1
的点之后
,如此下去。部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
表
6
PolyLine
记录内容
位置域值
类型数目字节顺序
0
字节
shape<
/p>
类型
3
整数
1<
/p>
小
4
字节
Box
p>
Box
双精度
4
小
36
字节
NumParts
NumParts
整数
1
小
40
字节
NumPoints
Num
Points
整数
1
小
44
字节
Parts
Parts
整数
NumParts
小
X
字节
Points
Points
点
NumPoints
小注意:
X
=44+4*NumParts
多边形一个多边形包含一个或多个环。一个环是四或多<
/p>
个点彼此相连组成的一个闭合的
彼此不
相交的环。一个多边形可能包括多个外环,一个环的
vertices
< br>的顺序
和方向指示环的哪一边是多边形的内部
。在多边形中的洞的环的
vertices
是逆
时针方向的。一个环组成的多边形总
是顺时针方向的。一个多边形的环是被
做为它的一部分的。因为该定义没有禁止有确定坐标的连续的点,
shape
文
件读程序必须解决这种情况。在另
外,
退化
(degenerate)
和可能导致零长度的结果是不被允许的。多边形的结构被
定义为
PolyLine
结构,正如下文:
Polygon{Double[4]
Box
//
边界盒
Integer
NumParts
//
部分的数目
Integer
NumPoints
//
点的总数目
8
/
31
Integer[NumParts]
Parts
//
在部
分中第一个点的索引
Point[NumPoints]
Points
//
所有部分的点
< br>}
多边形的域在以下为更
详细的描述:
< br>
Box
被存储的多边形的边界盒,以
< br>Xmin,Ymin,Xmax,Ymax
的顺序存储。
NumParts
在多边形中环的数目。
NumPoints
所有环的点的总数目。
Parts
NumParts
长度的数列。为每
条环存储它在点数列中的第一个
点的索引。数列索引是从
0
p>
开始的。
Points
NumPoints
长度的数列。在多边形中的每一个环的点被尾到尾
存储。环
< br>2
的点跟在环
1
的点之后,如此
下去。部分数列对每一环保持开始点的数列索引。在环间点之
间没有界
限。
图
2
中的例子图演示了多边形的表现。该图中的多边形有一个洞,总共是
8
个
vertices
。<
/p>
关于多边形
shape
有以下重要注意事项:
环是闭合的(第一个和最后一
个
vetex
必须是一样的)在点数列中环的顺序
是不重要的。
存储在
sh
ape
文件中的多边形必须是
clean
,一个
clean
的多边形是指这样
的一个多边形:
1
.没有自交。这意
味着属于一个环的一段可能不与另一个环的一段相交。
一个多边形
的环可能在
vetices
处彼此
相交,但不是在沿段处。重合的段被认为是相交
的。
2
.在定义多边形的线的正确一边有多边形的内部。一个观察者以
vertex
顺
序沿环走时,右边的邻居是多
边形的内
9
/
31
<
/p>
部。一个独环的多边形的
vertices
因此都是顺时针的。在这些多边形中的洞
有一个逆时针的方向。当定义在多边形
中的洞同样是顺时针时,发生
多边形错误。这会导致内部的重叠。
图
2
一个多边形的实例
在
此例中,
NumParts
等于
2,N
umPoints
等于
10
。注意洞多
边形的点的顺序
是逆序的。
0
5
部分:
0
5
0
1
2
3
4
5
6
7
8
9
点:
v1 v2 v3 v4 v1
v5 v8 v7 v6 v5
表
7
多边形记录内容
位置域值类型数目字节顺序
< br>0
字节
shape
类型
5
整数
1
小
4
字节
Box
Box
双精度
4
小
3
6
字节
NumParts
NumParts
整数
1
小
40
字节
NumPoints
NumPoints
整数
1
小
44
字节
Parts
Parts
整数
NumParts
小
X
字节
Points
Poi
nts
点
NumPoints
小注意:
X=44+4* NumParts
在
X,Y
空间中衡量的
shape<
/p>
类型该种
shape
有一个额外的坐标<
/p>
M
,注意
没
p>
有数据
的值可以被指定为
< br>M
的一个值。
PointM<
/p>
一个
PointM
包括一对以
X,Y
顺序排列的双精度的坐标,再加上衡量
M<
/p>
。
PointM{Double
X
//X
坐标
Double
Y
//Y
坐标
10
/
31
Double
M
//M
衡
量
}
表
8
PointM
记录内容
位置域值类型
数目字节顺序
0
字节
shape
类型
21
整数
1
p>
小
4
字节
X
X
双精度
1
小
12
字节
Y
Y
双精度
1
小
20
字节
M
M
双精度
1
小
多
Poi
ntM
一个多
PointM
代表一个<
/p>
PointM
的集合:
MultiPoint{Double[4]
Box
//
边界盒
Integer
NumPoints
//
点的数目
Point[NumPoints]
Points
//
在集合中的点
Double[2]
M Range
//<
/p>
衡量
M
的上下界
Double[NumPoints]
M Array
//
衡量
}
多
PointM
的域在以下为更详
p>
细的描述:
Box
被存储的多
PointM
的边界盒,以
Xmin,Ymin,Xmax,Ymax
的顺序存储。
NumPoints
点的总数目。
Points
NumPoints
长的点的数列。
M Range
以
Mmin,Mmax
顺序存储的多
PointM
的最小,最
大值。
M Array
NumPoints
长的衡量的数组。
表
9
多
Poi
ntM
记录内容
位置域值类型数目字
节顺序
0
字节
shape
类型
28
整数
1
小
4
字节
Box
p>
Points
点
NumPoints
小
X*
字节
Mmin
Mmi
n
双精度
1
小
X+8*
字节
Mmax
Mmax
双精度
1
小
X+16*
字节
Marry
Mar
ry
双精度
NumPoints
小注意
:
X
=
40
+(
16* NumPoints
)<
/p>
*
可选的
Bo
x
双精度
4
小
36
字节
NumPoints
p>
NumPoints
整数
1
小
40
字节
Points
11
/
31
<
/p>
多
LineM
一条
shape
文件的多
LineM
包含
一个或多个部分。指一条包含一
个或多个部分的有序的
vert
ices
的集合。
一个部分是指二个
或多个点彼此连接的顺序。部分间彼此相连或不连。部
分间彼此可能相交或不相交。
p>
PolyLineM{Double[4]
Box
//
边界盒
Integer
NumParts
//
部分的数目
Integer
NumPoints
//
点的总数目
Integer[NumParts]
Parts
//
在部
分中第一个点的索引
Point[NumPoints]
Points
//
所有部分的点
Double[2]
M Range
//
衡量
M
的上下界
Double[NumPoints]
M
Array
//<
/p>
所有点的衡量
}PolyLineM
的域
在
以下为更详细的描述:
Box
p>
被存储的
PolyLineM
的边界盒,以
Xmin,Ymin,Xmax,Ymax
的顺序存储。
NumParts
在
PolyLineM
中部分的数目。
NumPoints
所有部分的点的总数目。
Parts
NumParts
长度的数列。为每
条
PolyLineV
存储它在点数列中
的第一个点的索引。数列索引是从
0
开始
的。
Points
NumPoints
长度的数列。在
PolyLineM
中的每一部分的
点被尾
到尾存储。部分
2
的点跟在部分
1
的点之
后,如此下去。部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
M Ra
nge
以
Mmin,Mmax
顺序存储
的多
PointM
的最小,最大值。
12
/
31
MArray
NumPoints
长的衡量的数组
,
在多
Po
intM
每部分的衡量被被尾
到尾存储部分
2
的点跟在部分
1
的点之后,
p>
如此下去。部分数列对每一部分保持开始点的数列索引。在部分间
点之间
没有界限。
表
10
PolyLineM
记录内容
位置域
值类型数目字节顺序
0
字节
shape
类型
23
整数
1
小
4
字节
B
ox
p>
Box
双精度
4
小
36
字节
NumParts
NumParts
整数
1
小
40
字节
NumPoints
Num
Points
整数
1
小
44
字节
Parts
Parts
整数
NumParts
小
X
字节
Points
Points
点
NumPoints
小
Y*
字节<
/p>
Mmin
p>
Mmin
双
精度
1
小
Y+8*
字节
Mmax
p>
Mmax
双精度
1
小
Y+16*
字节
Marry
Mar
ry
双精度
NumPoints
小注意
:
X=44+4* NumParts Y
< br>=
40
+(
16* NumPo
ints
)
*
可选的
< br>
多边形
M
一个多边形
M
包含一个或多个环。一个环是四或多个点彼此相连
组成的一个闭合的彼此不相交的环。注意
相交是在
X,Y
空间计算,而不是在
X,Y,M
空间。一个多边形可能包括多个外
环,一个多边形的环是被做为它的一
部分
的。
多边形
M
的结构被定义为
PolyLi
neM
结构,正如下文:
PolygonM{Double[4]
Box
//
边界盒
Integer
NumParts
//
部分的数目
Integer
NumPoints
//
点的总数目
Integer[NumParts]
Parts
//
在部
分中第一个点的索引
Point[NumPoints]
Points
//
所有部分的点
Double[2]
M Range
//
衡量
M
的上下界
13
/
31
Double[NumPoints]
M
Array
//<
/p>
所有点的衡量
}
多边形
< br>M
的域在以
下为更详细的描述:
Box
被存储的多边形的边界盒,以
X
min,Ymin,Xmax,Ymax
的顺序存储。
NumP
arts
在多边形
M
中环的数目。
p>
NumPoints
所有环的点的总数目
。
Parts
NumParts
长度的数列。为每条环存储它在点数列中的第一个
点的索引。数列索引是从
p>
0
开始的。
Points
p>
NumPoints
长度的数列。在多边形中的每一个环的点被尾到
尾
存储。环
2
的点跟在环
1
的点之后,如此
下去。
部分数列对每一环保持开始点的数列索引。在环间点之间没有界
限。
M Range
以
Mmin,M
max
顺序存储的多
PointM
的最
小,最大值。
MArray
Num
Points
长的衡量的数组
,
在多<
/p>
PointM
每部分的衡量被被尾
到尾存
储部分
2
的点跟在部分
1
的点之后,
如此下去。部分数列对每一部分保持开
始点的数列索引。在部分间点之间
没有界限。
关于
PolygonM
shape
有以下注意事项:
环是闭
合的(第一个和最后一个
vetex
必须是一样的)在点数列中
环的顺序
是不重要的。
表
11
多边形
M
的记录内容
位置域值类型数目字节顺序
0
字节
shape
类型
5
整数
1
小
4
字节
Box
Box
双精度
4
小
3
6
字节
NumParts
NumParts
整数
1
小
40
字节
NumPoints
NumPoints
整数
1
小
44
字节
Parts
Parts
整数
NumParts
小
X
字节
Points
Poi
nts
点
NumPoints
小
Y*
字节
Mmin
Mmin
双精
14
/
31
<
/p>
度
1
小
Y+8*
字节
Mmax
Mmax
双精度
1
小
Y+16*
字节
Marry
Marry
双精度
< br>NumPoints
小注意:
X=44+4* NumParts Y
=
40
+(
16* NumPoints
)
*
可选的在
X,Y,Z
空间中衡量的
shape
类型该种
shape
有一
个额外的
坐标
M
,注意
没有数据
的值可以被指定为
M
的一个值。
PointZ
一个
PointZ
包括一对以
X,
Y,Z
顺序排列的双精度的坐标,再加上衡量
M
。
PointM{Double
X
//X
坐标
Double
Y
//Y
坐标
Double
Z
//Z
坐标
Double
M
//M
衡
量
}
表
12
PointZ
记录内容
位置域值类型
数目字节顺序
0
字节
shape
类型
21
整数
1
p>
小
4
字节
X
X
双精度
1
小
12
字节
Y
Y
双精度
1
小
20
字节
Z
Z
双精度
1
小
28
字节
M
easure
M
p>
双精度
1
小多
Po
intZ
一个多
PointZ
代表一个
PointZ
的集合:
MultiPoint{Double[4]
Box
//
边界盒
Integer
NumPoints
//
点的数目
Point[NumPoints]
Points
//
在集合中的点
Double[2]
Z Range
//Z
的上下界
Double[NumPoints]
Z Array
//Z
的值
Double[2]
M Range
//<
/p>
衡量
M
的上下界
15
/
31
-
-
-
-
-
-
-
-
-
上一篇:苦累面前莫低头 成功总在风雨后
下一篇:在诱惑面前,我战胜了自己(800字)作文