没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Shapefile 格式说明及读写代码示例
Shape files 数据说明
Shape files 是 ESRI 提供的一种矢量数据格式,它没有拓扑信息,一个
Shape files 由一组文件组成,其中必要的基本文件包括坐标文件( .shp )、
索引文件( .shx )和属性文件( .dbf )三个文件。
1 坐标文件的结构说明
坐标文件 (.shp) 用于记录空间坐标信息。它由头文件和实体信息两部分构
成(如图 2.1 所示)。
1.1 坐标文件的文件头
坐标文件的文件头是一个长度固定 (100 bytes) 的记录段,一共有 9 个
int 型和 7 个 double 型数据,主要记录内容见表 2.2 。
图 2.1 坐标文件的结构
文件头
记录头
记录内容
记录头
记录内容
记录头
记录内容
记录头
记录内容
表 2.2shapefiles 头文件表
起始位
置
名称
数值
类型
位序
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
几何类
型
表示这个 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
84*
Mmin
最小 Measure 值
Double
Little
92*
Mmax
最大 Measure 值
Double
Little
注:最后 4 个加星号特别标示的四个数据只有当这个 Shapefile 文件包含
Z 方向 坐标或者具有 Measure 值时才有值,否则为 0.0 。所谓 Measure
值,是用于存储需要的 附加数据,可以用来记录各种数据,例如权值、道路长
度等信息。
1.2 位序
细心的读者会注意到表 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);
}
1.3 Shapefile 文件支持的几何类型( ShapeType )
Shapefile 文件所支持的几何类型如表 2.3 所示:
表 2.3shapefiles 文件支持的几何类型
编号
几何类型
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 (表示复合目标)
对于一个不是记录 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);
剩余18页未读,继续阅读
资源评论
- 鬼脸嘟嘟072015-11-07非常好,写得很详细,很有用
- mjlaibl2013-12-22非常好,推荐
- kml11808holp22013-06-27还好看的明白,试着 自己加工下。
言無
- 粉丝: 9
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功