static void test_raster_replace_band() { rt_raster raster; rt_band band; rt_band rband; void* mem; size_t datasize; uint16_t width; uint16_t height; double nodata; raster = rt_raster_new(10, 10); CU_ASSERT(raster != NULL); /* or we're out of virtual memory */ band = cu_add_band(raster, PT_8BUI, 0, 0); CU_ASSERT(band != NULL); band = cu_add_band(raster, PT_8BUI, 1, 255); CU_ASSERT(band != NULL); width = rt_raster_get_width(raster); height = rt_raster_get_height(raster); datasize = rt_pixtype_size(PT_8BUI) * width * height; mem = rtalloc(datasize); band = rt_band_new_inline(width, height, PT_8BUI, 1, 1, mem); CU_ASSERT(band != NULL); rt_band_set_ownsdata_flag(band, 1); rband = rt_raster_replace_band(raster, band, 0); CU_ASSERT(rband != NULL); rt_band_get_nodata(rt_raster_get_band(raster, 0), &nodata); CU_ASSERT_DOUBLE_EQUAL(nodata, 1, DBL_EPSILON); rt_band_destroy(rband); cu_free_raster(raster); }
static void test_gdal_warp() { rt_pixtype pixtype = PT_64BF; rt_band band = NULL; rt_raster raster; rt_raster rast; uint32_t x; uint32_t width = 100; uint32_t y; uint32_t height = 100; double value = 0; char src_srs[] = "PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6370997,0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Lambert_Azimuthal_Equal_Area\"],PARAMETER[\"latitude_of_center\",45],PARAMETER[\"longitude_of_center\",-100],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AUTHORITY[\"EPSG\",\"2163\"]]"; char dst_srs[] = "PROJCS[\"NAD83 / California Albers\",GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],AUTHORITY[\"EPSG\",\"6269\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4269\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Albers_Conic_Equal_Area\"],PARAMETER[\"standard_parallel_1\",34],PARAMETER[\"standard_parallel_2\",40.5],PARAMETER[\"latitude_of_center\",0],PARAMETER[\"longitude_of_center\",-120],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",-4000000],AUTHORITY[\"EPSG\",\"3310\"],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH]]"; raster = rt_raster_new(width, height); CU_ASSERT(raster != NULL); /* or we're out of virtual memory */ band = cu_add_band(raster, pixtype, 1, 0); CU_ASSERT(band != NULL); rt_raster_set_offsets(raster, -500000, 600000); rt_raster_set_scale(raster, 1000, -1000); for (x = 0; x < width; x++) { for (y = 0; y < height; y++) { rt_band_set_pixel(band, x, y, (((double) x * y) + (x + y) + (x + y * x)) / (x + y + 1), NULL); } } rast = rt_raster_gdal_warp( raster, src_srs, dst_srs, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, GRA_NearestNeighbour, -1 ); CU_ASSERT(rast != NULL); CU_ASSERT_EQUAL(rt_raster_get_width(rast), 122); CU_ASSERT_EQUAL(rt_raster_get_height(rast), 116); CU_ASSERT_NOT_EQUAL(rt_raster_get_num_bands(rast), 0); band = rt_raster_get_band(rast, 0); CU_ASSERT(band != NULL); CU_ASSERT(rt_band_get_hasnodata_flag(band)); rt_band_get_nodata(band, &value); CU_ASSERT_DOUBLE_EQUAL(value, 0., DBL_EPSILON); CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, NULL), ES_NONE); CU_ASSERT_DOUBLE_EQUAL(value, 0., DBL_EPSILON); cu_free_raster(rast); cu_free_raster(raster); }
static int _rti_iterator_arg_populate( _rti_iterator_arg _param, rt_iterator itrset, uint16_t itrcount, uint16_t distancex, uint16_t distancey, int *allnull, int *allempty ) { int i = 0; int hasband = 0; _param->count = itrcount; _param->distance.x = distancex; _param->distance.y = distancey; _param->dimension.columns = distancex * 2 + 1; _param->dimension.rows = distancey * 2 + 1; /* allocate memory for children */ _param->raster = rtalloc(sizeof(rt_raster) * itrcount); _param->isempty = rtalloc(sizeof(int) * itrcount); _param->width = rtalloc(sizeof(int) * itrcount); _param->height = rtalloc(sizeof(int) * itrcount); _param->offset = rtalloc(sizeof(double *) * itrcount); _param->band.rtband = rtalloc(sizeof(rt_band) * itrcount); _param->band.hasnodata = rtalloc(sizeof(int) * itrcount); _param->band.isnodata = rtalloc(sizeof(int) * itrcount); _param->band.nodataval = rtalloc(sizeof(double) * itrcount); _param->band.minval = rtalloc(sizeof(double) * itrcount); if ( _param->raster == NULL || _param->isempty == NULL || _param->width == NULL || _param->height == NULL || _param->offset == NULL || _param->band.rtband == NULL || _param->band.hasnodata == NULL || _param->band.isnodata == NULL || _param->band.nodataval == NULL || _param->band.minval == NULL ) { rterror("_rti_iterator_arg_populate: Could not allocate memory for children of _rti_iterator_arg"); return 0; } *allnull = 0; *allempty = 0; /* check input rasters not empty, band # is valid copy raster pointers and set flags */ for (i = 0; i < itrcount; i++) { /* initialize elements */ _param->raster[i] = NULL; _param->isempty[i] = 0; _param->width[i] = 0; _param->height[i] = 0; _param->offset[i] = NULL; _param->band.rtband[i] = NULL; _param->band.hasnodata[i] = 0; _param->band.isnodata[i] = 0; _param->band.nodataval[i] = 0; _param->band.minval[i] = 0; /* set isempty */ if (itrset[i].raster == NULL) { _param->isempty[i] = 1; (*allnull)++; (*allempty)++; continue; } else if (rt_raster_is_empty(itrset[i].raster)) { _param->isempty[i] = 1; (*allempty)++; continue; } /* check band number */ hasband = rt_raster_has_band(itrset[i].raster, itrset[i].nband); if (!hasband) { if (!itrset[i].nbnodata) { rterror("_rti_iterator_arg_populate: Band %d not found for raster %d", itrset[i].nband, i); return 0; } else { RASTER_DEBUGF(4, "Band %d not found for raster %d. Using NODATA", itrset[i].nband, i); } } _param->raster[i] = itrset[i].raster; if (hasband) { _param->band.rtband[i] = rt_raster_get_band(itrset[i].raster, itrset[i].nband); if (_param->band.rtband[i] == NULL) { rterror("_rti_iterator_arg_populate: Could not get band %d for raster %d", itrset[i].nband, i); return 0; } /* hasnodata */ _param->band.hasnodata[i] = rt_band_get_hasnodata_flag(_param->band.rtband[i]); /* hasnodata = TRUE */ if (_param->band.hasnodata[i]) { /* nodataval */ rt_band_get_nodata(_param->band.rtband[i], &(_param->band.nodataval[i])); /* isnodata */ _param->band.isnodata[i] = rt_band_get_isnodata_flag(_param->band.rtband[i]); } /* hasnodata = FALSE */ else { /* minval */ _param->band.minval[i] = rt_band_get_min_value(_param->band.rtband[i]); } } /* width, height */ _param->width[i] = rt_raster_get_width(_param->raster[i]); _param->height[i] = rt_raster_get_height(_param->raster[i]); /* init offset */ _param->offset[i] = rtalloc(sizeof(double) * 2); if (_param->offset[i] == NULL) { rterror("_rti_iterator_arg_populate: Could not allocate memory for offsets"); return 0; } } return 1; }
/** * Returns new band with values reclassified * * @param srcband : the band who's values will be reclassified * @param pixtype : pixel type of the new band * @param hasnodata : indicates if the band has a nodata value * @param nodataval : nodata value for the new band * @param exprset : array of rt_reclassexpr structs * @param exprcount : number of elements in expr * * @return a new rt_band or NULL on error */ rt_band rt_band_reclass( rt_band srcband, rt_pixtype pixtype, uint32_t hasnodata, double nodataval, rt_reclassexpr *exprset, int exprcount ) { rt_band band = NULL; uint32_t width = 0; uint32_t height = 0; int numval = 0; int memsize = 0; void *mem = NULL; uint32_t src_hasnodata = 0; double src_nodataval = 0.0; int isnodata = 0; int rtn; uint32_t x; uint32_t y; int i; double or = 0; double ov = 0; double nr = 0; double nv = 0; int do_nv = 0; rt_reclassexpr expr = NULL; assert(NULL != srcband); assert(NULL != exprset && exprcount > 0); RASTER_DEBUGF(4, "exprcount = %d", exprcount); RASTER_DEBUGF(4, "exprset @ %p", exprset); /* source nodata */ src_hasnodata = rt_band_get_hasnodata_flag(srcband); if (src_hasnodata) rt_band_get_nodata(srcband, &src_nodataval); /* size of memory block to allocate */ width = rt_band_get_width(srcband); height = rt_band_get_height(srcband); numval = width * height; memsize = rt_pixtype_size(pixtype) * numval; mem = (int *) rtalloc(memsize); if (!mem) { rterror("rt_band_reclass: Could not allocate memory for band"); return 0; } /* initialize to zero */ if (!hasnodata) { memset(mem, 0, memsize); } /* initialize to nodataval */ else { int32_t checkvalint = 0; uint32_t checkvaluint = 0; double checkvaldouble = 0; float checkvalfloat = 0; switch (pixtype) { case PT_1BB: { uint8_t *ptr = mem; uint8_t clamped_initval = rt_util_clamp_to_1BB(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_2BUI: { uint8_t *ptr = mem; uint8_t clamped_initval = rt_util_clamp_to_2BUI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_4BUI: { uint8_t *ptr = mem; uint8_t clamped_initval = rt_util_clamp_to_4BUI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_8BSI: { int8_t *ptr = mem; int8_t clamped_initval = rt_util_clamp_to_8BSI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_8BUI: { uint8_t *ptr = mem; uint8_t clamped_initval = rt_util_clamp_to_8BUI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_16BSI: { int16_t *ptr = mem; int16_t clamped_initval = rt_util_clamp_to_16BSI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_16BUI: { uint16_t *ptr = mem; uint16_t clamped_initval = rt_util_clamp_to_16BUI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_32BSI: { int32_t *ptr = mem; int32_t clamped_initval = rt_util_clamp_to_32BSI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalint = ptr[0]; break; } case PT_32BUI: { uint32_t *ptr = mem; uint32_t clamped_initval = rt_util_clamp_to_32BUI(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvaluint = ptr[0]; break; } case PT_32BF: { float *ptr = mem; float clamped_initval = rt_util_clamp_to_32F(nodataval); for (i = 0; i < numval; i++) ptr[i] = clamped_initval; checkvalfloat = ptr[0]; break; } case PT_64BF: { double *ptr = mem; for (i = 0; i < numval; i++) ptr[i] = nodataval; checkvaldouble = ptr[0]; break; } default: { rterror("rt_band_reclass: Unknown pixeltype %d", pixtype); rtdealloc(mem); return 0; } } /* Overflow checking */ rt_util_dbl_trunc_warning( nodataval, checkvalint, checkvaluint, checkvalfloat, checkvaldouble, pixtype ); } RASTER_DEBUGF(3, "rt_band_reclass: width = %d height = %d", width, height); band = rt_band_new_inline(width, height, pixtype, hasnodata, nodataval, mem); if (!band) { rterror("rt_band_reclass: Could not create new band"); rtdealloc(mem); return 0; } rt_band_set_ownsdata_flag(band, 1); /* we DO own this data!!! */ RASTER_DEBUGF(3, "rt_band_reclass: new band @ %p", band); for (x = 0; x < width; x++) { for (y = 0; y < height; y++) { rtn = rt_band_get_pixel(srcband, x, y, &ov, &isnodata); /* error getting value, skip */ if (rtn != ES_NONE) { RASTER_DEBUGF(3, "Cannot get value at %d, %d", x, y); continue; } RASTER_DEBUGF(4, "(x, y, ov, isnodata) = (%d, %d, %f, %d)", x, y, ov, isnodata); do { do_nv = 0; /* no data*/ if (hasnodata && isnodata) { do_nv = 1; break; } for (i = 0; i < exprcount; i++) { expr = exprset[i]; /* ov matches min and max*/ if ( FLT_EQ(expr->src.min, ov) && FLT_EQ(expr->src.max, ov) ) { do_nv = 1; break; } /* process min */ if (( expr->src.exc_min && ( expr->src.min > ov || FLT_EQ(expr->src.min, ov) )) || ( expr->src.inc_min && ( expr->src.min < ov || FLT_EQ(expr->src.min, ov) )) || ( expr->src.min < ov )) { /* process max */ if (( expr->src.exc_max && ( ov > expr->src.max || FLT_EQ(expr->src.max, ov) )) || ( expr->src.inc_max && ( ov < expr->src.max || FLT_EQ(expr->src.max, ov) )) || ( ov < expr->src.max )) { do_nv = 1; break; } } } } while (0); /* no expression matched, do not continue */ if (!do_nv) continue; RASTER_DEBUGF(3, "Using exprset[%d] unless NODATA", i); /* converting a value from one range to another range OldRange = (OldMax - OldMin) NewRange = (NewMax - NewMin) NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin */ /* NODATA */ if (hasnodata && isnodata) { nv = nodataval; } /* "src" min and max is the same, prevent division by zero set nv to "dst" min, which should be the same as "dst" max */ else if (FLT_EQ(expr->src.max, expr->src.min)) { nv = expr->dst.min; } else { or = expr->src.max - expr->src.min; nr = expr->dst.max - expr->dst.min; nv = (((ov - expr->src.min) * nr) / or) + expr->dst.min; /* if dst range is from high to low */ if (expr->dst.min > expr->dst.max) { if (nv > expr->dst.min) nv = expr->dst.min; else if (nv < expr->dst.max) nv = expr->dst.max; } /* if dst range is from low to high */ else { if (nv < expr->dst.min) nv = expr->dst.min; else if (nv > expr->dst.max) nv = expr->dst.max; } } /* round the value for integers */ switch (pixtype) { case PT_1BB: case PT_2BUI: case PT_4BUI: case PT_8BSI: case PT_8BUI: case PT_16BSI: case PT_16BUI: case PT_32BSI: case PT_32BUI: nv = round(nv); break; default: break; } RASTER_DEBUGF(4, "(%d, %d) ov: %f or: %f - %f nr: %f - %f nv: %f" , x , y , ov , (NULL != expr) ? expr->src.min : 0 , (NULL != expr) ? expr->src.max : 0 , (NULL != expr) ? expr->dst.min : 0 , (NULL != expr) ? expr->dst.max : 0 , nv ); if (rt_band_set_pixel(band, x, y, nv, NULL) != ES_NONE) { rterror("rt_band_reclass: Could not assign value to new band"); rt_band_destroy(band); rtdealloc(mem); return 0; } expr = NULL; } } return band; }
/** * Returns a new raster with up to four 8BUI bands (RGBA) from * applying a colormap to the user-specified band of the * input raster. * * @param raster: input raster * @param nband: 0-based index of the band to process with colormap * @param colormap: rt_colormap object of colormap to apply to band * * @return new raster or NULL on error */ rt_raster rt_raster_colormap( rt_raster raster, int nband, rt_colormap colormap ) { _rti_colormap_arg arg = NULL; rt_raster rtnraster = NULL; rt_band band = NULL; int i = 0; int j = 0; int k = 0; assert(colormap != NULL); /* empty raster */ if (rt_raster_is_empty(raster)) return NULL; /* no colormap entries */ if (colormap->nentry < 1) { rterror("rt_raster_colormap: colormap must have at least one entry"); return NULL; } /* nband is valid */ if (!rt_raster_has_band(raster, nband)) { rterror("rt_raster_colormap: raster has no band at index %d", nband); return NULL; } band = rt_raster_get_band(raster, nband); if (band == NULL) { rterror("rt_raster_colormap: Could not get band at index %d", nband); return NULL; } /* init internal variables */ arg = _rti_colormap_arg_init(raster); if (arg == NULL) { rterror("rt_raster_colormap: Could not initialize internal variables"); return NULL; } /* handle NODATA */ if (rt_band_get_hasnodata_flag(band)) { arg->hasnodata = 1; rt_band_get_nodata(band, &(arg->nodataval)); } /* # of colors */ if (colormap->ncolor < 1) { rterror("rt_raster_colormap: At least one color must be provided"); _rti_colormap_arg_destroy(arg); return NULL; } else if (colormap->ncolor > 4) { rtinfo("More than four colors indicated. Using only the first four colors"); colormap->ncolor = 4; } /* find non-NODATA entries */ arg->npos = 0; arg->pos = rtalloc(sizeof(uint16_t) * colormap->nentry); if (arg->pos == NULL) { rterror("rt_raster_colormap: Could not allocate memory for valid entries"); _rti_colormap_arg_destroy(arg); return NULL; } for (i = 0, j = 0; i < colormap->nentry; i++) { /* special handling for NODATA entries */ if (colormap->entry[i].isnodata) { /* first NODATA entry found, use it */ if (arg->nodataentry == NULL) arg->nodataentry = &(colormap->entry[i]); else rtwarn("More than one colormap entry found for NODATA value. Only using first NOTDATA entry"); continue; } (arg->npos)++; arg->pos[j++] = i; } /* INTERPOLATE and only one non-NODATA entry */ if (colormap->method == CM_INTERPOLATE && arg->npos < 2) { rtinfo("Method INTERPOLATE requires at least two non-NODATA colormap entries. Using NEAREST instead"); colormap->method = CM_NEAREST; } /* NODATA entry but band has no NODATA value */ if (!arg->hasnodata && arg->nodataentry != NULL) { rtinfo("Band at index %d has no NODATA value. Ignoring NODATA entry", nband); arg->nodataentry = NULL; } /* allocate expr */ arg->nexpr = arg->npos; /* INTERPOLATE needs one less than the number of entries */ if (colormap->method == CM_INTERPOLATE) arg->nexpr -= 1; /* EXACT requires a no matching expression */ else if (colormap->method == CM_EXACT) arg->nexpr += 1; /* NODATA entry exists, add expression */ if (arg->nodataentry != NULL) arg->nexpr += 1; arg->expr = rtalloc(sizeof(rt_reclassexpr) * arg->nexpr); if (arg->expr == NULL) { rterror("rt_raster_colormap: Could not allocate memory for reclass expressions"); _rti_colormap_arg_destroy(arg); return NULL; } RASTER_DEBUGF(4, "nexpr = %d", arg->nexpr); RASTER_DEBUGF(4, "expr @ %p", arg->expr); for (i = 0; i < arg->nexpr; i++) { arg->expr[i] = rtalloc(sizeof(struct rt_reclassexpr_t)); if (arg->expr[i] == NULL) { rterror("rt_raster_colormap: Could not allocate memory for reclass expression"); _rti_colormap_arg_destroy(arg); return NULL; } } /* reclassify bands */ /* by # of colors */ for (i = 0; i < colormap->ncolor; i++) { k = 0; /* handle NODATA entry first */ if (arg->nodataentry != NULL) { arg->expr[k]->src.min = arg->nodataentry->value; arg->expr[k]->src.max = arg->nodataentry->value; arg->expr[k]->src.inc_min = 1; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_min = 0; arg->expr[k]->src.exc_max = 0; arg->expr[k]->dst.min = arg->nodataentry->color[i]; arg->expr[k]->dst.max = arg->nodataentry->color[i]; arg->expr[k]->dst.inc_min = 1; arg->expr[k]->dst.inc_max = 1; arg->expr[k]->dst.exc_min = 0; arg->expr[k]->dst.exc_max = 0; RASTER_DEBUGF(4, "NODATA expr[%d]->src (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->src.min, arg->expr[k]->src.max, arg->expr[k]->src.inc_min, arg->expr[k]->src.inc_max, arg->expr[k]->src.exc_min, arg->expr[k]->src.exc_max ); RASTER_DEBUGF(4, "NODATA expr[%d]->dst (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->dst.min, arg->expr[k]->dst.max, arg->expr[k]->dst.inc_min, arg->expr[k]->dst.inc_max, arg->expr[k]->dst.exc_min, arg->expr[k]->dst.exc_max ); k++; } /* by non-NODATA entry */ for (j = 0; j < arg->npos; j++) { if (colormap->method == CM_INTERPOLATE) { if (j == arg->npos - 1) continue; arg->expr[k]->src.min = colormap->entry[arg->pos[j + 1]].value; arg->expr[k]->src.inc_min = 1; arg->expr[k]->src.exc_min = 0; arg->expr[k]->src.max = colormap->entry[arg->pos[j]].value; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_max = 0; arg->expr[k]->dst.min = colormap->entry[arg->pos[j + 1]].color[i]; arg->expr[k]->dst.max = colormap->entry[arg->pos[j]].color[i]; arg->expr[k]->dst.inc_min = 1; arg->expr[k]->dst.exc_min = 0; arg->expr[k]->dst.inc_max = 1; arg->expr[k]->dst.exc_max = 0; } else if (colormap->method == CM_NEAREST) { /* NOT last entry */ if (j != arg->npos - 1) { arg->expr[k]->src.min = ((colormap->entry[arg->pos[j]].value - colormap->entry[arg->pos[j + 1]].value) / 2.) + colormap->entry[arg->pos[j + 1]].value; arg->expr[k]->src.inc_min = 0; arg->expr[k]->src.exc_min = 0; } /* last entry */ else { arg->expr[k]->src.min = colormap->entry[arg->pos[j]].value; arg->expr[k]->src.inc_min = 1; arg->expr[k]->src.exc_min = 1; } /* NOT first entry */ if (j > 0) { arg->expr[k]->src.max = arg->expr[k - 1]->src.min; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_max = 0; } /* first entry */ else { arg->expr[k]->src.max = colormap->entry[arg->pos[j]].value; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_max = 1; } arg->expr[k]->dst.min = colormap->entry[arg->pos[j]].color[i]; arg->expr[k]->dst.inc_min = 1; arg->expr[k]->dst.exc_min = 0; arg->expr[k]->dst.max = colormap->entry[arg->pos[j]].color[i]; arg->expr[k]->dst.inc_max = 1; arg->expr[k]->dst.exc_max = 0; } else if (colormap->method == CM_EXACT) { arg->expr[k]->src.min = colormap->entry[arg->pos[j]].value; arg->expr[k]->src.inc_min = 1; arg->expr[k]->src.exc_min = 0; arg->expr[k]->src.max = colormap->entry[arg->pos[j]].value; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_max = 0; arg->expr[k]->dst.min = colormap->entry[arg->pos[j]].color[i]; arg->expr[k]->dst.inc_min = 1; arg->expr[k]->dst.exc_min = 0; arg->expr[k]->dst.max = colormap->entry[arg->pos[j]].color[i]; arg->expr[k]->dst.inc_max = 1; arg->expr[k]->dst.exc_max = 0; } RASTER_DEBUGF(4, "expr[%d]->src (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->src.min, arg->expr[k]->src.max, arg->expr[k]->src.inc_min, arg->expr[k]->src.inc_max, arg->expr[k]->src.exc_min, arg->expr[k]->src.exc_max ); RASTER_DEBUGF(4, "expr[%d]->dst (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->dst.min, arg->expr[k]->dst.max, arg->expr[k]->dst.inc_min, arg->expr[k]->dst.inc_max, arg->expr[k]->dst.exc_min, arg->expr[k]->dst.exc_max ); k++; } /* EXACT has one last expression for catching all uncaught values */ if (colormap->method == CM_EXACT) { arg->expr[k]->src.min = 0; arg->expr[k]->src.inc_min = 1; arg->expr[k]->src.exc_min = 1; arg->expr[k]->src.max = 0; arg->expr[k]->src.inc_max = 1; arg->expr[k]->src.exc_max = 1; arg->expr[k]->dst.min = 0; arg->expr[k]->dst.inc_min = 1; arg->expr[k]->dst.exc_min = 0; arg->expr[k]->dst.max = 0; arg->expr[k]->dst.inc_max = 1; arg->expr[k]->dst.exc_max = 0; RASTER_DEBUGF(4, "expr[%d]->src (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->src.min, arg->expr[k]->src.max, arg->expr[k]->src.inc_min, arg->expr[k]->src.inc_max, arg->expr[k]->src.exc_min, arg->expr[k]->src.exc_max ); RASTER_DEBUGF(4, "expr[%d]->dst (min, max, in, ix, en, ex) = (%f, %f, %d, %d, %d, %d)", k, arg->expr[k]->dst.min, arg->expr[k]->dst.max, arg->expr[k]->dst.inc_min, arg->expr[k]->dst.inc_max, arg->expr[k]->dst.exc_min, arg->expr[k]->dst.exc_max ); k++; } /* call rt_band_reclass */ arg->band = rt_band_reclass(band, PT_8BUI, 0, 0, arg->expr, arg->nexpr); if (arg->band == NULL) { rterror("rt_raster_colormap: Could not reclassify band"); _rti_colormap_arg_destroy(arg); return NULL; } /* add reclassified band to raster */ if (rt_raster_add_band(arg->raster, arg->band, rt_raster_get_num_bands(arg->raster)) < 0) { rterror("rt_raster_colormap: Could not add reclassified band to output raster"); _rti_colormap_arg_destroy(arg); return NULL; } } rtnraster = arg->raster; arg->raster = NULL; _rti_colormap_arg_destroy(arg); return rtnraster; }