static rt_raster fillRasterToPolygonize(int hasnodata, double nodataval) { rt_band band = NULL; rt_pixtype pixtype = PT_32BF; /* Create raster */ uint16_t width = 9; uint16_t height = 9; rt_raster raster = rt_raster_new(width, height); rt_raster_set_scale(raster, 1, 1); band = cu_add_band(raster, pixtype, hasnodata, nodataval); CU_ASSERT(band != NULL); { int x, y; for (x = 0; x < rt_band_get_width(band); ++x) for (y = 0; y < rt_band_get_height(band); ++y) rt_band_set_pixel(band, x, y, 0.0, NULL); } rt_band_set_pixel(band, 3, 1, 1.8, NULL); rt_band_set_pixel(band, 4, 1, 1.8, NULL); rt_band_set_pixel(band, 5, 1, 2.8, NULL); rt_band_set_pixel(band, 2, 2, 1.8, NULL); rt_band_set_pixel(band, 3, 2, 1.8, NULL); rt_band_set_pixel(band, 4, 2, 1.8, NULL); rt_band_set_pixel(band, 5, 2, 2.8, NULL); rt_band_set_pixel(band, 6, 2, 2.8, NULL); rt_band_set_pixel(band, 1, 3, 1.8, NULL); rt_band_set_pixel(band, 2, 3, 1.8, NULL); rt_band_set_pixel(band, 6, 3, 2.8, NULL); rt_band_set_pixel(band, 7, 3, 2.8, NULL); rt_band_set_pixel(band, 1, 4, 1.8, NULL); rt_band_set_pixel(band, 2, 4, 1.8, NULL); rt_band_set_pixel(band, 6, 4, 2.8, NULL); rt_band_set_pixel(band, 7, 4, 2.8, NULL); rt_band_set_pixel(band, 1, 5, 1.8, NULL); rt_band_set_pixel(band, 2, 5, 1.8, NULL); rt_band_set_pixel(band, 6, 5, 2.8, NULL); rt_band_set_pixel(band, 7, 5, 2.8, NULL); rt_band_set_pixel(band, 2, 6, 1.8, NULL); rt_band_set_pixel(band, 3, 6, 1.8, NULL); rt_band_set_pixel(band, 4, 6, 1.8, NULL); rt_band_set_pixel(band, 5, 6, 2.8, NULL); rt_band_set_pixel(band, 6, 6, 2.8, NULL); rt_band_set_pixel(band, 3, 7, 1.8, NULL); rt_band_set_pixel(band, 4, 7, 1.8, NULL); rt_band_set_pixel(band, 5, 7, 2.8, NULL); return raster; }
/** * 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; }