GDAL-影像按照波段進行切片(c#)

       public void SplitImagery(string pFilePath)
        {
            Dataset pDataset = Gdal.Open(pFilePath, Access.GA_ReadOnly);
            double[] pGeoTransform = new double[6];
            pDataset.GetGeoTransform(pGeoTransform);
            string pProjection = pDataset.GetProjectionRef();
            Driver pDriver = pDataset.GetDriver();
            int imgSizeX = pDataset.RasterXSize;
            int imgSizeY = pDataset.RasterYSize;
            int iBandCount = pDataset.RasterCount;
            string pDirectoryPath = System.IO.Path.GetDirectoryName(pFilePath);
            string pFileName = System.IO.Path.GetFileNameWithoutExtension(pFilePath);
            string pFileExtentsion = System.IO.Path.GetExtension(pFilePath);
            for (int iBand = 0; iBand < iBandCount; iBand++)
            {
                Band pBand = pDataset.GetRasterBand(iBand+1);
                const int block_size = 2048;//裁剪塊的大小
                int rowChunkIndex = 0;
                for (int yIndex = 0; yIndex < imgSizeY; yIndex += block_size)
                {
                    rowChunkIndex++;
                    int columnChunkIndex = 0;
                    for (int xIndex = 0; xIndex < imgSizeX; xIndex += block_size)
                    {
                        columnChunkIndex++;
                        string pSplitedFilePath = pDirectoryPath + "\\" + pFileName+"_"+ iBand + "_"+ rowChunkIndex+"_"+ columnChunkIndex + pFileExtentsion;
                        //定義兩個變量來保存分塊大小
                        int nXBK = block_size;//列
                        int nYBK = block_size;//行
                        //如果最下面和最右邊的塊不夠256,剩下多少讀取多少
                        if (yIndex + block_size > imgSizeY)     //最下面的剩餘塊
                            nYBK = imgSizeY - yIndex;
                        if (xIndex + block_size > imgSizeX)     //最右側的剩餘塊
                            nXBK = imgSizeX - xIndex;
                        //將圖像數據集讀到pBuf指針中
                        double[] buffer = new double[nXBK * nYBK];
                        pBand.ReadRaster(xIndex, yIndex, nXBK, nYBK, buffer, nXBK, nYBK, 0, 0);
                        double[] newBuffer = new double[nXBK * nYBK];
                        for (int i = 0; i < nXBK; i++)
                        {
                            for (int j = 0; j < nYBK; j++)
                            {
                                double val =  buffer[j * nXBK + i];

                                newBuffer[j * nXBK + i] = val;//分塊讀入計算,分塊寫入
                            }
                        }
                        //定義DataType爲64位會產生成倍的數據冗餘,但是調試安全
                        Dataset pSpliteDataset = pDriver.Create(pSplitedFilePath, nXBK, nYBK, 1, DataType.GDT_Float64, null);
                        //重新定義裁剪的影像的仿射變換
                        double[] pSpliteGeoTransform = new double[6];
                        pSpliteGeoTransform[0] = pGeoTransform[0] + pGeoTransform[1] * xIndex + pGeoTransform[2] * yIndex;
                        pSpliteGeoTransform[1] = pGeoTransform[1];
                        pSpliteGeoTransform[2] = pGeoTransform[2];
                        pSpliteGeoTransform[3] = pGeoTransform[3] + pGeoTransform[4] * xIndex + pGeoTransform[5] * yIndex;
                        pSpliteGeoTransform[4] = pGeoTransform[4];
                        pSpliteGeoTransform[5] = pGeoTransform[5];
                        pSpliteDataset.SetGeoTransform(pSpliteGeoTransform);
                        pSpliteDataset.SetProjection(pProjection);
                        pSpliteDataset.WriteRaster(0, 0, nXBK, nYBK, newBuffer, nXBK, nYBK, 1, new int[] { 1 }, 0, 0, 0);

                        buffer = null;
                        newBuffer = null;
                        pSpliteDataset.FlushCache();
                        GC.Collect();
                    }
                }
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章