PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ rtpg_nmapalgebra_rastbandarg_process()

static int rtpg_nmapalgebra_rastbandarg_process ( rtpg_nmapalgebra_arg  arg,
ArrayType *  array,
int *  allnull,
int *  allempty,
int *  noband 
)
static

Definition at line 188 of file rtpg_mapalgebra.c.

188  {
189  Oid etype;
190  Datum *e;
191  bool *nulls;
192  int16 typlen;
193  bool typbyval;
194  char typalign;
195  int n = 0;
196 
197  HeapTupleHeader tup;
198  bool isnull;
199  Datum tupv;
200 
201  int i;
202  int j;
203  int nband;
204 
205  if (arg == NULL || array == NULL) {
206  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: NULL values not permitted for parameters");
207  return 0;
208  }
209 
210  etype = ARR_ELEMTYPE(array);
211  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
212 
213  deconstruct_array(
214  array,
215  etype,
216  typlen, typbyval, typalign,
217  &e, &nulls, &n
218  );
219 
220  if (!n) {
221  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Invalid argument for rastbandarg");
222  return 0;
223  }
224 
225  /* prep arg */
226  arg->numraster = n;
227  arg->pgraster = palloc(sizeof(rt_pgraster *) * arg->numraster);
228  arg->raster = palloc(sizeof(rt_raster) * arg->numraster);
229  arg->isempty = palloc(sizeof(uint8_t) * arg->numraster);
230  arg->ownsdata = palloc(sizeof(uint8_t) * arg->numraster);
231  arg->nband = palloc(sizeof(int) * arg->numraster);
232  arg->hasband = palloc(sizeof(uint8_t) * arg->numraster);
233  arg->mask = palloc(sizeof(struct rt_mask_t));
234  if (
235  arg->pgraster == NULL ||
236  arg->raster == NULL ||
237  arg->isempty == NULL ||
238  arg->ownsdata == NULL ||
239  arg->nband == NULL ||
240  arg->hasband == NULL ||
241  arg->mask == NULL
242  ) {
243  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Could not allocate memory for processing rastbandarg");
244  return 0;
245  }
246 
247  *allnull = 0;
248  *allempty = 0;
249  *noband = 0;
250 
251  /* process each element */
252  for (i = 0; i < n; i++) {
253  if (nulls[i]) {
254  arg->numraster--;
255  continue;
256  }
257 
258  POSTGIS_RT_DEBUGF(4, "Processing rastbandarg at index %d", i);
259 
260  arg->raster[i] = NULL;
261  arg->isempty[i] = 0;
262  arg->ownsdata[i] = 1;
263  arg->nband[i] = 0;
264  arg->hasband[i] = 0;
265 
266  /* each element is a tuple */
267  tup = (HeapTupleHeader) DatumGetPointer(e[i]);
268  if (NULL == tup) {
269  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Invalid argument for rastbandarg at index %d", i);
270  return 0;
271  }
272 
273  /* first element, raster */
274  POSTGIS_RT_DEBUG(4, "Processing first element (raster)");
275  tupv = GetAttributeByName(tup, "rast", &isnull);
276  if (isnull) {
277  elog(NOTICE, "First argument (nband) of rastbandarg at index %d is NULL. Assuming NULL raster", i);
278  arg->isempty[i] = 1;
279  arg->ownsdata[i] = 0;
280 
281  (*allnull)++;
282  (*allempty)++;
283  (*noband)++;
284 
285  continue;
286  }
287 
288  arg->pgraster[i] = (rt_pgraster *) PG_DETOAST_DATUM(tupv);
289 
290  /* see if this is a copy of an existing pgraster */
291  for (j = 0; j < i; j++) {
292  if (!arg->isempty[j] && (arg->pgraster[i] == arg->pgraster[j])) {
293  POSTGIS_RT_DEBUG(4, "raster matching existing same raster found");
294  arg->raster[i] = arg->raster[j];
295  arg->ownsdata[i] = 0;
296  break;
297  }
298  }
299 
300  if (arg->ownsdata[i]) {
301  POSTGIS_RT_DEBUG(4, "deserializing raster");
302  arg->raster[i] = rt_raster_deserialize(arg->pgraster[i], FALSE);
303  if (arg->raster[i] == NULL) {
304  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Could not deserialize raster at index %d", i);
305  return 0;
306  }
307  }
308 
309  /* is raster empty? */
310  arg->isempty[i] = rt_raster_is_empty(arg->raster[i]);
311  if (arg->isempty[i]) {
312  (*allempty)++;
313  (*noband)++;
314 
315  continue;
316  }
317 
318  /* second element, nband */
319  POSTGIS_RT_DEBUG(4, "Processing second element (nband)");
320  tupv = GetAttributeByName(tup, "nband", &isnull);
321  if (isnull) {
322  nband = 1;
323  elog(NOTICE, "First argument (nband) of rastbandarg at index %d is NULL. Assuming nband = %d", i, nband);
324  }
325  else
326  nband = DatumGetInt32(tupv);
327 
328  if (nband < 1) {
329  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Band number provided for rastbandarg at index %d must be greater than zero (1-based)", i);
330  return 0;
331  }
332 
333  arg->nband[i] = nband - 1;
334  arg->hasband[i] = rt_raster_has_band(arg->raster[i], arg->nband[i]);
335  if (!arg->hasband[i]) {
336  (*noband)++;
337  POSTGIS_RT_DEBUGF(4, "Band at index %d not found in raster", nband);
338  }
339  }
340 
341  if (arg->numraster < n) {
342  arg->pgraster = repalloc(arg->pgraster, sizeof(rt_pgraster *) * arg->numraster);
343  arg->raster = repalloc(arg->raster, sizeof(rt_raster) * arg->numraster);
344  arg->isempty = repalloc(arg->isempty, sizeof(uint8_t) * arg->numraster);
345  arg->ownsdata = repalloc(arg->ownsdata, sizeof(uint8_t) * arg->numraster);
346  arg->nband = repalloc(arg->nband, sizeof(int) * arg->numraster);
347  arg->hasband = repalloc(arg->hasband, sizeof(uint8_t) * arg->numraster);
348  if (
349  arg->pgraster == NULL ||
350  arg->raster == NULL ||
351  arg->isempty == NULL ||
352  arg->ownsdata == NULL ||
353  arg->nband == NULL ||
354  arg->hasband == NULL
355  ) {
356  elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Could not reallocate memory for processed rastbandarg");
357  return 0;
358  }
359  }
360 
361  POSTGIS_RT_DEBUGF(4, "arg->numraster = %d", arg->numraster);
362 
363  return 1;
364 }
#define FALSE
Definition: dbfopen.c:72
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:1375
rt_raster rt_raster_deserialize(void *serialized, int header_only)
Return a raster from a serialized form.
Definition: rt_serialize.c:725
int rt_raster_is_empty(rt_raster raster)
Return TRUE if the raster is empty.
Definition: rt_raster.c:1362
nband
Definition: pixval.py:53
#define POSTGIS_RT_DEBUG(level, msg)
Definition: rtpostgis.h:65
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition: rtpostgis.h:69
Struct definitions.
Definition: librtcore.h:2403

References FALSE, rtpg_nmapalgebra_arg_t::hasband, rtpg_nmapalgebra_arg_t::isempty, rtpg_nmapalgebra_arg_t::mask, rtpg_nmapalgebra_arg_t::nband, pixval::nband, rtpg_nmapalgebra_arg_t::numraster, rtpg_nmapalgebra_arg_t::ownsdata, rtpg_nmapalgebra_arg_t::pgraster, POSTGIS_RT_DEBUG, POSTGIS_RT_DEBUGF, rtpg_nmapalgebra_arg_t::raster, rt_raster_deserialize(), rt_raster_has_band(), and rt_raster_is_empty().

Referenced by RASTER_nMapAlgebra(), and RASTER_nMapAlgebraExpr().

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