#include <stdarg.h> /* for va_list, va_start etc */
#include <string.h> /* for memcpy and strlen */
#include <assert.h>
-#include <float.h> /* for FLT_EPSILON and float type limits */
-#include <limits.h> /* for integer type limits */
#include <time.h> /* for time */
#include "rt_api.h"
int x;
int y;
double value;
-
- int nXBlocks, nYBlocks;
- int nXBlockSize, nYBlockSize;
- int iXBlock, iYBlock;
- int nXValid, nYValid;
- int iY, iX;
double *values = NULL;
assert(NULL != ds);
}
band = rt_raster_get_band(rast, idx);
- /* this makes use of GDAL's "natural" blocks */
- GDALGetBlockSize(gdband, &nXBlockSize, &nYBlockSize);
- nXBlocks = (width + nXBlockSize - 1) / nXBlockSize;
- nYBlocks = (height + nYBlockSize - 1) / nYBlockSize;
- RASTER_DEBUGF(4, "(nXBlockSize, nYBlockSize) = (%d, %d)", nXBlockSize, nYBlockSize);
- RASTER_DEBUGF(4, "(nXBlocks, nYBlocks) = (%d, %d)", nXBlocks, nYBlocks);
-
- for (iYBlock = 0; iYBlock < nYBlocks; iYBlock++) { /* row */
- for (iXBlock = 0; iXBlock < nXBlocks; iXBlock++) { /* column */
- x = iXBlock * nXBlockSize;
- y = iYBlock * nYBlockSize;
- RASTER_DEBUGF(4, "(iXBlock, iYBlock) = (%d, %d)", iXBlock, iYBlock);
- RASTER_DEBUGF(4, "(x, y) = (%d, %d)", x, y);
-
- if ((iXBlock + 1) * nXBlockSize > width)
- nXValid = width - (iXBlock * nXBlockSize);
- else
- nXValid = nXBlockSize;
+ /* use rows */
+ values = rtalloc(sizeof(double) * width);
+ for (y = 0; y < height; y++) {
+ cplerr = GDALRasterIO(
+ gdband, GF_Read,
+ 0, y,
+ width, 1,
+ values, width, 1,
+ GDT_Float64,
+ 0, 0
+ );
+ if (cplerr != CE_None) {
+ rterror("rt_raster_from_gdal_dataset: Unable to get data from GDAL band");
+ rtdealloc(values);
+ rt_raster_destroy(rast);
+ return NULL;
+ }
- if ((iYBlock + 1) * nYBlockSize > height)
- nYValid = height - (iYBlock * nYBlockSize);
- else
- nYValid = nYBlockSize;
-
- values = rtalloc(nXValid * nYValid * sizeof(double));
- /* values is ordered from left to right, top to bottom */
- cplerr = GDALRasterIO(
- gdband, GF_Read,
- x, y,
- nXValid, nYValid,
- values, nXValid, nYValid,
- GDT_Float64,
- 0, 0
- );
- if (cplerr != CE_None) {
- rterror("rt_raster_from_gdal_dataset: Unable to get data from GDAL band");
+ for (x = 0; x < width; x++) {
+ value = values[x];
+ if (rt_band_set_pixel(band, x, y, value) < 0) {
+ rterror("rt_raster_from_gdal_dataset: Unable to save data from GDAL band");
rtdealloc(values);
rt_raster_destroy(rast);
return NULL;
}
-
- for (iY = 0; iY < nYValid; iY++) {
- for (iX = 0; iX < nXValid; iX++) {
- x = iX + (nXBlockSize * iXBlock);
- y = iY + (nYBlockSize * iYBlock);
- value = values[iX + iY * nXBlockSize];
-
- RASTER_DEBUGF(5, "(x, y, value) = (%d, %d, %f)", x, y, value);
-
- if (rt_band_set_pixel(band, x, y, value) < 0) {
- rterror("rt_raster_from_gdal_dataset: Unable to save data from GDAL band");
- rtdealloc(values);
- rt_raster_destroy(rast);
- return NULL;
- }
- }
- }
-
- rtdealloc(values);
}
}
+ rtdealloc(values);
}
return rast;