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