shp系列(二)——利用C++进行shp文件的读(打开)

本文介绍了如何使用C++读取SHP文件,详细讲解了数据类型的字节数、位序转换、SHP文件的基本构成,包括文件头和实体信息。重点解析了SHP头文件的结构和各个字段含义,以及记录头和记录内容的组成,特别是面状要素的记录内容。最后给出了C++读取SHP文件的函数代码。
摘要由CSDN通过智能技术生成

1.各数据类型及其字节数

BYTE 1;       char 1;    short 2;      int 4;    double 8;

2.位序big和little及其转换

对于位序是big的数据我们在读取时要小心。通常,数据的位序都是Little,但在有些情况下可能会是big,二者的区别在于它们位序的顺序相反。一个位序为big的数据,如果我们想得到它的真实数值,需要将它的位序转换成Little即可。转换原理就是交换字节顺序,下面是转换代码(big->little):

int OnChangeByteOrder(int indata)
{
	char ss[9];
	char ee[8];
	unsigned long val = unsigned long(indata);
	ultoa(val, ss, 16);// 将十六进制的数(val)转到一个字符串(ss)中,itoa(val,ss,16);  
	int i;
	int length = strlen(ss);
	if (length != 8){
		for (i = 0; i<8 - length; i++)
			ee[i] = '0';
		for (i = 0; i<length; i++)
			ee[i + 8 - length] = ss[i];
		for (i = 0; i<8; i++)
			ss[i] = ee[i];
	}
	//****** 进行倒序  
	int t;
	t = ss[0]; ss[0] = ss[6]; ss[6] = t;
	t = ss[1]; ss[1] = ss[7]; ss[7] = t;
	t = ss[2]; ss[2] = ss[4]; ss[4] = t;
	t = ss[3]; ss[3] = ss[5]; ss[5] = t;

	//****** 将存有十六进制数 (val) 的字符串 (ss) 中的十六进制数转成十进制数  
	int value = 0;
	for (i = 0; i<8; i++){
		int k;
		if (ss[i] == 'a' || ss[i] == 'b' || ss[i] == 'c' || ss[i] == 'd' || ss[i] == 'e' || ss[i] == 'f')
			k = 10 + ss[i] - 'a';
		else
			k = ss[i] - '0';
		value = value + int(k*(int)pow((DOUBLE)16, 7 - i));
	} 
	return(value);
}

3.shp文件的基本构成
shp文件,由于包含最主要的数据坐标数据,也叫主文件、坐标文件,由文件头和实体信息构成:

  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值