Return GDAL dataset using GDAL MEM driver from raster.
1816 GDALDriverH drv = NULL;
1817 GDALDatasetH
ds = NULL;
1818 double gt[6] = {0.0};
1820 GDALDataType gdal_pt = GDT_Unknown;
1821 GDALRasterBandH
band;
1823 char *pszDataPointer;
1824 char szGDALOption[50];
1825 char *apszOptions[4];
1826 double nodata = 0.0;
1827 int allocBandNums = 0;
1828 int allocNodataValues = 0;
1833 uint32_t height = 0;
1838 assert(NULL != rtn_drv);
1839 assert(NULL != destroy_rtn_drv);
1841 *destroy_rtn_drv = 0;
1847 *destroy_rtn_drv = 1;
1849 drv = GDALGetDriverByName(
"MEM");
1851 rterror(
"rt_raster_to_gdal_mem: Could not load the MEM GDAL driver");
1857 if (*destroy_rtn_drv) {
1859 GDALDeregisterDriver(drv);
1870 rterror(
"rt_raster_to_gdal_mem: Could not create a GDALDataset to convert into");
1876 cplerr = GDALSetGeoTransform(
ds,
gt);
1877 if (cplerr != CE_None) {
1878 rterror(
"rt_raster_to_gdal_mem: Could not set geotransformation");
1884 if (NULL != srs && strlen(srs)) {
1887 rterror(
"rt_raster_to_gdal_mem: Could not convert srs to GDAL accepted format");
1892 cplerr = GDALSetProjection(
ds, _srs);
1894 if (cplerr != CE_None) {
1895 rterror(
"rt_raster_to_gdal_mem: Could not set projection");
1904 if (NULL != bandNums &&
count > 0) {
1905 for (i = 0; i <
count; i++) {
1906 if (bandNums[i] >= numBands) {
1907 rterror(
"rt_raster_to_gdal_mem: The band index %d is invalid", bandNums[i]);
1915 bandNums = (uint32_t *)
rtalloc(
sizeof(uint32_t) *
count);
1916 if (NULL == bandNums) {
1917 rterror(
"rt_raster_to_gdal_mem: Could not allocate memory for band indices");
1922 for (i = 0; i <
count; i++) bandNums[i] = i;
1926 if (NULL == excludeNodataValues) {
1927 excludeNodataValues = (
int *)
rtalloc(
sizeof(
int) *
count);
1928 if (NULL == excludeNodataValues) {
1929 rterror(
"rt_raster_to_gdal_mem: Could not allocate memory for NODATA flags");
1933 allocNodataValues = 1;
1934 for (i = 0; i <
count; i++) excludeNodataValues[i] = 1;
1938 for (i = 0; i <
count; i++) {
1940 if (NULL == rtband) {
1941 rterror(
"rt_raster_to_gdal_mem: Could not get requested band index %d", bandNums[i]);
1943 if (allocNodataValues)
rtdealloc(excludeNodataValues);
1950 if (gdal_pt == GDT_Unknown)
1951 rtwarn(
"rt_raster_to_gdal_mem: Unknown pixel type for band");
1960 pszDataPointer = (
char *)
rtalloc(20 *
sizeof (
char));
1961 sprintf(pszDataPointer,
"%p", pVoid);
1962 RASTER_DEBUGF(4,
"rt_raster_to_gdal_mem: szDatapointer is %p",
1965 if (strncasecmp(pszDataPointer,
"0x", 2) == 0)
1966 sprintf(szGDALOption,
"DATAPOINTER=%s", pszDataPointer);
1968 sprintf(szGDALOption,
"DATAPOINTER=0x%s", pszDataPointer);
1970 RASTER_DEBUG(3,
"Storing info for GDAL MEM raster band");
1972 apszOptions[0] = szGDALOption;
1973 apszOptions[1] = NULL;
1974 apszOptions[2] = NULL;
1975 apszOptions[3] = NULL;
1981 if (GDALAddBand(
ds, gdal_pt, apszOptions) == CE_Failure) {
1982 rterror(
"rt_raster_to_gdal_mem: Could not add GDAL raster band");
1994 if (GDALAddBand(
ds, gdal_pt, NULL) == CE_Failure) {
1995 rterror(
"rt_raster_to_gdal_mem: Could not add GDAL raster band");
1997 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2004 if (GDALGetRasterCount(
ds) != i + 1) {
2005 rterror(
"rt_raster_to_gdal_mem: Error creating GDAL MEM raster band");
2007 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2014 band = GDALGetRasterBand(
ds, i + 1);
2016 rterror(
"rt_raster_to_gdal_mem: Could not get GDAL band for additional processing");
2018 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2025 uint32_t nXBlocks, nYBlocks;
2026 int nXBlockSize, nYBlockSize;
2027 uint32_t iXBlock, iYBlock;
2028 int nXValid, nYValid;
2033 uint32_t valueslen = 0;
2034 int16_t *values = NULL;
2038 GDALGetBlockSize(
band, &nXBlockSize, &nYBlockSize);
2039 nXBlocks = (width + nXBlockSize - 1) / nXBlockSize;
2040 nYBlocks = (height + nYBlockSize - 1) / nYBlockSize;
2041 RASTER_DEBUGF(4,
"(nXBlockSize, nYBlockSize) = (%d, %d)", nXBlockSize, nYBlockSize);
2042 RASTER_DEBUGF(4,
"(nXBlocks, nYBlocks) = (%d, %d)", nXBlocks, nYBlocks);
2047 if (NULL == values) {
2048 rterror(
"rt_raster_to_gdal_mem: Could not allocate memory for GDAL band pixel values");
2050 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2055 for (iYBlock = 0; iYBlock < nYBlocks; iYBlock++) {
2056 for (iXBlock = 0; iXBlock < nXBlocks; iXBlock++) {
2057 memset(values, 0, valueslen);
2059 x = iXBlock * nXBlockSize;
2060 y = iYBlock * nYBlockSize;
2061 RASTER_DEBUGF(4,
"(iXBlock, iYBlock) = (%d, %d)", iXBlock, iYBlock);
2065 if ((iXBlock + 1) * nXBlockSize > width)
2066 nXValid = width - (iXBlock * nXBlockSize);
2068 nXValid = nXBlockSize;
2071 if ((iYBlock + 1) * nYBlockSize > height)
2072 nYValid = height - (iYBlock * nYBlockSize);
2074 nYValid = nYBlockSize;
2076 RASTER_DEBUGF(4,
"(nXValid, nYValid) = (%d, %d)", nXValid, nYValid);
2080 iYMax =
y + nYValid;
2081 iXMax =
x + nXValid;
2082 for (iY =
y; iY < iYMax; iY++) {
2083 for (iX =
x; iX < iXMax; iX++) {
2085 rterror(
"rt_raster_to_gdal_mem: Could not get pixel value to convert from 8BSI to 16BSI");
2088 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2102 values, nXValid, nYValid,
2106 rterror(
"rt_raster_to_gdal_mem: Could not write converted 8BSI to 16BSI values to GDAL band");
2109 if (allocNodataValues)
rtdealloc(excludeNodataValues);
2122 if (GDALSetRasterNoDataValue(
band, nodata) != CE_None)
2123 rtwarn(
"rt_raster_to_gdal_mem: Could not set nodata value for band");
2124 RASTER_DEBUGF(3,
"nodata value set to %f", GDALGetRasterNoDataValue(
band, NULL));
2127 #if POSTGIS_DEBUG_LEVEL > 3
2129 GDALRasterBandH _grb = NULL;
2135 _grb = GDALGetRasterBand(
ds, i + 1);
2136 GDALComputeRasterStatistics(_grb,
FALSE, &_min, &_max, &_mean, &_stddev, NULL, NULL);
2137 RASTER_DEBUGF(4,
"GDAL Band %d stats: %f, %f, %f, %f", i + 1, _min, _max, _mean, _stddev);
2147 if (allocNodataValues)
rtdealloc(excludeNodataValues);
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
#define RASTER_DEBUG(level, msg)
#define RASTER_DEBUGF(level, msg,...)
char * rt_util_gdal_convert_sr(const char *srs, int proj4)
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
GDALDataType rt_util_pixtype_to_gdal_datatype(rt_pixtype pt)
Convert rt_pixtype to GDALDataType.
void rtwarn(const char *fmt,...)
int16_t rt_util_clamp_to_16BSI(double value)
int rt_util_gdal_driver_registered(const char *drv)
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
void rtdealloc(void *mem)
void * rt_band_get_data(rt_band band)
Get pointer to raster band data.
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
uint16_t rt_raster_get_num_bands(rt_raster raster)
uint16_t rt_raster_get_height(rt_raster raster)
rt_band rt_raster_get_band(rt_raster raster, int n)
Return Nth band, or NULL if unavailable.
uint16_t rt_raster_get_width(rt_raster raster)
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.