1. 程式人生 > >shp系列(四)——利用C++進行Shx檔案的讀(開啟)

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