GDAL C ++ RasterIO по блокам

Я новичок в gdal и c ++ и пытаюсь создать функцию, которая читает растр по блокам (используя RasterIO, а не ReadBlock), что-то делает со значениями и записывает результат в новый растровый файл

Я получаю ошибку:

Необработанное исключение в 0x00007FFDFB517BC4 (gdal201.dll) в Test.exe:
0xC0000005: место записи нарушения прав доступа 0x00000230E2593000 в
line rasterBand-> RasterIO (GDALRWFlag :: GF_Read, j * readCols, i *
readRows, readCols, readRows, rasterBlock, readCols, readRows,
GDALDataType :: GDT_CFloat32, 0, 0)

У меня есть очень похожая функция, которая работает нормально, но она читает значения пикселей по строкам

Любая помощь приветствуется

Функция ниже

Спасибо

#include <iostream>
#include "gdal_priv.h"using namespace std;

void SlopeBlock()
{
int readRows = 2048;
int readCols = 2048;
int nBlockXSize;
int nBlockYSize;
int rowOff = 0;
int colOff = 0;
int nRows = 0;
int nCols = 0;
double noData = -9999;

GDALAllRegister();

GDALDataset* dem = (GDALDataset*)GDALOpen("path/EUD_CP-DEMS_4500025000-AA.tif", GA_ReadOnly);

GDALDriver *gTIF = GetGDALDriverManager()->GetDriverByName(dem->GetDriverName());

double geoTransform[6];
dem->GetGeoTransform(geoTransform);

GDALRasterBand* rasterBand = dem->GetRasterBand(1);

nCols = rasterBand->GetXSize();
nRows = rasterBand->GetYSize();
noData = rasterBand->GetNoDataValue();

//rasterBand->GetBlockSize(&nBlockXSize, &nBlockYSize);

int nXBlocks = (rasterBand->GetXSize() + readCols - 1) / readCols;
int nYBlocks = (rasterBand->GetYSize() + readRows - 1) / readRows;

cout << nYBlocks << "___" << nXBlocks << "\n";//Slope
GDALDataset *slope = gTIF->Create("path/slopeBlock.tif", nCols, nRows, 1, GDT_Float32, NULL);
slope->SetGeoTransform(geoTransform);

for (int i = 0; i < nYBlocks; i++)
{
for (int j = 0; j < nXBlocks; j++)
{
float* rasterBlock = (float*)CPLMalloc(readCols*readRows*sizeof(float));
float* rasterBlockOut = (float*)CPLMalloc(readCols*readRows*sizeof(float));

if (rasterBand != nullptr)
rasterBand->RasterIO(GDALRWFlag::GF_Read, j * readCols, i * readRows, readCols, readRows, rasterBlock, readCols, readRows, GDALDataType::GDT_CFloat32, 0, 0);

//Not sure if is working
for (int jb = 0; jb < readCols; jb++)
{
if (rasterBlock[jb] == noData)
{
rasterBlockOut[jb] = noData;
}
else
{
rasterBlockOut[jb] = rasterBlock[jb];
}
}

slope->GetRasterBand(1)->RasterIO(GDALRWFlag::GF_Write, j * readCols, i * readRows, readCols, readRows, rasterBlockOut, readCols, readRows, GDALDataType::GDT_CFloat32, 0, 0);

CPLFree(rasterBlock);
CPLFree(rasterBlockOut);
}
}

GDALClose(dem);
GDALClose(slope);

}

1

Решение

Это может не быть причиной сбоя, но вы запрашиваете блок 2048 * 2048, даже если ваше изображение меньше. Этот код должен работать только для изображений, кратных 2048 размеру.

Вы должны сделать что-то вроде:

nXSize = min(readCols, rasterBand->GetXSize() - j * readCols);
nYSize = min(readRows, rasterBand->GetYSize() - i * readRows);

rasterBand->RasterIO(GDALRWFlag::GF_Read, j * readCols, i * readRows,
nXSize, nYSize, rasterBlock, nXSize, nYSize, GDALDataType::GDT_CFloat32, 0, 0);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]