ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:24.96KB ,
资源ID:5813493      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5813493.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(shapefile格式说明及读写代码示例.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

shapefile格式说明及读写代码示例.docx

1、shapefile格式说明及读写代码示例Shapefile格式说明及读写代码示例Shape files 数据说明Shape files 是 ESRI 提供的一种矢量数据格式,它没有拓扑信息,一个 Shape files 由一组文件组成,其中必要的基本文件包括坐标文件( .shp )、索引文件( .shx )和属性文件( .dbf )三个文件。坐标文件的结构说明坐标文件 (.shp) 用于记录空间坐标信息。它由头文件和实体信息两部分构成(如图 2.1 所示)。坐标文件的文件头坐标文件的文件头是一个长度固定 (100 bytes) 的记录段,一共有 9 个 int 型和 7 个 double 型数

2、据,主要记录内容见表 2.2 。文件头记录头记录内容记录头记录内容记录头记录内容记录头记录内容图 2.1 坐标文件的结构起始位置名称数值类型位序0File Code9994Integerbig4Unused0Integerbig8Unused0Integerbig12Unused0Integerbig16Unused0Integerbig20Unused0Integerbig24文件长度文件的实际长度Integerbig28版本号1000IntegerLittle32几何类型表示这个 Shapefile 文件所记录的空间数据的几何类型IntegerLittle36Xmin空间数据所占空间范围的

3、 X 方向最小值DoubleLittle44Ymin空间数据所占空间范围的 Y 方向最小值DoubleLittle52Xmax空间数据所占空间范围的 X 方向最大值DoubleLittle60Ymax空间数据所占空间范围的 Y 方向最大值DoubleLittle68*Zmin空间数据所占空间范围的 Z 方向最小值DoubleLittle76*Zmax空间数据所占空间范围的 Z 方向最大值DoubleLittle84*Mmin最小 Measure 值DoubleLittle92*Mmax最大 Measure 值DoubleLittle表 2.2shapefiles 头文件表注:最后 4 个加星号

4、特别标示的四个数据只有当这个 Shapefile 文件包含 Z 方向 坐标或者具有 Measure 值时才有值,否则为 0.0 。所谓 Measure 值,是用于存储需要的 附加数据,可以用来记录各种数据,例如权值、道路长度等信息。位序细心的读者会注意到表 2.2 中的数值的位序有 Little 和 big 的区别,对于位序是 big 的数据我们在读取时要小心。通常,数据的位序都是 Little ,但在有些情况下可能会是 big ,二者的区别在于它们位序的顺序相反。一个位序为 big 的数据,如果我们想得到它的真实数值,需要将它的位序转换成 Little 即可。转换原理非常简单,就是交换字节顺

5、序,下面是作者实现的在两者间进行转换的程序,代码如下:/ 位序转换程序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;i8-length;i+) eei=0; for(i=0;ilength;i+) eei+8-lengt

