BSQ格式数据转换为RSD缺省的BIP格式数据

李国春

RSD内部统一以BIP格式排列数据,并且文件格式(非TFS)数据倒放(North Down)。早期是为了和设备无关位图(DIB)一致节省一点处理时间。现在设备处理能力增强了这点时间已经无关紧要,但是这种数据排列方式还是延续了下来。通常这些内部结构不需要用户关心,RSD自动处理成习惯的数据和图像。

高分卫星遥感数据运营部门分发的1级或者2级TIFF格式数据内部多保存为BSQ格式。RSD在读取时自动转换成BIP格式。但是也有一些部门(软件)开始就将其保存为BIP,RSD读取时再进行转换反而成了BSQ,读出来正射后结果如图1(左),4个波段的数据变成了16个小块。

下面介绍一个函数将其纠正为正常显示方式,图1(右)。

图1

下面的函数是一个读TIFF数据到缓存的函数。

int TifReadData(STRING name,WORD* buffer,int interleave);

这个函数将name 指定的TIFF数据以BIP格式读入到数据缓存buffer中。第三个参数int interleave是文件中的数据排列格式。如果你知道TIFF文件是BSQ格式排列的,将这个参数指定为BSQ,则读出数据如图1(右)。

下面是转换一个TIFF格式数据的完整代码。如果你正射校正一个数据集后发现结果如图一(左),将这个正射结果保存为一个TIFF格式文件,再用下述代码处理。代码如下:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	99脚本语言示例代码  —— TifReadData(name,buffer,BSQ),将用BIP(INTERLEAVE==PIX)格式数据按 BSQ格式读出  
//
//	李国春 2022年 11月 6日
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
	STRING name = OpenFileDialog(TRUE,"*.tif;*.tiff");//打开一个tif文件

	Print("开始打开 %s 文件,读BSQ格式的数据",name);
	DWORD tc = GetTickCount();

	STRING projstr;
	double box[4];		//投影后的四角坐标,次序为:minN,minE,maxN,maxE
	double quad[8];		//四角的经纬度,书写次序。
	double pixsize;
	int height,width,bands,datatype;
	int b2 = TifInqGTiffInfo(name,projstr,box,quad,pixsize,height,width,bands,datatype);	//读取 Geo TIFF 文件信息
	
	//申请内存,读入TIFF数据///////////////////////////////////////////////////////////////////////////////////////////////
	WORD buffer[height][width][bands];
	int e = TifReadData(name,buffer,BSQ);//最后一个参数进行 BSQ 转换。(读正常数据最后一个参数写 BIP,或者空着不写)

	//根据 PAN 数据范围创建任务,向任务框架添加正射校正后的 PAN 和 MSS 数据////////////////////////////////////////////////
	STRING misname = FileNameMain(name);
	int misID = CreateMission2(misname,projstr,box,pixsize);//创建任务,但是不显示窗口!!!
	FmShowFrameWindow(misID,TRUE);//显示主框架窗口

	//转换后数据创建新层
	int lyr = GdMakeBufferGridLayer(buffer,datatype,0,0,height,width,bands,BIP,0,32767,misname);//将栅格数据加载到任务框架
	int lyrs = InqNumLayers();//任务中层数

	//窗口刷新显示
	FmUpdateFrameWindow(lyrs-1);//用最后一层数据刷新任务主窗口

	double tm = (GetTickCount() - tc) / 1000.0;
	Print("转换并创建RSD任务 %s 并合成图像用时 %f 秒。",name,tm);

	Print("主程序结束");
	return TRUE;
}

运行后得到图1右侧的结果。

或者选中一个BSQ的GRID层,使用图2的菜单命令也可以将BSQ格式的数据转换为RSD缺省的BIP格式。

图2

加企鹅758461012,原来的满了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值