PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ _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:308
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition rt_band.c:833
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
Definition rt_band.c:873
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:2082
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:2067
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
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:2659

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, _rti_iterator_arg_t::nodataval, _rti_iterator_arg_t::offset, rt_iterator_t::raster, _rti_iterator_arg_t::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: