shp文件详细格式
2.2.2 Shape files 数据说明数据说明 Shape files 是 ESRI 提供的一种矢量数据格式,它没有拓扑信息,一个 Shape files 由一 组文件组成,其中必要的基本文件包括坐标文件(.shp)、索引文件(.shx)和属性文件 (.dbf)三个文件。1. 坐标文件的结构说明坐标文件(.shp)用于记录空间坐标信息。它由头文件和实体信息两部分构成(如图 2.1 所示)。1) 坐标文件的文件头坐标文件的文件头是一个长度固定(100 bytes)的记录段,一共有 9 个 int 型和 7 个 double 型数据,主要记录内容见表 2.2。文件头记录头记录内容记录头记录内容记录头记录内容记录头记录内容记录头记录内容图图 2.12.1 坐标文件的结构坐标文件的结构起始位置名称数值类型位序0File Code9994Integerbig4Unused0Integerbig8Unused0Integerbig12Unused0Integerbig16Unused0Integerbig20Unused0Integerbig24文件长度文件的实际长度Integerbig28版本号1000IntegerLittle32几何类型表示这个 Shapefile 文件所记录的空间数据 的几何类型IntegerLittle36Xmin空间数据所占空间范围的 X 方向最小值DoubleLittle44Ymin空间数据所占空间范围的 Y 方向最小值DoubleLittle52Xmax空间数据所占空间范围的 X 方向最大值DoubleLittle60Ymax空间数据所占空间范围的 Y 方向最大值DoubleLittle68*Zmin空间数据所占空间范围的 Z 方向最小值DoubleLittle76*Zmax空间数据所占空间范围的 Z 方向最大值DoubleLittle84*Mmin最小 Measure 值DoubleLittle92*Mmax最大 Measure 值DoubleLittle表表 2.22.2 shapefilesshapefiles 头文件表头文件表注:最后 4 个加星号特别标示的四个数据只有当这个 Shapefile 文件包含 Z 方向坐标 或者具有 Measure 值时才有值,否则为 0.0。所谓 Measure 值,是用于存储需要的附加数 据,可以用来记录各种数据,例如权值、道路长度等信息。(1) 位序细心的读者会注意到表 2.2 中的数值的位序有 Little 和 big 的区别,对于位序是 big 的数据我们在读取时要小心。通常,数据的位序都是 Little,但在有些情况下可能会是 big,二者的区别在于它们位序的顺序相反。一个位序为 big 的数据,如果我们想得到它的 真实数值,需要将它的位序转换成 Little 即可。转换原理非常简单,就是交换字节顺序, 下面是作者实现的在两者间进行转换的程序,代码如下:/位序转换程序unsigned long OnChangeByteOrder (int indata)char ss8;char ee8;unsigned long val = unsigned long(indata);_ultoa( val, ss, 16 );/将十六进制的数(val)转到一个字符串(ss)中int i;int length=strlen(ss);if(length!=8)for(i=0;i<8-length;i+)eei='0'for(i=0;i<length;i+)eei+8-length=ssi;for(i=0;i<8;i+)ssi=eei;/*进行倒序int t;t =ss0;ss0 =ss6;ss6 =t;t =ss1;ss1 =ss7;ss7 =t;t =ss2;ss2 =ss4;ss4 =t;t =ss3;ss3 =ss5;ss5 =t;/*/*将存有十六进制数(val)的字符串(ss)中的十六进制数转成十进制数int value=0;for(i=0;i<8;i+)int k;CString mass;mass=ssi;if(ssi='a' | ssi='b' | ssi='c' |ssi='d' |ssi='e' |ssi='f')k=10+ssi-'a'elsesscanf(mass,“%d“,value=value+int(k*pow(16,7-i);return (value);(2) Shapefile 文件支持的几何类型(ShapeType)Shapefile 文件所支持的几何类型如表 2.3 所示:编号几何类型0Null Shape(表示这个 Shapefile 文件不含坐标)1Point(表示 Shapefile 文件记录的是点状目标,但不是多 点)3PolyLine(表示 Shapefile 文件记录的是线状目标)5Polygon(表示 Shapefile 文件记录的是面状目标)8MultiPoint(表示 Shapefile 文件记录的是多点,即点集合)11PointZ(表示 Shapefile 文件记录的是三维点状目标)13PolyLineZ(表示 Shapefile 文件记录的是三维线状目标)15PolygonZ(表示 Shapefile 文件记录的是三维面状目标)18MultiPointZ(表示 Shapefile 文件记录的是三维点集合目标)21PointM(表示含有 Measure 值的点状目标)23PolyLineM(表示含有 Measure 值的线状目标)25PolygonM(表示含有 Measure 值的面状目标)28MultiPointM(表示含有 Measure 值的多点目标)31MultiPatch(表示复合目标)表表 2.32.3 shapefilesshapefiles 文件支持的几何类型文件支持的几何类型对于一个不是记录 Null Shape 类型的 Shapefile 文件,它所记录的空间目标的几何 类型必须一致,不能在一个 Shapefile 文件中同时记录两种不同类型的几何目标。读取坐标文件(.shp)的文件头的代码如下:void OnReadShp(CString ShpFileName)FILE* m_ShpFile_fp; /*Shp 文件指针/打开坐标文件if(m_ShpFile_fp=fopen(ShpFileName,“rb“)=NULL)return;/读取坐标文件头的内容 开始int FileCode;int Unused;int FileLength;int Version;int ShapeType;double Xmin;double Ymin;double Xmax;double Ymax;double Zmin;double Zmax;double Mmin;double Mmax;fread(FileCode = OnChangeByteOrder (FileCode);for(i=0;i<5;i+)fread(fread(FileLength = OnChangeByteOrder (FileLength);fread(fread(fread(fread(fread(fread(fread(fread(fread(fread(/读取坐标文件头的内容 结束/根据几何类型读取实体信息2) 实体信息的内容实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实 体目标的坐标信息,每个记录段分为记录头和记录内容两部分。记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length) 两个 记录项。它们的位序都是 big。记录号(Record Number)和坐标记录长度(Content Length) 两个记录项都是 int 型,并且 shapefile 文件中的记录号都是从 1 开始的。记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X、Y) ,记录内容因 要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标(Point)、 线状目标(PolyLine)和面状目标(Polygon)三种几何类型的.shp 文件的记录内容:(1) 点状目标shapefile 中的点状目标由一对 X、Y 坐标构成,坐标值为双精度型(double)。点状 目标的记录内容如表 2.4:记录项数值数据类型长度个数位序几何类型(ShapeType)1(表示点状目标)int 型 41Little X 方向坐标X 方向坐标值double 型81LittleY 方向坐标Y 方向坐标值double 型81Little表表 2.42.4 点状目标的记录内容点状目标的记录内容下面是读取点状目标的记录内容的代码:OnReadPointShp(CString ShpFileName)/打开坐标文件/读取坐标文件头的内容 开始/读取点状目标的实体信息int RecordNumber;int ContentLength;int num =0;while(fread(fread(RecordNumber = OnChangeByteOrder (RecordNumber);ContentLength = OnChangeByteOrder (ContentLength);int shapeType;double x;double y;fread(fread(fread(2) 线状目标shapefile 中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段, 子线段之间可以是相离的,同时子线段之间也可以相交。Shapefile 允许出现多个坐标完 全相同的连续点,当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度 为 0 的子线段出现。线状目标的记录内容如表 2.5:记录项数值数据类型长度个数位序几何类型 (ShapeType)3(表示线状目标)int 型 41Little坐标范围 (Box)表示当前线目标的坐 标范围double 型324Little子线段个数 (NumParts)表示构成当前线目标 的子线段的个数int 型41Little坐标点数 (NumPoints)表示构成当前线目标 所包含的坐标点个数int 型41LittleParts 数组记录了每个子线段的 坐标在 Points 数组 中的起始位置int 型4×NumPartsNumPartsLittlePoints 数组记录了所有的坐标信 息Point 型根据点个数 来确定NumPointsLittle表表 2.52.5 线状目标的记录内容线状目标的记录内容具体的数据结构如下:PolyLineDouble4 Box / 当前线状目标的坐标范围Integer NumParts / 当前线目标所包含的子线段的个数Integer NumPoints / 当前线目标所包含的顶点个数IntegerNumParts Parts / 每个子线段的第一个坐标点在 Points 的位 置PointNumP