PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ _rti_iterator_arg_populate()

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 
)
static

Definition at line 542 of file rt_mapalgebra.c.

547  {
548  int i = 0;
549  int hasband = 0;
550 
551  _param->count = itrcount;
552  _param->distance.x = distancex;
553  _param->distance.y = distancey;
554  _param->dimension.columns = distancex * 2 + 1;
555  _param->dimension.rows = distancey * 2 + 1;
556 
557  /* allocate memory for children */
558  _param->raster = rtalloc(sizeof(rt_raster) * itrcount);
559  _param->isempty = rtalloc(sizeof(int) * itrcount);
560  _param->width = rtalloc(sizeof(int) * itrcount);
561  _param->height = rtalloc(sizeof(int) * itrcount);
562 
563  _param->offset = rtalloc(sizeof(double *) * itrcount);
564 
565  _param->band.rtband = rtalloc(sizeof(rt_band) * itrcount);
566  _param->band.hasnodata = rtalloc(sizeof(int) * itrcount);
567  _param->band.isnodata = rtalloc(sizeof(int) * itrcount);
568  _param->band.nodataval = rtalloc(sizeof(double) * itrcount);
569  _param->band.minval = rtalloc(sizeof(double) * itrcount);
570 
571  if (
572  _param->raster == NULL ||
573  _param->isempty == NULL ||
574  _param->width == NULL ||
575  _param->height == NULL ||
576  _param->offset == NULL ||
577  _param->band.rtband == NULL ||
578  _param->band.hasnodata == NULL ||
579  _param->band.isnodata == NULL ||
580  _param->band.nodataval == NULL ||
581  _param->band.minval == NULL
582  ) {
583  rterror("_rti_iterator_arg_populate: Could not allocate memory for children of _rti_iterator_arg");
584  return 0;
585  }
586 
587  *allnull = 0;
588  *allempty = 0;
589 
590  /*
591  check input rasters
592  not empty, band # is valid
593  copy raster pointers and set flags
594  */
595  for (i = 0; i < itrcount; i++) {
596  /* initialize elements */
597  _param->raster[i] = NULL;
598  _param->isempty[i] = 0;
599  _param->width[i] = 0;
600  _param->height[i] = 0;
601 
602  _param->offset[i] = NULL;
603 
604  _param->band.rtband[i] = NULL;
605  _param->band.hasnodata[i] = 0;
606  _param->band.isnodata[i] = 0;
607  _param->band.nodataval[i] = 0;
608  _param->band.minval[i] = 0;
609 
610  /* set isempty */
611  if (itrset[i].raster == NULL) {
612  _param->isempty[i] = 1;
613 
614  (*allnull)++;
615  (*allempty)++;
616 
617  continue;
618  }
619  else if (rt_raster_is_empty(itrset[i].raster)) {
620  _param->isempty[i] = 1;
621 
622  (*allempty)++;
623 
624  continue;
625  }
626 
627  /* check band number */
628  hasband = rt_raster_has_band(itrset[i].raster, itrset[i].nband);
629  if (!hasband) {
630  if (!itrset[i].nbnodata) {
631  rterror("_rti_iterator_arg_populate: Band %d not found for raster %d", itrset[i].nband, i);
632  return 0;
633  }
634  else {
635  RASTER_DEBUGF(4, "Band %d not found for raster %d. Using NODATA", itrset[i].nband, i);
636  }
637  }
638 
639  _param->raster[i] = itrset[i].raster;
640  if (hasband) {
641  _param->band.rtband[i] = rt_raster_get_band(itrset[i].raster, itrset[i].nband);
642  if (_param->band.rtband[i] == NULL) {
643  rterror("_rti_iterator_arg_populate: Could not get band %d for raster %d", itrset[i].nband, i);
644  return 0;
645  }
646 
647  /* hasnodata */
648  _param->band.hasnodata[i] = rt_band_get_hasnodata_flag(_param->band.rtband[i]);
649 
650  /* hasnodata = TRUE */
651  if (_param->band.hasnodata[i]) {
652  /* nodataval */
653  rt_band_get_nodata(_param->band.rtband[i], &(_param->band.nodataval[i]));
654 
655  /* isnodata */
656  _param->band.isnodata[i] = rt_band_get_isnodata_flag(_param->band.rtband[i]);
657  }
658  /* hasnodata = FALSE */
659  else {
660  /* minval */
661  _param->band.minval[i] = rt_band_get_min_value(_param->band.rtband[i]);
662  }
663  }
664 
665  /* width, height */
666  _param->width[i] = rt_raster_get_width(_param->raster[i]);
667  _param->height[i] = rt_raster_get_height(_param->raster[i]);
668 
669  /* init offset */
670  _param->offset[i] = rtalloc(sizeof(double) * 2);
671  if (_param->offset[i] == NULL) {
672  rterror("_rti_iterator_arg_populate: Could not allocate memory for offsets");
673  return 0;
674  }
675  }
676 
677  return 1;
678 }
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition: rt_context.c:191
#define RASTER_DEBUGF(level, msg,...)
Definition: librtcore.h:306
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:825
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
Definition: rt_band.c:865
int rt_raster_has_band(rt_raster raster, int nband)
Return TRUE if the raster has a band of this number.
Definition: rt_raster.c:1253
double rt_band_get_min_value(rt_band band)
Returns the minimal possible value for the band according to the pixel type.
Definition: rt_band.c:2053
uint16_t rt_raster_get_height(rt_raster raster)
Definition: rt_raster.c:133
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
Definition: rt_band.c:2038
uint16_t rt_raster_get_width(rt_raster raster)
Definition: rt_raster.c:125
int rt_raster_is_empty(rt_raster raster)
Return TRUE if the raster is empty.
Definition: rt_raster.c:1240
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
Definition: rt_raster.c:385
nband
Definition: pixval.py:54
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition: rtrowdump.py:121
struct _rti_iterator_arg_t::@17 distance
struct _rti_iterator_arg_t::@16 band
struct _rti_iterator_arg_t::@18 dimension
rt_raster raster
Definition: librtcore.h:2647

References _rti_iterator_arg_t::band, _rti_iterator_arg_t::columns, _rti_iterator_arg_t::count, _rti_iterator_arg_t::dimension, _rti_iterator_arg_t::distance, _rti_iterator_arg_t::hasnodata, _rti_iterator_arg_t::height, _rti_iterator_arg_t::isempty, _rti_iterator_arg_t::isnodata, _rti_iterator_arg_t::minval, pixval::nband, _rti_iterator_arg_t::nodataval, _rti_iterator_arg_t::offset, rt_iterator_t::raster, _rti_iterator_arg_t::raster, rtrowdump::raster, RASTER_DEBUGF, _rti_iterator_arg_t::rows, rt_band_get_hasnodata_flag(), rt_band_get_isnodata_flag(), rt_band_get_min_value(), rt_band_get_nodata(), rt_raster_get_band(), rt_raster_get_height(), rt_raster_get_width(), rt_raster_has_band(), rt_raster_is_empty(), rtalloc(), _rti_iterator_arg_t::rtband, rterror(), _rti_iterator_arg_t::width, _rti_iterator_arg_t::x, and _rti_iterator_arg_t::y.

Referenced by rt_raster_iterator().

Here is the call graph for this function:
Here is the caller graph for this function: