PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ rt_band_set_pixel()

rt_errorstate rt_band_set_pixel ( rt_band  band,
int  x,
int  y,
double  val,
int *  converted 
)

Set single pixel's value.

Parameters
band: the band to set value to
x: pixel column (0-based)
y: pixel row (0-based)
val: the pixel value
converted: (optional) non-zero if value truncated/clamped/converted
Returns
ES_NONE on success, ES_ERROR on error
Parameters
band: the band to set value to
x: x ordinate (0-based)
y: y ordinate (0-based)
val: the pixel value
converted: (optional) non-zero if value truncated/clamped/converted
Returns
ES_NONE on success, ES_ERROR on error

Definition at line 841 of file rt_band.c.

References ovdump::data, ES_ERROR, ES_NONE, FALSE, rt_band_t::hasnodata, rt_band_t::height, rt_band_t::isnodata, rt_band_t::offline, rt_band_t::pixtype, PT_16BSI, PT_16BUI, PT_1BB, PT_2BUI, PT_32BF, PT_32BSI, PT_32BUI, PT_4BUI, PT_64BF, PT_8BSI, PT_8BUI, PT_END, RASTER_DEBUG, rt_band_clamped_value_is_nodata(), rt_band_corrected_clamped_value(), rt_band_get_data(), rt_util_clamp_to_16BSI(), rt_util_clamp_to_16BUI(), rt_util_clamp_to_1BB(), rt_util_clamp_to_2BUI(), rt_util_clamp_to_32BSI(), rt_util_clamp_to_32BUI(), rt_util_clamp_to_32F(), rt_util_clamp_to_4BUI(), rt_util_clamp_to_8BSI(), rt_util_clamp_to_8BUI(), rt_util_dbl_trunc_warning(), rterror(), rtwarn(), and rt_band_t::width.

Referenced by fillRasterToPolygonize(), RASTER_mapAlgebra2(), RASTER_mapAlgebraExpr(), RASTER_mapAlgebraFct(), RASTER_mapAlgebraFctNgb(), RASTER_setPixelValue(), RASTER_setPixelValuesArray(), RASTER_setPixelValuesGeomval(), rt_band_reclass(), rt_raster_gdal_rasterize(), rt_raster_iterator(), test_band_get_nearest_pixel(), test_band_get_pixel_line(), test_band_get_pixel_of_value(), test_band_pixtype_16BSI(), test_band_pixtype_16BUI(), test_band_pixtype_1BB(), test_band_pixtype_2BUI(), test_band_pixtype_32BF(), test_band_pixtype_32BSI(), test_band_pixtype_32BUI(), test_band_pixtype_4BUI(), test_band_pixtype_64BF(), test_band_pixtype_8BSI(), test_band_pixtype_8BUI(), test_band_reclass(), test_band_stats(), test_band_value_count(), test_gdal_to_raster(), test_gdal_warp(), test_pixel_set_to_array(), test_raster_colormap(), test_raster_fully_within_distance(), test_raster_geos_contains(), test_raster_geos_contains_properly(), test_raster_geos_covered_by(), test_raster_geos_covers(), test_raster_geos_overlaps(), test_raster_geos_touches(), test_raster_intersects(), test_raster_iterator(), test_raster_perimeter(), test_raster_pixel_as_polygon(), test_raster_surface(), test_raster_to_gdal(), and test_raster_within_distance().

846  {
847  rt_pixtype pixtype = PT_END;
848  unsigned char* data = NULL;
849  uint32_t offset = 0;
850 
851  int32_t checkvalint = 0;
852  uint32_t checkvaluint = 0;
853  float checkvalfloat = 0;
854  double checkvaldouble = 0;
855 
856  assert(NULL != band);
857 
858  if (converted != NULL)
859  *converted = 0;
860 
861  if (band->offline) {
862  rterror("rt_band_set_pixel not implemented yet for OFFDB bands");
863  return ES_ERROR;
864  }
865 
866  pixtype = band->pixtype;
867 
868  if (
869  x < 0 || x >= band->width ||
870  y < 0 || y >= band->height
871  ) {
872  rterror("rt_band_set_pixel: Coordinates out of range");
873  return ES_ERROR;
874  }
875 
876  /* check that clamped value isn't clamped NODATA */
877  if (band->hasnodata && pixtype != PT_64BF) {
878  double newval;
879  int corrected;
880 
881  rt_band_corrected_clamped_value(band, val, &newval, &corrected);
882 
883  if (corrected) {
884 #if POSTGIS_RASTER_WARN_ON_TRUNCATION > 0
885  rtwarn("Value for pixel %d x %d has been corrected as clamped value becomes NODATA", x, y);
886 #endif
887  val = newval;
888 
889  if (converted != NULL)
890  *converted = 1;
891  }
892  }
893 
894  data = rt_band_get_data(band);
895  offset = x + (y * band->width);
896 
897  switch (pixtype) {
898  case PT_1BB: {
899  data[offset] = rt_util_clamp_to_1BB(val);
900  checkvalint = data[offset];
901  break;
902  }
903  case PT_2BUI: {
904  data[offset] = rt_util_clamp_to_2BUI(val);
905  checkvalint = data[offset];
906  break;
907  }
908  case PT_4BUI: {
909  data[offset] = rt_util_clamp_to_4BUI(val);
910  checkvalint = data[offset];
911  break;
912  }
913  case PT_8BSI: {
914  data[offset] = rt_util_clamp_to_8BSI(val);
915  checkvalint = (int8_t) data[offset];
916  break;
917  }
918  case PT_8BUI: {
919  data[offset] = rt_util_clamp_to_8BUI(val);
920  checkvalint = data[offset];
921  break;
922  }
923  case PT_16BSI: {
924  int16_t *ptr = (int16_t*) data; /* we assume correct alignment */
925  ptr[offset] = rt_util_clamp_to_16BSI(val);
926  checkvalint = (int16_t) ptr[offset];
927  break;
928  }
929  case PT_16BUI: {
930  uint16_t *ptr = (uint16_t*) data; /* we assume correct alignment */
931  ptr[offset] = rt_util_clamp_to_16BUI(val);
932  checkvalint = ptr[offset];
933  break;
934  }
935  case PT_32BSI: {
936  int32_t *ptr = (int32_t*) data; /* we assume correct alignment */
937  ptr[offset] = rt_util_clamp_to_32BSI(val);
938  checkvalint = (int32_t) ptr[offset];
939  break;
940  }
941  case PT_32BUI: {
942  uint32_t *ptr = (uint32_t*) data; /* we assume correct alignment */
943  ptr[offset] = rt_util_clamp_to_32BUI(val);
944  checkvaluint = ptr[offset];
945  break;
946  }
947  case PT_32BF: {
948  float *ptr = (float*) data; /* we assume correct alignment */
949  ptr[offset] = rt_util_clamp_to_32F(val);
950  checkvalfloat = ptr[offset];
951  break;
952  }
953  case PT_64BF: {
954  double *ptr = (double*) data; /* we assume correct alignment */
955  ptr[offset] = val;
956  checkvaldouble = ptr[offset];
957  break;
958  }
959  default: {
960  rterror("rt_band_set_pixel: Unknown pixeltype %d", pixtype);
961  return ES_ERROR;
962  }
963  }
964 
965  /* If the stored value is not NODATA, reset the isnodata flag */
966  if (!rt_band_clamped_value_is_nodata(band, val)) {
967  RASTER_DEBUG(3, "Band has a value that is not NODATA. Setting isnodata to FALSE");
968  band->isnodata = FALSE;
969  }
970 
971  /* Overflow checking */
973  val,
974  checkvalint, checkvaluint,
975  checkvalfloat, checkvaldouble,
976  pixtype
977  ) && converted != NULL) {
978  *converted = 1;
979  }
980 
981  return ES_NONE;
982 }
int32_t rt_util_clamp_to_32BSI(double value)
Definition: rt_util.c:69
uint32_t rt_util_clamp_to_32BUI(double value)
Definition: rt_util.c:74
rt_pixtype pixtype
Definition: librtcore.h:2265
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition: rt_context.c:199
data
Definition: ovdump.py:103
uint16_t height
Definition: librtcore.h:2268
rt_pixtype
Definition: librtcore.h:185
unsigned int uint32_t
Definition: uthash.h:78
uint16_t rt_util_clamp_to_16BUI(double value)
Definition: rt_util.c:64
void rtwarn(const char *fmt,...)
Definition: rt_context.c:224
int8_t rt_util_clamp_to_8BSI(double value)
Definition: rt_util.c:49
int rt_util_dbl_trunc_warning(double initialvalue, int32_t checkvalint, uint32_t checkvaluint, float checkvalfloat, double checkvaldouble, rt_pixtype pixtype)
Definition: rt_util.c:625
uint16_t width
Definition: librtcore.h:2267
uint8_t rt_util_clamp_to_4BUI(double value)
Definition: rt_util.c:44
uint8_t rt_util_clamp_to_8BUI(double value)
Definition: rt_util.c:54
uint8_t rt_util_clamp_to_1BB(double value)
Definition: rt_util.c:34
int rt_band_clamped_value_is_nodata(rt_band band, double val)
Compare clamped value to band&#39;s clamped NODATA value.
Definition: rt_band.c:1665
int32_t offline
Definition: librtcore.h:2266
rt_errorstate rt_band_corrected_clamped_value(rt_band band, double val, double *newval, int *corrected)
Correct value when clamped value is equal to clamped NODATA value.
Definition: rt_band.c:1701
int32_t isnodata
Definition: librtcore.h:2270
#define FALSE
Definition: dbfopen.c:168
#define RASTER_DEBUG(level, msg)
Definition: librtcore.h:295
int32_t hasnodata
Definition: librtcore.h:2269
uint8_t rt_util_clamp_to_2BUI(double value)
Definition: rt_util.c:39
float rt_util_clamp_to_32F(double value)
Definition: rt_util.c:79
void * rt_band_get_data(rt_band band)
Get pointer to raster band data.
Definition: rt_band.c:302
int16_t rt_util_clamp_to_16BSI(double value)
Definition: rt_util.c:59
Here is the call graph for this function:
Here is the caller graph for this function: