zoukankan      html  css  js  c++  java
  • shp系列(四)——利用C++进行Shx文件的读(打开)

    1.shx文件的基本情况

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

    2.shx文件的组成

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

    2.1.shx文件文件头

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

    2.2 shx文件实体信息

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


    • 第一条记录的位移量就是头文件的长度,头文件字节数为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的写(创建)。

  • 相关阅读:
    稀疏自编码器一览表
    ZOJ 3886 Nico Number(筛素数+Love(线)Live(段)树)
    K好数(DP)
    【BZOJ4025】二分图
    又一次认识java(七) ---- final keyword
    二分查找
    从朴素贝叶斯分类器到贝叶斯网络(下)
    最近感到深深的绝望,感觉自己太菜了
    leetcode No.19 删除链表的倒数第N个节点 (python3实现)
    leetcode No.94 二叉树的中序遍历 (python3实现)
  • 原文地址:https://www.cnblogs.com/fan-0802-WHU/p/10150970.html
Copyright © 2011-2022 走看看