Shapefile格式说明及读写代码示例
Shape files 数据说明
Shape files 是ESRI 提供的一种矢量数据格式,它没有拓扑信息,一个Shape files 由一组文件组成,其中必要的基本文件包括坐标文件( .shp )、索引文件( .shx )和属性文件( .dbf )三个文件。
坐标文件的结构说明
sizeof是什么坐标文件(.shp) 用于记录空间坐标信息。它由头文件和实体信息两部分构成(如图 2.1 所示)。坐标文件的文件头
坐标文件的文件头是一个长度固定(100 bytes) 的记录段,一共有9 个int 型和7 个double 型数据,主要记录内容见表 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
Integer Little
32 几何类型表示这个Shapefile 文件所记录的空间数据的几何
类型
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
84* Mmin 最小Measure 值Double Little
92* Mmax 最大Measure 值Double Little
表 2.2shapefiles 头文件表
注:最后 4 个加星号特别标示的四个数据只有当这个Shapefile 文件包含Z 方向坐标或者具有Measure 值时才有值,否则为0.0 。所谓Measure 值,是用于存储需要的附加数据,可以用来记录各种数据,例如权值、道路长度等信息。
位序
细心的读者会注意到表 2.2 中的数值的位序有Little 和big 的区别,对于位序是big 的数据我们在读取时要小心。通常,数据的位序都是Little ,但在有些情况下可能会是big ,二者的区别在于它们位序的顺序相反。一个位序为big 的数据,如果我们想得到它的真实数值,需要将它的位序转换成Little 即可。转换原理非常简单,就是交换字节顺序,下面是作者实现的在两者间进行转换的程序,代码如下:// 位序转换程序
unsigned long OnChangeByteOrder (int indata)
{
char ss[8];
char ee[8];
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++)
ee[i]='0';
for(i=0;i<length;i++)
ee[i+8-length]=ss[i];
for(i=0;i<8;i++)
ss[i]=ee[i];
}
////****** 进行倒序
int t;
t =ss[0];
ss[0] =ss[6];
ss[6] =t;
t =ss[1];
ss[1] =ss[7];
ss[7] =t;
t =ss[2];
ss[2] =ss[4];
ss[4] =t;
t =ss[3];
ss[3] =ss[5];
ss[5] =t;
////******
//****** 将存有十六进制数(val) 的字符串(ss) 中的十六进制数转成十进制数int value=0;
for(i=0;i<8;i++)
{
int k;
CString mass;
mass=ss[i];
if(ss[i]=='a' ||
ss[i]=='b' ||
ss[i]=='c' ||
ss[i]=='d' ||
ss[i]=='e' ||
ss[i]=='f')
k=10+ss[i]-'a';
else
sscanf(mass,"%d",&k);
value=value+int(k*pow(16,7-i));
}
return (value);
}
Shapefile 文件支持的几何类型(ShapeType )
Shapefile 文件所支持的几何类型如表2.3 所示:
编号几何类型
0 Null Shape (表示这个Shapefile 文件不含坐标)
1 Point (表示Shapefile 文件记录的是点状目标,但不是多点)
3 PolyLine (表示Shapefile 文件记录的是线状目标)
5 Polygon (表示Shapefile 文件记录的是面状目标)
8 MultiPoint (表示Shapefile 文件记录的是多点,即点集合)
11 PointZ (表示Shapefile 文件记录的是三维点状目标)
13 PolyLineZ (表示Shapefile 文件记录的是三维线状目标)
15 PolygonZ (表示Shapefile 文件记录的是三维面状目标)
18 MultiPointZ (表示Shapefile 文件记录的是三维点集合目标)
21 PointM (表示含有Measure 值的点状目标)
23 PolyLineM (表示含有Measure 值的线状目标)
25 PolygonM (表示含有Measure 值的面状目标)
28 MultiPointM (表示含有Measure 值的多点目标)
31 MultiPatch (表示复合目标)
表 2.3shapefiles 文件支持的几何类型
对于一个不是记录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, sizeof(int), 1,m_ShpFile_fp);
FileCode = OnChangeByteOrder(FileCode);
for(i=0;i<5;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(double),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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论