C#使用gdal分块读写32bit遥感影像等大文件栅格数据

 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成功");
        }

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值