Java字节流读取shp_shp系列(四)——利用C++进行Shx文件的读(打开)

1.shx文件的基本情况

shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量。通过索引文件可以很方便地在坐标文件中定位到指定目标的坐标信息。

2.shx文件的组成

索引文件也是由头文件和实体信息两部分构成,其中文件头部分是一个长度固定(100 bytes)的记录段,其内容与坐标文件的文件头基本一致(FileLength指shx文件的FileLength)。它的实体信息以记录为基本单位,每一条记录包括偏移量(offset)和记录段长度(Content Length)两个记录项。

c6139a7220dfb1a28a6265121158aa4d.png

2.1.shx文件文件头

索引文件文件头的组织形式与主文件文件头的描述是一样的,除了FileLength,其他的和shp文件文件头一样。

2.2 shx文件实体信息

它的实体信息以记录为基本单位,每一条记录包括偏移量(offset)和记录段长度(Content Length)两个记录项,它们的位序都是big,两个记录项都是int型。

b830b43868fe27bb6fb422801a07186f.png

7d469a8d5bff2053979bf596b8e5ab23.png

第一条记录的位移量就是头文件的长度,头文件字节数为100,所以第一个位移量为100/2 = 50。

记录长度与shp文件中记录一一对应。

3.读取shx的代码

void readShx(CString filename)

{

//****读取shp、dbf之后打开shx文件

int n = filename.ReverseFind('.');

filename = filename.Left(n);

filename = filename + ".shx";

FILE* m_ShxFile_fp; //Shx文件指针

if ((m_ShxFile_fp = fopen(filename, "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_ShxFile_fp);

FileCode = OnChangeByteOrder(FileCode);

for (int i = 0; i<5; i++)

fread(&Unused, sizeof(int), 1, m_ShxFile_fp);

fread(&FileLength, sizeof(int), 1, m_ShxFile_fp);

FileLength = OnChangeByteOrder(FileLength); //FileLength为shx文件的长度

fread(&Version, sizeof(int), 1, m_ShxFile_fp);

fread(&ShapeType, sizeof(int), 1, m_ShxFile_fp);

fread(&Xmin, sizeof(double), 1, m_ShxFile_fp);

fread(&Ymin, sizeof(double), 1, m_ShxFile_fp);

fread(&Xmax, sizeof(double), 1, m_ShxFile_fp);

fread(&Ymax, sizeof(double), 1, m_ShxFile_fp);

fread(&Zmin, sizeof(double), 1, m_ShxFile_fp);

fread(&Zmax, sizeof(double), 1, m_ShxFile_fp);

fread(&Mmin, sizeof(double), 1, m_ShxFile_fp);

fread(&Mmax, sizeof(double), 1, m_ShxFile_fp);

//****读取索引文件头的内容 结束

//****读取实体信息

int Offset, ContentLength;

while ((fread(&Offset, sizeof(int), 1, m_ShxFile_fp) != 0)) {

fread(&ContentLength, sizeof(int), 1, m_ShxFile_fp);

Offset = OnChangeByteOrder(Offset); //转化为十进制

ContentLength = OnChangeByteOrder(ContentLength); //转化为十进制

}

}

4.总结

至此,Shx文件读取方式也介绍完了。接下来三篇分别介绍Shp、Dbf、Shx的写(创建)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值