gdal对32bit遥感影像的简单读写,8bit为byte,16bit为Int16。获取位深度的代码为
poDataset.GetRasterBand(1).DataType
基本过程就是将栅格数据先划分为512*512大小的小块,然后在行列上遍历每块的像元值,完成对应的io操作,最后进行拼接。
private static void setRasterSignInt32(string path, string tb_save_path)
{
string szFileName = path;
OSGeo.GDAL.Dataset poDataset; //GDAL数据集
OSGeo.GDAL.Gdal.AllRegister(); //注册
//读取数据并添加进dataset
poDataset = (OSGeo.GDAL.Dataset)OSGeo.GDAL.Gdal.Open(szFileName, 0);
if (poDataset == null)
{
MessageBox.Show("文件打开失败!!!");
return;
}
//创建新的影像数据
OSGeo.GDAL.Dataset poDatasetnew; //GDAL数据集
//在GDAL中创建影像,先需要明确待创建影像的格式,并获取到该影像格式的驱动,当前代码为tiff图像
OSGeo.GDAL.Driver driver = OSGeo.GDAL.Gdal.GetDriverByName("GTiff");
//string[] Options ={"BIGTIFF","IF_NEEDED"}; //配置图像信息
//调用Creat函数创建影像
//参数:保存位置;影像大小;影像层数;像元位深度;特定操作
poDatasetnew = driver.Create(tb_save_path, poDataset.RasterXSize, poDataset.RasterYSize, poDataset.RasterCount, OSGeo.GDAL.DataType.GDT_Int32, null);
//获取仿射变换的系数
double[] adfGeoTransform = new double[6];
poDataset.GetGeoTransform(adfGeoTransform);
//设置影像属性
poDatasetnew.SetGeoTransform(adfGeoTransform); //设置影像转换参数
poDatasetnew.SetProjection(poDataset.GetProjection()); //设置投影
//分块处理,节省内存,每块设置512*512大小。
Int32[] kuai = new Int32[512 * 512];//512空间的小块
Int32[] kuainew = new Int32[512 * 512];
Int32 pixel;
int xn = 0;//分块列数
int yn = 0;//分块行数
int tempx = 0;//当前块大小(最后的行列,大小不为512)
int tempy = 0;
//循环:遍历所有图层
for (int x = 1; x <= poDataset.RasterCount; x++)
{
//读取原始影像波段
OSGeo.GDAL.Band poBand1 = poDataset.GetRasterBand(x);
//循环:遍历当前图层的行
for (int m = 0; m < poDataset.RasterYSize / 512 + 1; m++)//y方向上循环,遍历行
{
if (yn == poDataset.RasterYSize / 512)//判断y是否为边界块
tempy = poDataset.RasterYSize % 512;
else
tempy = 512;
//遍历当前行的每一列
for (int n = 0; n < poDataset.RasterXSize / 512 + 1; n++)//x方向上循环,遍历每一块
{
if (xn == poDataset.RasterXSize / 512)//判断x是否为边界块
tempx = poDataset.RasterXSize % 512;
else
tempx = 512;
//参数:起始位置下标,左上角为0,0;像素大小;像元值数组;像元数组大小;x、y上的偏移量
poBand1.ReadRaster(xn * 512, yn * 512, tempx, tempy, kuai, tempx, tempy, 0, 0);
//遍历获取每个块的二维图像像元值
for (int i = 0; i < tempy; i++)
{
for (int j = 0; j < tempx; j++)
{
pixel = kuai[i * tempx + j];
kuainew[i * tempx + j] = pixel+0;//此处可更改像元值
}
//记录进度
int precess = (yn * 512 + i) * 100 / poDataset.RasterYSize; Console.WriteLine(precess);
}
//read与write参数一致
poDatasetnew.GetRasterBand(x).WriteRaster(xn * 512, yn * 512, tempx, tempy, kuainew, tempx, tempy, 0, 0);
poDatasetnew.GetRasterBand(x).FlushCache();
xn++;//列数+1
}
xn = 0;//列数重置
yn++;//行数+1
}
//行列移动结束,该波段完毕
yn = 0;
//当前写入波段结束,设置nodata
double nal;
int nal2;
poDataset.GetRasterBand(x).GetNoDataValue(out nal,out nal2);
poDatasetnew.GetRasterBand(x).SetNoDataValue(nal);
}
poDatasetnew.FlushCache();
MessageBox.Show("新建tif成功");
}