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();
}
}
}
}
GDAL-影像按照波段進行切片(c#)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.