shape文件结构.docx_第1页
shape文件结构.docx_第2页
shape文件结构.docx_第3页
shape文件结构.docx_第4页
shape文件结构.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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.shxdBASE表:ounties.dbf1.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 0File Code(文件代码)9994IntegerBigByte 4Unused0IntegerBigByte 8Unused0IntegerBigByte 12Unused0IntegerBigByte 16Unused0IntegerBigByte 20Unused0IntegerBigByte 24File Length(文件长度)File LengthIntegerBigByte 28Version1000IntegerLittleByte 32Shape TypeShape TypeIntegerLittleByte 36Bounding BoxXminDoubleLittleByte 44Bounding BoxYminDoubleLittleByte 52Bounding BoxXmaxDoubleLittleByte 60Bounding BoxYmaxDoubleLittleByte 68*Bounding BoxZminDoubleLittleByte 76*Bounding BoxZmaxDoubleLittleByte 84*Bounding BoxMminDoubleLittleByte 92*Bounding BoxMmaxDoubleLittle*是未被使用的域,值为0.0,如果没有measure值或Z轴。文件长度的值指的是16位字的个数,即文件的字节长度除以2(包括组成文件头的50个16位字)。在shape文件中的所有非空shape必须是同一种shape类型。Shape类型的值如下:值Shape类型0Null Shape1Point3PolyLine5Polygon8MultiPoint11PointZ13PolyLineZ15PolygonZ18MultiPointZ21PointM23PolyLineM25PolygonM28MultiPointM31MultiPatch没有被定义的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 0Record Number(记录数目)Record NumberIntegerBigByte 4Content Length(内容长度)Content LengthIntegerBig记录数目从1开始。一个记录的内容长度是按16位字计算的记录内容长度。每个记录因此为文件的总长度贡献(4内容长度)个16位字,正如文件头是100字节一样。3、主文件记录内容Shape文件记录内容包含一个shape类型标记,然后是该shape类型的几何数据。记录内容的长度依赖于在一个shape中部分和顶点的数目。对每种shape类型,我们首先描述该shape,然后是它在磁盘上的存储形式。在从表3到16中,位置是相对于记录内容的起始位置。3.1空shapeshape类型为0,代表一种不带几何数据的空shape,每种图形类型(点,线,多边形等)都支持空shape,在同一个shape文件中可以同时存在点和空的点。一般来说,空shape是用于占据空间位置;在shape文件创建时被使用并在创建后填充入几何数据。表3空shape记录内容位置域值类型数目字节顺序Byte 0shape类型0Integer1Little3.2以X,Y记录位置的Shape类型3.2.1Point一个点包括一对以X,Y顺序排列的双精度的坐标PointDouble X /X坐标Double Y /Y坐标表4点记录内容位置域值类型数目字节顺序Byte 0shape类型1Integer1LittleByte 4XXDouble1LittleByte 12YYDouble1Little3.2.2MultiPoint一个MultiPoint代表一个点的集合:MultiPointDouble4 Box /边界盒Integer NumPoints /点的数目PointNumPoints Points /在集合中的点边界盒定点存储在Xmin,Ymin,Xmax,Ymax中。表5 MultiPoint记录内容位置域值类型数目字节顺序Byte 0shape类型8Integer1LittleByte 4BoxBoxDouble4LittleByte 36NumPointsNumPointsInteger1LittleByte 40PointsPointsPointNumPointsLittle3.2.3PolyLine一条PolyLine是指一条包含一个或多个部分的有序的顶点集合。一个部分是指两个或多个点彼此连接的序列。部分间彼此可以相连或不连。部分间彼此可能相交也可能不相交。因为该定义没有禁止有相同坐标的连续点,读取shape文件的程序必须注意这样的情况。另外,退化(degenerate)和可能导致零长度的情况是不被允许的。PolyLineDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点PolyLine的详细描述:uBoxPolyLine的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在PolyLine中部分的数目。uNumPoints所有部分的点的总数目。uPartsNumParts长度的数组。为每条PolyLine存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在PolyLine中的每一部分的点被首尾相连得存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分间的点之间没有分隔符。表6 PolyLine记录内容位置域值类型数目字节顺序Byte 0shape类型3Integer1LittleByte 4BoxBoxDouble4LittleByte 36NumPartsNumPartsInteger1LittleByte 40NumPointsNumPointsInteger1LittleByte 44PartsPartsIntegerNumPartsLittleByte XPointsPointsPointNumPointsLittle注意:X=44+4* NumParts3.2.4Polygon一个多边形包含一个或多个环。一个环是四或多个点彼此相连组成的一个闭合的彼此不相交的环。一个多边形可能包括多个外环,一个环的顶点顺序和方向指示环的哪一边是多边形的内部。在多边形中表示洞的环的顶点是逆时针方向的。一个环组成的多边形总是顺时针方向的。多边形的每个环被定义为多边形的一个部分。由于该定义没有禁止有相同坐标的连续的点,shape文件读程序必须注意这种情况。在另外,退化(degenerate)和可能导致零长度的结果是不被允许的。多边形的结构被定义为PolyLine结构,正如下文:PolygonDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点多边形的详细描述:uBox多边形的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在多边形中环的数目。uNumPoints所有环的点的总数目。uPartsNumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。Parts数组保存的是每个环中第一个点在数组中的索引位置。在环的点之间没有分隔符。图2中的例子图演示了多边形的表现。该图中的多边形有一个洞,总共是8个顶点。关于多边形shape有以下重要注意事项:n环是闭合的(第一个和最后一个定点必须是一样的)n在点数组中环的顺序是不重要的。n存储在shape文件中的多边形必须是clean的,一个clean的多边形是指这样的一个多边形:1没有自交。这意味着属于一个环的一段不与另一个环的一段相交。一个多边形的环可能在顶点处彼此相交,但不可以在边上相交。重合的边被认为是相交的。2正确的定点顺序。当观察者以顶点顺序沿环前进时,右边是多边形的内部。一个只有一个环的多边形,它的顶点顺序必然是顺时针的。而作为多边形中洞的环的定点顺序则是逆时针方向的。当定义在多边形中的洞同样是顺时针时,将发生Dirty多边形错误。这会导致内部的重叠。图2一个多边形的实例在此例中,NumParts等于2,NumPoints等于10。注意洞多边形的点的顺序是逆时针顺序的。表7多边形记录内容位置域值类型数目字节顺序Byte 0shape类型5Integer1LittleByte 4BoxBoxDouble4LittleByte 36NumPartsNumPartsInteger1LittleByte 40NumPointsNumPointsInteger1LittleByte 44PartsPartsIntegerNumPartsLittleByte XPointsPointsPointNumPointsLittle注意:X=44+4* NumParts3.3在X,Y空间中带有measure的shape类型该种shape有一个额外的坐标M,注意没有数据的值可以被指定为M的值。3.3.1 PointM一个PointM包括一对以X,Y顺序排列的双精度的坐标,再加上M。PointMDouble X /X坐标Double Y /Y坐标Double M /M measure表8 PointM记录内容位置域值类型数目字节顺序Byte 0shape类型1Integer1LittleByte 4XXDouble1LittleByte 12YYDouble1LittleByte 20MMDouble1Little3.3.2MultiPointM一个MultiPointM代表一个PointM的集合:MultiPointDouble4 Box /边界盒Integer NumPoints /点的数目PointNumPoints Points /在集合中的点Double2 M Range /measure M的上下界DoubleNumPoints M Array /measure数组MultiPointM的详细描述:uBoxMultiPointM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumPoints点的总数目。uPointsNumPoints长的点数组。uM Range以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。uM ArrayNumPoints长的measure数组。表9 MultiPointM记录内容注意:X40(16* NumPoints)*可选的3.3.3PolyLineM一条shape文件的PolyLineM可以包含一个或多个部分。指一条包含一个或多个部分的有序的顶点的集合。一个部分是指两个或多个点彼此连接的序列。部分间彼此可以相连也可以不连。部分间彼此可以相交也可以不相交。PolyLineMDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点Double2 M Range /measure M的上下界DoubleNumPoints M Array /所有点的measure数组PolyLineM的域在以下为更详细的描述uBoxPolyLineM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在PolyLineM中部分的数目。uNumPoints所有部分的点的总数目。uPartsNumParts长度的数组。为每条PolyLineV存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在PolyLineM中的每一部分的点被尾到尾存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在部分间点之间没有界限。uM Range以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。uM ArrayNumPoints长的measure的数组,在MultiPointM每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在部分间点之间没有界限。表10 PolyLineM记录内容注意:X=44+4* NumParts Y40(16* NumPoints)*可选的3.3.4PolygonM一个PolygonM包含一个或多个环。一个环是四或更多个点彼此相连组成的一个闭合的彼此不相交的环。注意,相交是指的在X,Y二维空间,而不是在X,Y,M三维空间。一个多边形可能包括多个外环,多边形中的每个环是被做为多边形的一个部分。PolygonM的结构被定义为PolyLineM结构,正如下文:PolygonMDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点Double2 M Range /measure M的上下界DoubleNumPoints M Array /所有点的measure数组PolygonM的详细描述:uBoxPolygonM的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在PolygonM中环的数目。uNumPoints所有环的点的总数目。uPartsNumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。部分数组对每一环保持开始点的数组索引。在不同环的点之间没有分隔符。uM Range以Mmin,Mmax顺序存储的MultiPointM的最小,最大值。uM ArrayNumPoints长的measure的数组,在MultiPointM每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。关于PolygonM shape有以下注意事项:n环是闭合的(第一个和最后一个顶点必须是一样的)n在点数组中环的顺序是不重要的。注意:X=44+4* NumParts Y40(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.2MultiPointZ一个MultiPointZ代表一个PointZ的集合:MultiPointDouble4 Box /边界盒Integer NumPoints /点的数目PointNumPoints Points /在集合中的点Double2 Z Range /Z的上下界DoubleNumPoints Z Array /Z的值Double2 M Range /measureM的上下界DoubleNumPoints M Array /measure数组边界盒是以Xmin,Ymin,Xmax,Ymax的顺序存储。Z Range是以Mmin,Mmax顺序存储的,M Range是以Mmin,Mmax顺序存储的。表13 MultiPointM记录内容注意:X40(16* NumPoints)Y=X+16+(8* NumPoints) *可选的3.4.3PolyLineZ一条shape文件的PolyLineZ包含一个或多个部分。指一条包含一个或多个部分的有序的顶点的集合。一个部分是指两个或多个点彼此连接的点序列。部分间彼此相连或不连。部分间彼此可能相交也可能不相交。PolyLineZDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点Double2 Z Range /Z的上下界DoubleNumPoints Z Array /Z的值Double2 M Range /measure M的上下界DoubleNumPoints M Array /所有点的measure数组PolyLineZ的域在以下为更详细的描述:uBoxPolyLineZ的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在PolyLineZ中部分的数目。uNumPoints所有部分的点的总数目。uPartsNumParts长度的数组。为每条PolyLineZ存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在PolyLineZ中的每一部分的点被尾到尾存储。部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。uZRange以Zmin,Zmax顺序存储的MultiPointZ的最小,最大值。Z Array NumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分的点之间没有分隔符。uM Range以Mmin,Mmax顺序存储的MultiPointZ的最小,最大值。uM ArrayNumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在部分的点之间没有分隔符。表14 PolyLineZ记录内容注意:X=44+4* NumParts YX(16* NumPoints)Z=Y+16+(8* NumPoints) *可选的3.4.4PolygonZ一个PolygonZ包含一个或多个环。一个环是四或多个点彼此相连组成的一个闭合的彼此不相交的环。一个多边形可能包括多个外环,PolygonZ的每个环被做为它的一个部分。PolygonZ的结构被定义为PolyLineZ结构,正如下文:PolygonZDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引PointNumPoints Points /所有部分的点Double2 Z Range /Z的上下界DoubleNumPoints Z Array /Z的值Double2 M Range /measureM的上下界DoubleNumPoints M Array /所有点的measure多边形Z的域在以下为更详细的描述:uBoxPolygonZ的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。uNumParts在多边形Z中环的数目。uNumPoints所有环的点的总数目。uPartsNumParts长度的数组。为每条环存储它在点数组中的第一个点的索引。数组索引是从0开始的。uPointsNumPoints长度的数组。在多边形中的每一个环的点被尾到尾存储。环2的点跟在环1的点之后,如此下去。部分数组对每一环保持开始点的数组索引。在不同环的点之间没有分隔符。uZRange以Zmin,Zmax顺序存储的MultiPointZ的最小,最大值。uZ ArrayNumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分点之间没有分隔符。uM Range以Mmin,Mmax顺序存储的MultiPointZ的最小,最大值。uM ArrayNumPoints长的measure的数组,在MultiPointZ每部分的measure被被尾到尾存储部分2的点跟在部分1的点之后,如此下去。部分数组对每一部分保持开始点的数组索引。在不同部分点之间没有分隔符。关于PolygonZ shape有以下注意事项:n环是闭合的(第一个和最后一个顶点必须是一样的)n在点数组中环的顺序是不重要的。表15多边形Z的记录内容注意:X=44+4* NumParts YX(16* NumPoints)Z=Y+16+(8* NumPoints) *可选的3.4.5MultiPatch一个MultiPatch包括许多表面块。每个表面块描述了一个表面。MultiPatch的表面块是作为它的部分,部分的类型决定了一个MultiPatch部分的顶点顺序。一个MultiPatch的部分可以是以下类型:n三角形条带三角形的连接条带,此处每个顶点(在开始二个后)完成一个新三角形。一个新三角形总是通过把新顶点和二个临近的原有点相连而得到。n三角形扇三角形的连接扇,此处每个顶点(在开始二个后)完成一个新三角形。一个新三角形总是通过把新顶点和一个个临近的原有点及这部分的第一个顶点相连而得到。外环多边形的外环。n内环多边形的洞。n第一环未定义类型的多边形的第一个环。n环未定义类型的多边形的环。一个简单的三角形条带或三角形扇代表一个简单的表面斑块。参见图3看这些部分类型的例子。带环的部分的序列能描述有洞的多边形表面。该序列典型包括一个外环,代表斑块的外边界,用许多内环代表洞。当用代表表现带洞的多边形斑块环的集合的个体环是不知道,整个序列以第一环开始,接着是其他的环。不跟着第一环后的环的序列被认为是没有洞的外环的序列。图3 MultiPatch部分例子用来对部分类型进行编码的值有:值部分类型0三角形条带1三角形扇2外环3内环4第一环5环MultiPatchDouble4 Box /边界盒Integer NumParts /部分的数目Integer NumPoints /点的总数目IntegerNumParts Parts /在部分中第一个点的索引IntegerNumParts PartsTypes /部分类型PointNumPoints Points /所有部分的点Double2 Z Range /Z的上下界DoubleNumPoints Z Array /Z的值Double2 M Range /measure

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论