PostGIS 3.7.0dev-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 189 of file rtpg_mapalgebra.c.

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

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: