程序设计:gdal:从小组框架更新的gdal

小组新框架

  • vc6工程文件在vc60下
  • vs2010工程文件在vc100下
  • src 文件夹中包括源代码(.h,.cpp文件)
  • include 包括gdal和aramdillo头文件
  • lib 包括完整的gdal(所有格式、投影库、geos库,矢量格式)、openBlas0.2.8版的dll和lib
  • res 中含有资源文件
  • data 为测试数据目录
  1. 打开工程
  2. 参照Fix.h,Fix.cpp,建立和修改对话框中的各种内容
  3. 参照MainFrm.cpp 中OnAddImage函数中读取、处理,写入影像
  4. 处理函数最好单独用一个类来写,demo中实例比较简单,只是两个影像相加,所以没有写。
  5. 需要速度的时候,请使用Release编译,编译完成后,lib中的dll文件将会自动拷贝到执行文件的文件夹中,不需要像更新那样手动拷贝

简单的double矩阵乘法、求逆、转置、行列式、线性最小二乘,可以直接调用CMatrix类中的函数(头文件 Matrix.h)
vs2010可以使用Armadillo矩阵库(使用模板实现,可以多种数据类型),只需要包括头文件:

#include "armadillo/armadillo"

具体使用请自己看Armadillo矩阵库文档

\include\armadillo\doc.html

CPreprocessing类中包括对影像简单的预处理,包括: -

  1. 重投影函数
  2. 重采样函数
  3. 裁剪函数
  4. 将hdf、netcdf一类有子数据集的数据转换成单个tif文件的函数

从原有框架变到新的gdal,有以下步骤:

  1. StdAfx.h文件中,注释掉 #include “GeoImagerLib.h”
  2. 在使用原有框架读取数据的cpp文件中, 注释掉 #include “RasterLib.h”
  3. 下载文件gdalogr.zip,解压
  4. 拷贝解压出来的lib和include文件夹到工程中
  5. 工程,设置中(win32 Debug和win32 Release需要分别设置)
    • 在C/C++选项卡中,选择Category为Preprocessor,在Additional include directories中添加 include
    • 在link选项卡中,选择Category为General,在Object/library modules:中,添加 “gdal_i.lib”
    • 在link选项卡中,选择Category为Input,在Additional library path:中,添加 “lib”
  6. 将lib文件夹中的gdal110.dll等dll文件拷贝到Debug、Release文件夹下
  7. 在读取写入的地方,添加头文件 #include “gdal_priv.h”
  8. 可删除的文件:
 gdal12.dll GeoImagerLib.h GLib.h GlobeLib.dll hd420md.dll hm420md.dll MRF.h RasterLib.h RSGeoReferLibd.dll RSGlobalLibd.dll RSGlobalLibd.lib RSImageDlld.dll RSImageDlld.lib

<code>

</code>

读取写入文件说明

GDALAllRegister();//注册类型,打开影像必须加入此句
GDALDataset *ds1; 
ds1 = (GDALDataset *) GDALOpen(input1,GA_ReadOnly);//input1为文件名
if(ds1 == NULL) //读取失败
{
	AfxMessageBox("cant open the unReferard image!");
	return ;
}
 
WidthAll = ds1->GetRasterXSize(); //影像宽度
HeightAll = ds1->GetRasterYSize();//影像高度
BandNum = ds1->GetRasterCount();//影像波段数
//读取波段数据
GDALRasterBand *poBand;//不需要释放,只需要最后是否GDALDataset
double **Inputimg1 = new double*[BandNum];
for(j=0;j<BandNum;j++)
{
	Inputimg1[j] = new double[ImgSize];
	//注意,获取波段数从1开始计数!!
	poBand = ds1->GetRasterBand(j+1);
	//将数据写入Inputimg1[j],RasterIOd中,参数具体含义见下文:
	poBand->RasterIO(GF_Read,0, 0, Width, Height,Inputimg1[j],Width,Height,GDT_Float64,0,0);
}
//用完之后,关闭dataset即可,不需要释放GDALRasterBand
GDALClose(ds1);

读写数据函数 RasterIO说明

///CPLErr GDALRasterBand::RasterIO (   
///@param eRWFlag,  //读取或者写入,GF_Read或GF_Write
///@param nXOff,       //起始点x坐标
///@param nYOff,       //起始点y坐标
///@param nXSize,      //所需读取(写入)块宽度
///@param nYSize,      //所读(写)块高度
///@param * pData,        //所读(写)数据,指针,
///@param nBufXSize,   //一般跟nXSize一致,用于缩放图像,图像将按nBufXSize/nXsize在x尺度缩放(会自动重采样),所有一般不需要调整
///@param nBufYSize,   //一般跟nYSize一致
///@param eBufType,//与pData的实际类型一致,GDT_Float64代表double,其他的可以跳到定义查看  
///@param nPixelSpace,  
                //设置为0为自动判断,一般设为0
                //表示的是当前像素值和下一个像素值之间的间隔,单位是字节
                //例:byte类型,就是1,double类型,就是8
///@param nLineSpace    
                //设置为0为自动判断,一般设为0
                //表示的是当前行和下一行的间隔,,单位是字节
                //例如,一行300像素,类型为int,此时就是300*4 = 1200
///@return 是否成功,成功返回CE_None ,失败返回 CE_Failure 
CPLErr GDALRasterBand::RasterIO (   
	GDALRWFlag eRWFlag, 
	int     nXOff, 
	int     nYOff, 
	int     nXSize,      	
	int     nYSize,   
	void * pData,    
	int     nBufXSize,   		
	int     nBufYSize,   
	GDALDataType    eBufType,
	int     nPixelSpace,  	
	int     nLineSpace    
) 

分块读取,处理数据,也使用RasterIO函数。GdalDataset 和 GdalRasterBand都支持RasterIO函数分块读取和写入数据

GDALAllRegister();//注册类型,打开影像必须加入此句
GDALDataset *ds1; 
ds1 = (GDALDataset *) GDALOpen(input1,GA_ReadOnly);//input1为文件名
if(ds1 == NULL) //读取失败
{
	AfxMessageBox("cant open the unReferard image!");
	return ;
}
 
WidthAll = ds1->GetRasterXSize(); //影像宽度
HeightAll = ds1->GetRasterYSize();//影像高度
BandNum = ds1->GetRasterCount();//影像波段数
//读取波段数据
GDALRasterBand *poBand;//不需要释放,只需要最后是否GDALDataset
double **Inputimg1 = new double*[BandNum];
 
int blockx = 512;//分块大小
int blocky = 512;
//分块处理.将影像分成很多blockx*blocky大小的块,通过循环对每一块进行处理
int nxNum = WidthAll/blockx+1;//计算列方向上块数
int nyNum = HeightAll/blocky+1;//计算行方向块数
 
int i,j,k;
int Width,Height;//块的实际宽和高
for (i = 0; i < nxNum; ++i) // 
{
	for ( j = 0; j < nyNum; ++j) 
	{
		//确定实际块大小
		Width = (WidthAll - (i+1)*blockx) > 0? blockx : (WidthAll - i * blockx);
		Height = (HeightAll - (j+1)*blocky) > 0? blocky : (HeightAll - j * blocky);
		//分块读取数据
		for ( k = 0; k < BandNum; ++k) 
		{
			Inputimg1[j] = new double[Width*Height];
			//注意,获取波段数从1开始计数!!
			poBand = ds1->GetRasterBand(k+1);
			//将数据写入Inputimg1[j],RasterIOd中,参数具体含义见RasterIO:
			poBand->RasterIO(GF_Read,0, 0, Width, Height,Inputimg1[j],Width,Height,GDT_Float64,0,0);
		}
/**
处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理
 
处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理
*/
	}	
}
 
//用完之后,关闭dataset即可,不需要释放GDALRasterBand
GDALClose(ds1);
	//写入影像
	//创建影像
	GDALDriver *poDriver;
	const char *pszFormat ="GTiff";
	poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
	if(poDriver == NULL)
		return;
 
	GDALDataset *OutDs;
	char **papszOptions = NULL;
	OutDs = poDriver->CreateCopy(output,ds1,FALSE,papszOptions,NULL,NULL);//创建与ds1相同的坐标信息的文件
 
        //OutDs = poDriver->Create(output,WidthAll,HeightAll,BandNum,GDT_Byte,papszOptions);//创建不带信息的文件,具体解释见下文Create函数和CreateCopy函数说明
	OutDs->FlushCache();
	//中间处理....
	byte **OutputImg = new byte*[BandNum];
	for(j=0;j<BandNum;j++)
	{
		OutputImg[j] = new byte[HeightAll*WidthAll];
	}
	//....
	//....
	//写入数据
	for(int j=0; j<BandNum; j++)
	{
		GDALRasterBand *poBandOut;
		poBandOut = OutDs->GetRasterBand(j+1);
		//GDT_Byte和byte **OutputImg 要对应!
		poBandOut->RasterIO(GF_Write,0, 0, WidthAll, HeightAll,OutputImg[j],WidthAll,HeightAll,GDT_Byte,0,0);
 
		//注意,需要加上这一句,将缓存数据才会真的写入到文件中
                //或者最后GDALClose(OutDs)才会写入数据,否则会是空数据
		poBandOut->FlushCache();
	}
        //关闭dataset
	GDALClose(OutDs);
        //关闭Driver
        GetGDALDriverManager()->DeregisterDriver(poDriver);
 

创建文件函数Create和CreateCopy说明

Create将创建不带坐标的新影像

CreateCopy将创建和设置copy影像相同大小、相同坐标系的影像

///从已有的dataset中创建
///@param pszFilename, 输出文件名
///@param poSrcDS, 已有的dataset
///@param bStrict, TRUE表示严格等价,一般设置为FALSE,表示拷贝副本用作编辑
///@param papszOptions, 参数设置,具体可以参考下面xml
///@param  pfnProgress 回调函数指针
///@param *pProgressData 传入回调函数的数据
GDALDataset * GDALDriver::CreateCopy 	(	const char * 	pszFilename, 
		GDALDataset * 	poSrcDS, 
		int 	bStrict, 
		char ** 	papszOptions, 
		GDALProgressFunc 	pfnProgress, 
		void * 	pProgressData	
}
///Create文件
///@param pszFilename, 输出文件名
///@param nXSize, 文件宽度
///@param nYSize, 文件高度
///@param nBands, 波段数
///@param eType, 数据类型
///@param papszOptions	 参数设置,具体可以设置的属性参考xml中的内容
///@return dataset
GDALDataset * GDALDriver::Create 	(	const char * 	pszFilename, 
		int 	nXSize, 
		int 	nYSize, 
		int 	nBands, 
		GDALDataType 	eType, 
		char ** 	papszOptions	 
		}
///设置:
    char **papszOptions = NULL;
    papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
    papszOptions = CSLSetNameValue( papszOptions, "COMPRESS", "PACKBITS" );
///...
///创建
    poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte, 
                                papszOptions );
///设置坐标、投影等
    double adfGeoTransform[6] = { 444720, 30, 0, 3751320, 0, -30 };
    OGRSpatialReference oSRS;
    char *pszSRS_WKT = NULL;
    GDALRasterBand *poBand;
    poDstDS->SetGeoTransform( adfGeoTransform );
 
    oSRS.SetUTM( 11, TRUE );
    oSRS.SetWellKnownGeogCS( "NAD27" );
    oSRS.exportToWkt( &pszSRS_WKT );
    poDstDS->SetProjection( pszSRS_WKT );
    CPLFree( pszSRS_WKT );                                                  

参数设置

 <CreationOptionList>
	  <Option name="COMPRESS" type="string-select">
		  <Value>NONE</Value> 
		  <Value>LZW</Value> 
		  <Value>PACKBITS</Value> 
		  <Value>JPEG</Value> 
		  <Value>CCITTRLE</Value> 
		  <Value>CCITTFAX3</Value> 
		  <Value>CCITTFAX4</Value> 
		  <Value>DEFLATE</Value> 
	  </Option>
	  <Option name="PREDICTOR" type="int" description="Predictor Type" /> 
	  <Option name="JPEG_QUALITY" type="int" description="JPEG quality 1-100" default="75" /> 
	  <Option name="ZLEVEL" type="int" description="DEFLATE compression level 1-9" default="6" /> 
	  <Option name="NBITS" type="int" description="BITS for sub-byte files (1-7), sub-uint16 (9-15), sub-uint32 (17-31)" /> 
	  <Option name="INTERLEAVE" type="string-select" default="PIXEL">
		  <Value>BAND</Value> 
		  <Value>PIXEL</Value> 
	  </Option>
	  <Option name="TILED" type="boolean" description="Switch to tiled format" /> 
	  <Option name="TFW" type="boolean" description="Write out world file" /> 
	  <Option name="RPB" type="boolean" description="Write out .RPB (RPC) file" /> 
	  <Option name="BLOCKXSIZE" type="int" description="Tile Width" /> 
	  <Option name="BLOCKYSIZE" type="int" description="Tile/Strip Height" /> 
	  <Option name="PHOTOMETRIC" type="string-select">
		  <Value>MINISBLACK</Value> 
		  <Value>MINISWHITE</Value> 
		  <Value>PALETTE</Value> 
		  <Value>RGB</Value> 
		  <Value>CMYK</Value> 
		  <Value>YCBCR</Value> 
		  <Value>CIELAB</Value> 
		  <Value>ICCLAB</Value> 
		  <Value>ITULAB</Value> 
	  </Option>
	  <Option name="SPARSE_OK" type="boolean" description="Can newly created files have missing blocks?" default="FALSE" /> 
	  <Option name="ALPHA" type="string-select" description="Mark first extrasample as being alpha">
		  <Value>NON-PREMULTIPLIED</Value> 
		  <Value>PREMULTIPLIED</Value> 
		  <Value>UNSPECIFIED</Value> 
		  <Value aliasOf="NON-PREMULTIPLIED">YES</Value> 
		  <Value aliasOf="UNSPECIFIED">NO</Value> 
	  </Option>
	  <Option name="PROFILE" type="string-select" default="GDALGeoTIFF">
		  <Value>GDALGeoTIFF</Value> 
		  <Value>GeoTIFF</Value> 
		  <Value>BASELINE</Value> 
	  </Option>
	  <Option name="PIXELTYPE" type="string-select">
		  <Value>DEFAULT</Value> 
		  <Value>SIGNEDBYTE</Value> 
	  </Option>
	  <Option name="BIGTIFF" type="string-select" description="Force creation of BigTIFF file">
		  <Value>YES</Value> 
		  <Value>NO</Value> 
		  <Value>IF_NEEDED</Value> 
		  <Value>IF_SAFER</Value> 
	  </Option>
	  <Option name="ENDIANNESS" type="string-select" default="NATIVE" description="Force endianness of created file. For DEBUG purpose mostly">
		  <Value>NATIVE</Value> 
		  <Value>INVERTED</Value> 
		  <Value>LITTLE</Value> 
		  <Value>BIG</Value> 
	  </Option>
	  <Option name="COPY_SRC_OVERVIEWS" type="boolean" default="NO" description="Force copy of overviews of source dataset (CreateCopy())" /> 
  </CreationOptionList>

/code

  • 程序设计/gdal/从小组框架更新的gdal.txt
  • 最后更改: 2022/09/28 06:24
  • 101.67.49.191