shp文件格式.docx
《shp文件格式.docx》由会员分享,可在线阅读,更多相关《shp文件格式.docx(24页珍藏版)》请在冰豆网上搜索。
![shp文件格式.docx](https://file1.bdocx.com/fileroot1/2023-1/21/6986c54e-dae2-45c3-8c1a-1325934562f4/6986c54e-dae2-45c3-8c1a-1325934562f41.gif)
shp文件格式
shp文件格式
SDE,ARC/INFO,PCARC/INFO,DataAutomationKit(DAK)和ArcCAD软件提供了shape到coverage的数据转换器,ARC/INFO同样提供了coverage到shape的转换器。
为了和其他数据格式交换,shape文件的格式在本报告中被出版。
其他数据流,比如来自全球定位系统(GPS)接收机的数据能同样被存为shape文件或X,Y事件表。
Shape文件技术描述计算机程序能通过使用本节的技术描述来产生,读,写shape文件。
一个ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表。
主文件是一个直接存取,变量记录长度文件,其中每个记录描述一个有它自己的vertices列表的shape。
在索引文件中,每个记录包含对应主文件记录离主文件头开始的偏移,dBASE表包含一
feature一个记录的feature的特征。
几何和属性间的一一对应关系是基于记录数目的。
在dBASE文件中的属性记录必须和主文件中的记录是相同顺序的。
命名习惯所有文件名都符合8.3命名习惯。
主文件,索引文件和dBASE文件有相同的前缀。
前缀必须是由字符或数字(a-Z,0-9)开始,后跟0到7个字符(a-Z,0-9,_,)主文件的后缀是.shp,索引文件的后缀是.shx,dBASE表的后缀是.dbf。
文件名中的所有字母在对文件名敏感的操作系统中都是小写的。
例子
主文件:
counties.shp索引文件:
counties.shxdBASE表:
ounties.dbf数字类型一个
shape文件存储整数和双精度数,本文档的余数指以下类型:
整数:
有符号32位整数(4字节)
双精度:
有符号64位IEEE双精度浮点数(8字节)浮点数必须是数字的值。
负无穷,正无穷和非数字(NaN)值在shape文件不被允许。
然而shape文件支持'没有数据'的值这样的概念,但是目前只用于衡量。
某些小于-1038被shape文件读取程序用来代表'没有数据'的值。
下面的第一节描述shape文件的总体结构和组织。
第二节描述shape文件支持的每种shape类型的记录内容。
主文件的组织
主文件(.shp)由固定长度的文件头和接着的变长度记录组成。
每个变长度记录是由固定长
度的记录头和接着的变长度记录内容组成。
图1图解了主文件的结构。
图1主文件的结构
文件头
记录头记录内容
记录头记录内容
记录头记录内容
记录头记录内容
记录头记录内容
Shape文件中所有的内容可以被分为二类:
与数据相关的:
。
主文件记录内容
。
主文件头的数据描述域(Shape类型,边界盒等)与文件管理相关的:
。
文件和记录长度
。
记录偏移等整数和双精度整数在文件头中组成数据描述域,在主文件的记录内容是小ndian(PC或
Intel)字节顺序。
组成文件的其余部分和文件管理的整数和双精度浮点数是大endian(Sun
或Motorola)字节顺序。
主文件头
主文件头100字节长。
表1显示带有字节位置,值,类型和字节顺序的文件头中的域。
在此表中,位置是相对于文件的开始。
表1主文件头的描述
位置
域
值类型字节顺序
0字节
文件代码
9994
整数
大
4字节
未被使用
0
整数
大
8字节
未被使用
0
整数
大
12字节
未被使用
0
整数
大
16字节
未被使用
0
整数
大
20字节
未被使用
0
整数
大
24字节
文件长度
文件长度
整数
大
28字节
版本
1000
整数
小
32字节
Shape类型Shape
类型整数
小
36字节
边界盒
Xmin
双精度
小
44字节
边界盒
Ymin
双精度
小
52字节
边界盒
Xmax
双精度
小
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
21
点M
23
多线M
25
多边形
M
28
多点M
31
多斑块
没有被定义的Shape类型值(2,4,6等直到33)为将来可能的使用而保留。
目前shape文件被局限于包含以上定义的同种shape类型。
在将来shape文件可以被允许包含多于一种shape类型。
若混合shape类型被实现,文件头中的shape类型将标识该文件。
主文件头的边界盒存储文件中shape的实际幅度。
最小边界X和Y直交的(潜在的M,Z)长方形包含了所有的shape。
若shape文件是空的(没有记录),min,Ymin,Xmax,Ymax的值是未被定义的。
Mmin和Mmax能包含shape文件用来衡量不包含衡量的shape类型的'没有数据'的值(参见2页的数字类型),记录头每个记录的头存储了记录的数目和记录内容的长度。
记录头有一个固定长度8字节。
表2显示文件记录头中域的字节位置,值,类型和字节顺序。
在表中,位置是相对于记录的开始的。
表2主文件记录头文件的描述
位置域
值类型
字节顺序
0字节记录数目
记录数目
整数
大
4字节内容长度
内容长度
整数
大
记录数目从1开始。
一个记录的内容长度是按
16位字衡量的记录内容长度。
每个记录因此为文件的总长度贡献
(4+内容长度)个16
位字,正如文件头
是24字节一
样。
主文件记录内容
Shape文件记录内容包含一个shape类型和接着的该shape的几何数据。
记录内容的长度依赖于在一个shape中部分和vertices的数目。
对每种shape类型,我们首先描述该shape然后是它在磁盘上的存储镜像。
在表3到16,位置是相对于记录内容的开始。
空shape
shape类型为0指代一种不带几何数据的空shape,每种要素类型(点,线,多边形等)都支持空,在同一个shape文件中有点和空的点是有效的。
常常空shape是放东西的地方;在shape文件产生时被使用和在产生后更被广泛地使用。
表3空shape记录内容
位置域值类型数目字节顺序
0字节shape类型0整数1小
在X,Y位置的Shape类型
点一个点包括一对以X,Y顺序排列的双精度的坐标
Point
{
DoubleX//X坐标
DoubleY//Y坐标
}
表4点记录内容
位置
域
值
类型数目
字节顺序
0字节
shape类型
1整数
1小
4字节
X
X
双精度1
小
12字节
Y
Y
双精度1
小
多点一个多点代表一个点的集合:
MultiPoint
{
Double[4]Box//边界盒
IntegerNumPoints//点的数目
Point[NumPoints]Points//在集合中的点}
边界盒以
Xmin,Ymin,Xmax,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被存储的PolyLine的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
NumParts在PolyLine中部分的数目。
NumPoints所有部分的点的总数目。
PartsNumParts长度的数列。
为每条PolyLine存储它在点数列中的第一个点的索引。
数列索引是从0开始的。
PointsNumPoints长度的数列。
在PolyLine中的每一部分的点被尾到尾存储。
部分2的点跟在部分1的点之后,如此下去。
部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
表6PolyLine记录内容
位置
域
值
类型
数目
字节顺序
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是逆时针方向的。
一个环组成的多边形总是顺时针方向的。
一个多边形的环是被做为它的一部分的。
因为该定义没有禁止有确定坐标的连续的点,shape文件读程序必须解决这种情况。
在另外,退化(degenerate)和可能导致零长度的结果是不被允许的。
多边形的结构被定义为
Polygon
{
Double[4]
Integer
Integer
PolyLine结构,正如下文:
Box//边界盒
NumParts//部分的数目
NumPoints//点的总数目
Integer[NumParts]Parts
Point[NumPoints]Points
}多边形的域在以下为更详细的描述:
Box被存储的多边形的边界盒,以NumParts在多边形中环的数目。
NumPoints所有环的点的总数目。
//在部分中第一个点的索引
//所有部分的点
Xmin,Ymin,Xmax,Ymax的顺序存储。
PartsNumParts长度的数列。
为每条环存储它在点数列中的第一个点的索引。
数列索引是从0开始的。
PointsNumPoints长度的数列。
在多边形中的每一个环的点被尾到尾存储。
环2的点跟在环1的点之后,如此下去。
部分数列对每一环保持开始点的数列索引。
在环间点之间没有界限。
8个vertices。
图2中的例子图演示了多边形的表现。
该图中的多边形有一个洞,总共是关于多边形shape有以下重要注意事项:
环是闭合的(第一个和最后一个vetex必须是一样的)在点数列中环的顺序是不重要的。
存储在shape文件中的多边形必须是clean,一个clean的多边形是指这样的一个多边形:
1.没有自交。
这意味着属于一个环的一段可能不与另一个环的一段相交。
一个多边形的环可能在vetices处彼此相交,但不是在沿段处。
重合的段被认为是相交的。
2.在定义多边形的线的正确一边有多边形的内部。
一个观察者以vertex顺序沿环走时,
右边的邻居是多边形的内部。
一个独环的多边形的vertices因此都是顺时针的。
在这些多边形中的洞有一个逆时针的方向。
当定义在多边形中的洞同样是顺时针时,发生"Dirty"多边形
错误。
这会导致内部的重叠。
图2一个多边形的实例在此例中,NumParts等于2,NumPoints等于10。
注意洞多边形的点的顺序是逆序的。
点
八、、
012
:
v1v2
345
v3v4
67
v1v5
89
v8v7
v6v5
表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类型该种shape有一个额外的坐标M,注意"没有数据"的值可
以被指定为M的一个值。
PointM一个PointM包括一对以X,Y顺序排列的双精度的坐标,再加上衡量M。
PointM
{
Double
X
//X
坐标
Double
Y
//Y
坐标
Double
M
//M
衡量
}
表8PointM记录内容
位置
域
值
类型数目
字节顺序
0字节
shape类型
21整数
1小
4字节
X
X
双精度1
小
12字节
Y
Y
双精度1
小
20字节
M
M
双精度1
小
多PointM
一个多PointM
代表一个PointM
的集合:
MultiPoint
{
Double[4]Box//边界盒
IntegerNumPoints//点的数目
Point[NumPoints]Points//在集合中的点
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//衡量
}
多PointM的域在以下为更详细的描述:
Box被存储的多PointM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
NumPoints点的总数目。
PointsNumPoints长的点的数列。
MRange以Mmin,Mmax顺序存储的多PointM的最小,最大值。
MArrayNumPoints长的衡量的数组。
表9多PointM记录内容
位置
域
值
类型
数目
字节顺序
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]
MRange//衡量M的上下界
Double[NumPoints]MArray//所有点的衡量
}
PolyLineM的域在以下为更详细的描述:
Box被存储的PolyLineM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
NumParts在PolyLineM中部分的数目。
NumPoints所有部分的点的总数目。
PartsNumParts长度的数列。
为每条PolyLineV存储它在点数列中的第一个点的索引。
数列索引是从0开始的。
PointsNumPoints长度的数列。
在PolyLineM中的每一部分的点被尾到尾存储。
部分2的点跟在部分1的点之后,如此下去。
部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
MRange以Mmin,Mmax顺序存储的多PointM的最小,最大值。
MArrayNumPoints长的衡量的数组,在多PointM每部分的衡量被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。
部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
表10PolyLineM记录内容
位置
域
值
类型数目
字节顺序
0字节
shape类型
23
整数
1小
4字节
Box
Box
双精度4
小
36字节
NumParts
NumParts整数
1
小
40字节
NumPoints
NumPoints整数
1
小
44字节
Parts
Parts
整数NumParts
小
X字节
Points
Points
点NumPoints小
Y*字节
Mmin
Mmin
双精度1小
Y+8*字节
Mmax
Mmax
双精度1小
Y+16*字节
Marry
Marry
双精度NumPoints小
注意:
X=44+4*NumPartsY=40+(16*NumPoints)*可选的
多边形M一个多边形M包含一个或多个环。
一个环是四或多个点彼此相连组成的一个闭合的彼此不相交的环。
注意相交是在X,Y空间计算,而不是在X,Y,M空间。
一个多边形可能包括多个外环,一个多边形的环是被做为它的一部分的。
多边形M的结构被定义为PolyLineM结构,正如下文:
PolygonM
引是从
0开始的。
跟在环
}
多边形M的域在以下为更详细的描述:
Box
被存储的多边形的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
NumParts在多边形M中环的数目。
NumPoints所有环的点的总数目。
Parts
NumParts长度的数列。
为每条环存储它在点数列中的第一个点的索引。
数列索
1的点之后,如此下去。
部分数列对每一环保持开始点的数列索引。
在环间点之间没有界限。
MRange以Mmin,Mmax顺序存储的多PointM的最小,最大值。
MArrayNumPoints长的衡量的数组,在多PointM每部分的衡量被被尾到尾存储部分2
的点跟在部分1的点之后,如此下去。
部分数列对每一部分保持开始点的数列索引。
在部分间点之间没有界限。
关于PolygonMshape有以下注意事项:
环是闭合的(第一个和最后一个vetex必须是一样的)在点数列中环的顺序是不重要的。
表11多边形M的记录内容
位置域值类型数目字节顺序
0字节
shape类型
5
整数1小
4字节
Box
Box
双精度4小
36字节
NumParts
NumParts整数1
小
40字节
NumPoints
NumPoints整数1
小
44字节
Parts
Parts
整数NumParts
小
X字节
Points
Points
点NumPoints
小
Y*字节
Mmin
Mmin
双精度1小
Y+8*字节
Mmax
Mmax
双精度1小
Y+16*字节Marry
Marry
双精度NumPoints
小
注意:
X=44+4*NumPartsY=
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
衡量
}
表12PointZ记录内容
位置
域
值
类型数目
字节顺序
0字节
shape类型
21
整数
1
小
4字节
X
X
双精度1