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

上传人:飞*** 文档编号:35981156 上传时间:2018-03-23 格式:DOC 页数:18 大小:241KB
返回 下载 相关 举报
shapefile格式说明及读写代码示例_第1页
第1页 / 共18页
shapefile格式说明及读写代码示例_第2页
第2页 / 共18页
shapefile格式说明及读写代码示例_第3页
第3页 / 共18页
shapefile格式说明及读写代码示例_第4页
第4页 / 共18页
shapefile格式说明及读写代码示例_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《shapefile格式说明及读写代码示例》由会员分享,可在线阅读,更多相关《shapefile格式说明及读写代码示例(18页珍藏版)》请在金锄头文库上搜索。

1、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 坐标文件的结构 起始位置 名称 数值 类型 位序 0 File Code 9994 Integer big 4 Unused 0 Integer big 8 Unused 0 Integer big 12 Unused 0 Integer big 16 Unused 0 Integer big 20 Unused 0 Integer big 24 文件长度 文件的实际长度 Integer big 28 版本号 1000 Integer Little 32 几何类型 表

3、示这个 Shapefile 文件所记录的空间数据的几何类型 Integer Little 36 Xmin 空间数据所占空间范围的 X 方向最小值 Double Little 44 Ymin 空间数据所占空间范围的 Y 方向最小值 Double Little 52 Xmax 空间数据所占空间范围的 X 方向最大值 Double Little 60 Ymax 空间数据所占空间范围的 Y 方向最大值 Double Little 68* Zmin 空间数据所占空间范围的 Z 方向最小值 Double Little 76* Zmax 空间数据所占空间范围的 Z 方向最大值 Double Little 8

4、4* Mmin 最小 Measure 值 Double Little 92* Mmax 最大 Measure 值 Double Little 注:最后 4 个加星号特别标示的四个数据只有当这个 Shapefile 文件包含 Z 方向 坐标或 者具有 Measure 值时才有值,否则为 0.0 。所谓 Measure 值,是用于存储需要的 附加数据,可以用来记录各种数据,例如权值、道路长度等信息。 位序 细心的读者会注意到表 2.2 中的数值的位序有 Little 和 big 的区别,对于位序是 big 的 数据我们在读取时要小心。通常,数据的位序都是 Little ,但在有些情况下可能会是 b

5、ig ,二者的区别在于它们位序的顺序相反。一个位序为 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=s

6、trlen(ss);if(length!=8)for(i=0;i8-length;i+)eei=0;for(i=0;ilength;i+)eei+8-length=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

7、;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); Shapefile 文件支持的几何类型( ShapeType ) Shapefile 文件所支持的几何类型如表 2.3 所示:表 2.3shapefiles 文件支持的几何类型 对于一个不是记录 Null Shape 类型的 Shapefile 文件,它所记录的空间目标的几何类型必 须一致,不能在一个 Shapefile 文件中同

8、时记录两种不同类型的几何目标。 读取坐标文件( .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;do

9、uble Zmin;double Zmax;double Mmin;double Mmax;fread(FileCode = OnChangeByteOrder(FileCode);for(i=0;i5;i+)fread(fread( FileLength = OnChangeByteOrder(FileLength);fread(fread(fread(fread(fread(fread(fread(fread(fread(fread(/ 读取坐标文件头的内容结束/ 根据几何类型读取实体信息 实体信息的内容 实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目 标的

10、坐标信息,每个记录段分为记录头和记录内容两部分。 记录头的内容包括记录号( Record Number )和坐标记录长度 (Content Length) 两个记录项。它们的位序都是 big 。记录号( Record Number )和坐标记录长度 (Content Length) 两个记录项都是 int 型,并且 shapefile 文件中的记录号都是从 1 开始的。记录内容包括目标的几何类型( ShapeType )和具体的坐标记录 (X 、 Y) ,记录内容 因要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标( Point ) 、线状目标( PolyLine )和面状

11、目标( Polygon )三种几何类型的 .shp 文件的记录内 容: 点状目标 shapefile 中的点状目标由一对 X 、 Y 坐标构成,坐标值为双精度型( double ) 。点状 目标的记录内容如表 2.4 : 记录项 数值 数据类型 长度 个数 位序 几何类型( ShapeType ) 1 (表示点状目标) int 型 4 1 Little X 方向坐标 X 方向坐标值 double 型 8 1 Little Y 方向坐标 Y 方向坐标值 double 型 8 1 Little 下面是 读取点状目标的记录内容的代码: OnReadPointShp(CString ShpFileNa

12、me) / 打开坐标文件/ 读取坐标文件头的内容开始/ 读取点状目标的实体信息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( 线状目标 shapefile 中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子

13、线 段之间可以是相离的,同时子线段之间也可以相交。 Shapefile 允许出现多个坐标完全相 同的连续点,当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度为 0 的子线段出现。线状目标的记录内容如表 2.5 :具体的数据结构如下: PolyLine Double4 Box / 当前线状目标的坐标范围 Integer NumParts / 当前线目标所包含的子线段的个数 Integer NumPoints / 当前线目标所包含的顶点个数 IntegerNumParts Parts / 每个子线段的第一个坐标点在 Points 的位置 PointNumPoints Points /

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

15、 读取坐标文件头的内容开始/ 读取线状目标的实体信息int RecordNumber;int ContentLength;int num =0;while(fread(RecordNumber = OnChangeByteOrder (RecordNumber);ContentLength = OnChangeByteOrder (ContentLength);int shapeType;double Box4;int NumParts;int NumPoints;int *Parts;fread( / 读 Boxfor(i=0;i4;i+)fread(Box+i, sizeof(double),1,ShpFile_fp); / 读 NumParts 和 NumPointsfread(fread( / 读 Parts

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号