6、h=ssi; for(i=0;i8;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;i8;i+) int k; CString mass; mass=ssi; if(ssi=a | ssi=b | ssi=c | ssi=d | ssi=e | ssi

7、=f) k=10+ssi-a; else sscanf(mass,%d,&k); value=value+int(k*pow(16,7-i); return (value);Shapefile 文件支持的几何类型( ShapeType )Shapefile 文件所支持的几何类型如表 2.3 所示:编号几何类型0Null Shape (表示这个 Shapefile 文件不含坐标)1Point (表示 Shapefile 文件记录的是点状目标,但不是多点)3PolyLine (表示 Shapefile 文件记录的是线状目标)5Polygon (表示 Shapefile 文件记录的是面状目标)8Mu

8、ltiPoint (表示 Shapefile 文件记录的是多点,即点集合)11PointZ (表示 Shapefile 文件记录的是三维点状目标)13PolyLineZ (表示 Shapefile 文件记录的是三维线状目标)15PolygonZ (表示 Shapefile 文件记录的是三维面状目标)18MultiPointZ (表示 Shapefile 文件记录的是三维点集合目标)21PointM (表示含有 Measure 值的点状目标)23PolyLineM (表示含有 Measure 值的线状目标)25PolygonM (表示含有 Measure 值的面状目标)28MultiPointM

9、 (表示含有 Measure 值的多点目标)31MultiPatch (表示复合目标)表 2.3shapefiles 文件支持的几何类型对于一个不是记录 Null Shape 类型的 Shapefile 文件,它所记录的空间目标的几何类型必须一致,不能在一个 Shapefile 文件中同时记录两种不同类型的几何目标。读取坐标文件( .shp )的文件头的代码 如下:void OnReadShp ( CString ShpFileName ) FILE* m_ShpFile_fp; /*Shp 文件指针/ 打开坐标文件 if(m_ShpFile_fp=fopen(ShpFileName,rb)=

10、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, sizeof(int), 1,m_ShpFile_fp); FileCode= OnChangeByteOrder(FileCode); for(i=0;i5;

11、i+) fread(&Unused,sizeof(int), 1,m_ShpFile_fp);fread(&FileLength, sizeof(int), 1,m_ShpFile_fp); FileLength = OnChangeByteOrder(FileLength); fread(&Version, sizeof(int), 1,m_ShpFile_fp); fread(&ShapeType, sizeof(int), 1,m_ShpFile_fp); fread(&Xmin, sizeof(double),1,m_ShpFile_fp); fread(&Ymin, sizeof(d

12、ouble),1,m_ShpFile_fp); fread(&Xmax, sizeof(double),1,m_ShpFile_fp); fread(&Ymax, sizeof(double),1,m_ShpFile_fp); fread(&Zmin, sizeof(double),1,m_ShpFile_fp); fread(&Zmax, sizeof(double),1,m_ShpFile_fp); fread(&Mmin, sizeof(double),1,m_ShpFile_fp); fread(&Mmax, sizeof(double),1,m_ShpFile_fp); / 读取坐标

13、文件头的内容结束 / 根据几何类型读取实体信息实体信息的内容实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目标的坐标信息,每个记录段分为记录头和记录内容两部分。记录头的内容包括记录号( Record Number )和坐标记录长度 (Content Length) 两个记录项。它们的位序都是 big 。记录号( Record Number )和坐标记录长度 (Content Length) 两个记录项都是 int 型,并且 shapefile 文件中的记录号都是从 1 开始的。记录内容包括目标的几何类型( ShapeType )和具体的坐标记录 (X 、 Y) ,

14、记录内容因要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标( Point )、线状目标( PolyLine )和面状目标( Polygon )三种几何类型的 .shp 文件的记录内容:点状目标shapefile 中的点状目标由一对 X 、 Y 坐标构成,坐标值为双精度型( double )。点状目标的记录内容如表 2.4 :记录项数值数据类型长度个数位序几何类型( ShapeType )1 (表示点状目标)int 型41LittleX 方向坐标X 方向坐标值double 型81LittleY 方向坐标Y 方向坐标值double 型81Little下面是 读取点状目标的记录内

15、容的代码:OnReadPointShp(CString ShpFileName) / 打开坐标文件 / 读取坐标文件头的内容开始 / 读取点状目标的实体信息 int RecordNumber; int ContentLength; int num =0; while(fread(&RecordNumber, sizeof(int), 1,ShpFile_fp)!=0) num+; fread(&ContentLength,sizeof(int), 1,ShpFile_fp); RecordNumber = OnChangeByteOrder(RecordNumber); ContentLeng

16、th = OnChangeByteOrder(ContentLength); int shapeType; double x;double y; fread(&shapeType, sizeof(int), 1,ShpFile_fp); fread(&x, sizeof(double), 1,ShpFile_fp); fread(&y, sizeof(double), 1,ShpFile_fp);线状目标shapefile 中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子线段之间可以是相离的,同时子线段之间也可以相交。 Shapefile 允许出现多个坐标完全相同的连续点,

17、当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度为 0 的子线段出现。线状目标的记录内容如表 2.5 :记录项数值数据类型长度个数位序几何类型( ShapeType )3 (表示线状目标)int 型41Little坐标范围( Box )表示当前线目标的坐标范围double 型324Little子线段个数( NumParts )表示构成当前线目标的子线段的个数int 型41Little坐标点数( NumPoints )表示构成当前线目标所包含的坐标点个数int 型41LittleParts 数组记录了每个子线段的坐标在 Points 数组中的起始位置int 型4NumPartsNu

18、mPartsLittlePoints 数组记录了所有的坐标信息Point 型根据点个数来确定NumPointsLittle表 2.5 线状目标的记录内容具体的数据结构如下:PolyLineDouble4 Box / 当前线状目标的坐标范围Integer NumParts / 当前线目标所包含的子线段的个数Integer NumPoints / 当前线目标所包含的顶点个数IntegerNumParts Parts / 每个子线段的第一个坐标点在 Points 的位置PointNumPoints Points / 记录所有坐标点的数组这些记录项的具体含义如下:Box 记录了当前的线目标的坐标范围,

19、它是一个 double 型的数组,按照 Xmin 、 Ymin 、 Xmax 、 Ymax 的顺序记录了坐标范围;NumParts 记录了当前线目标所包含的子线段的个数;NumPoints 记录了当前线目标的坐标点总数;Parts 记录了每个子线段的第一个坐标点在坐标数组 points 中的位置,以便读取数据;Points 是用于存放当前线目标的 X 、 Y 坐标的数组。下面是读取线状目标的记录内容的代码:OnReadLineShp(CString ShpFileName) / 打开坐标文件 / 读取坐标文件头的内容开始 / 读取线状目标的实体信息 int RecordNumber; int

20、ContentLength; int num =0; while(fread(&RecordNumber, sizeof(int), 1,ShpFile_fp)!=0) fread(&ContentLength,sizeof(int), 1,ShpFile_fp); RecordNumber = OnChangeByteOrder (RecordNumber); ContentLength = OnChangeByteOrder (ContentLength); int shapeType; double Box4; int NumParts; int NumPoints; int *Part

21、s; fread(&shapeType, sizeof(int), 1,ShpFile_fp); / 读 Box for(i=0;i4;i+) fread(Box+i, sizeof(double),1,ShpFile_fp); / 读 NumParts 和 NumPoints fread(&NumParts, sizeof(int), 1,ShpFile_fp); fread(&NumPoints, sizeof(int), 1,ShpFile_fp); / 读 Parts 和 Points Parts= new intNumParts; for(i=0;iNumParts;i+)fread

22、(Parts+i, sizeof(int), 1,ShpFile_fp); int pointNum; for(i=0;iNumParts;i+) if(i!=NumParts-1) pointNum =Partsi+1-Partsi; else pointNum =NumPoints-Partsi; double *PointsX; double *PointsY; PointsX =new doublepointNum; PointsY =new doublepointNum; for(j=0;jpointNum;j+) fread(PointsX+j, sizeof(double),1,

23、ShpFile_fp); fread(PointsY+j, sizeof(double),1,ShpFile_fp); delete PointsX; delete PointsY; delete Parts; 面状目标shapefile 中的面状目标是由多个子环构成,每个子环是由至少四个顶点构成的封闭的、无自相交现象的环。对于含有岛的多边形,构成它的环有内外环之分,每个环的顶点的排列顺序或者方向说明了这个环到底是内环还是外环。一个内环的顶点是按照逆时针顺序排列的;而对于外环,它的顶点排列顺序是顺时针方向。如果一个多边形只由一个环构成,那么它的顶点排列顺序肯定是顺时针方向。每条多边形记录的数据结构与线目标的数据结构完全相同,PolygonDouble4 Box / 当

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1