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

◆ 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 193 of file rtpg_mapalgebra.c.

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

References FALSE, rtpg_nmapalgebra_arg_t::hasband, rtpg_nmapalgebra_arg_t::isempty, rtpg_nmapalgebra_arg_t::mask, rtpg_nmapalgebra_arg_t::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: