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的寫(創建)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM