我写了个shpReader的程序,可以读取shapefile文件的头文件里的参数:
其实文件就是个结构体,文件里的参数存放在结构体里面固定的位置,可以定义一个与文件相同结构的结构体,用于存放文件中的参数:
struct shapefile
准备个shp文件,放入与源文件相同的文件夹中,我选择的是building.shp
位序转置,这个我研究了半天,看了网上的各种方法,结果发现无比复杂,且得不出正确结果,后来我发现可以先将int存入BYTE数组中,交换BYTE数组中值的顺序,然后再将BYTE转化成int,由于int到BYTE之间不是二进制传递,所以先得定义一个void指针,void*指向int,再定义一个BYTE指针,void*赋值给BYTE*,再讲BYTE*的值赋给BYTE数组,就可以实现int与BYTE之间的转换了,BYTE变int也是执行同样的操作,位序转换的函数为:
int OnChangeByteOrder()
具体代码入下:
#define _CRT_SECURE_NO_WARNINGS//这个一定要有,不然编译时会报错
#include<iostream>
#include<Windows.h>
using namespace std;
struct shapefile
{
int File_Code;
int nouse[5];
int length;
int version;
int geometry;//几何类型
double Xmin;
double Ymin;
double Xmax;
double Ymax;
double Zmin;
double Zmax;
double Mmin;
double Mmax;
};
int OnChangeByteOrder(int indata)
{
BYTE s[4];//位序转置之前的数组
BYTE *sp;
void *vp;
vp=&indata;
sp=(BYTE*)vp;
for(int i=0;i<4;i++) s[i]=sp[i];
BYTE e[4];//位序转置之后的数组
for(int i=0;i<4;i++) e[i]=s[3-i];
int result;
int *rp;
vp=e;
rp=(int*)vp;
result=*rp;
return result;
}
void main()
{
shapefile shp;
FILE* fp;
if((fp=fopen("building.shp","rb"))==NULL)
{
cout<<"无法打开文件";
return;
}
fread(&shp,sizeof(shp),1,fp);
fclose(fp);
shp.File_Code=OnChangeByteOrder(shp.File_Code);
shp.length=OnChangeByteOrder(shp.length);
cout<<shp.File_Code<<'\t'<<shp.length<<'\t'<<shp.version<<'\t'<<shp.geometry;
}
运行结果如下: