本文整理汇总了C++中GDALRasterBand::ReadBlock方法的典型用法代码示例。如果您正苦于以下问题:C++ GDALRasterBand::ReadBlock方法的具体用法?C++ GDALRasterBand::ReadBlock怎么用?C++ GDALRasterBand::ReadBlock使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GDALRasterBand
的用法示例。
在下文中一共展示了GDALRasterBand::ReadBlock方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: IReadBlock
virtual CPLErr IReadBlock( int nBlockXOff, int nBlockYOff, void * pData )
{
return poUnderlyingBand->ReadBlock(nBlockXOff, nBlockYOff, pData);
}
示例2: ReadTIF
//.........这里部分代码省略.........
{
Create(iXSize, iYSize, 32);
}
else if (iRasterCount == 3 || bColorPalette)
{
Create(iXSize, iYSize, 24);
}
else if (iRasterCount == 1)
Create(iXSize, iYSize, 8);
// Read the data
#if LOG_IMAGE_LOAD
VTLOG("Reading the image data (%d x %d pixels)\n", iXSize, iYSize);
#endif
int x, y;
int ixBlock, iyBlock;
int nxValid, nyValid;
int iY, iX;
RGBi rgb;
RGBAi rgba;
if (iRasterCount == 1)
{
GDALColorEntry Ent;
for (iyBlock = 0; iyBlock < nyBlocks; iyBlock++)
{
if (progress_callback != NULL)
progress_callback(iyBlock * 100 / nyBlocks);
y = iyBlock * yBlockSize;
for (ixBlock = 0; ixBlock < nxBlocks; ixBlock++)
{
x = ixBlock * xBlockSize;
Err = pBand->ReadBlock(ixBlock, iyBlock, pScanline);
if (Err != CE_None)
throw "Problem reading the image data.";
// Compute the portion of the block that is valid
// for partial edge blocks.
if ((ixBlock+1) * xBlockSize > iXSize)
nxValid = iXSize - ixBlock * xBlockSize;
else
nxValid = xBlockSize;
if( (iyBlock+1) * yBlockSize > iYSize)
nyValid = iYSize - iyBlock * yBlockSize;
else
nyValid = yBlockSize;
for( iY = 0; iY < nyValid; iY++ )
{
for( iX = 0; iX < nxValid; iX++ )
{
if (bColorPalette)
{
pTable->GetColorEntryAsRGB(pScanline[iY * xBlockSize + iX], &Ent);
rgb.r = (uchar) Ent.c1;
rgb.g = (uchar) Ent.c2;
rgb.b = (uchar) Ent.c3;
SetPixel24(x + iX, y + iY, rgb);
}
else
SetPixel8(x + iX, y + iY, pScanline[iY * xBlockSize + iX]);
}
}
}
示例3: load
bool DEM::load(const std::string& filename) {
GDALAllRegister();
GDALDataset* poDS;
poDS = (GDALDataset*)GDALOpenEx(filename.c_str(), GDAL_OF_RASTER, NULL, NULL, NULL);
if (poDS == NULL) return false;
double adfGeoTransform[6];
if (poDS->GetGeoTransform(adfGeoTransform) == CE_None) {
origin.x = adfGeoTransform[0];
origin.y = adfGeoTransform[3];
pixelSize.x = adfGeoTransform[1];
pixelSize.y = abs(adfGeoTransform[5]);
}
width = poDS->GetRasterXSize() * pixelSize.x;
height = poDS->GetRasterYSize() * pixelSize.y;
data.resize(width * height);
min_val = std::numeric_limits<float>::max();
max_val = -std::numeric_limits<float>::max();
// bandが存在しない場合は、エラー
if (poDS->GetRasterCount() == 0) return false;
// 最初のbandのみを読み込む。複数bandは未対応
GDALRasterBand* poBand = poDS->GetRasterBand(1);
int nBlockXSize, nBlockYSize;
poBand->GetBlockSize(&nBlockXSize, &nBlockYSize);
//printf("Block=%dx%d Type=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName(poBand->GetColorInterpretation()));
// 最低、最高の値を取得
int bGotMin, bGotMax;
double adfMinMax[2];
adfMinMax[0] = poBand->GetMinimum(&bGotMin);
adfMinMax[1] = poBand->GetMaximum(&bGotMax);
if (!(bGotMin && bGotMax)) GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
//printf("Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1]);
min_val = adfMinMax[0];
max_val = adfMinMax[1];
//int nXSize = poBand->GetXSize();
//int nYSize = poBand->GetYSize();
int nXBlocks = (poBand->GetXSize() + nBlockXSize - 1) / nBlockXSize;
int nYBlocks = (poBand->GetYSize() + nBlockYSize - 1) / nBlockYSize;
float *pData = (float *)CPLMalloc(sizeof(float*) * nBlockXSize * nBlockYSize);
for (int iYBlock = 0; iYBlock < nYBlocks; iYBlock++) {
for (int iXBlock = 0; iXBlock < nXBlocks; iXBlock++) {
int nXValid, nYValid;
poBand->ReadBlock(iXBlock, iYBlock, pData);
// Compute the portion of the block that is valid
// for partial edge blocks.
if ((iXBlock + 1) * nBlockXSize > poBand->GetXSize())
nXValid = poBand->GetXSize() - iXBlock * nBlockXSize;
else
nXValid = nBlockXSize;
if ((iYBlock + 1) * nBlockYSize > poBand->GetYSize())
nYValid = poBand->GetYSize() - iYBlock * nBlockYSize;
else
nYValid = nBlockYSize;
for (int iY = 0; iY < nYValid; iY++) {
for (int iX = 0; iX < nXValid; iX++) {
float val;
if (pData[iY * nBlockXSize + iX] > max_val) {
val = max_val;
}
else if (pData[iY * nBlockXSize + iX] < min_val) {
val = min_val;
}
else {
val = pData[iY * nBlockXSize + iX];
}
for (int y = 0; y < pixelSize.y; ++y) {
for (int x = 0; x < pixelSize.x; ++x) {
data[((iYBlock * nBlockYSize + iY) * pixelSize.y + y) * width + (iXBlock * nBlockXSize + iX) * pixelSize.x + x] = val;
}
}
}
}
}
}
GDALClose(poDS);
return true;
}