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

◆ RASTER_band()

Datum RASTER_band ( PG_FUNCTION_ARGS  )

Definition at line 1457 of file rtpg_create.c.

1458{
1459 rt_pgraster *pgraster;
1460 rt_pgraster *pgrast;
1463
1464 bool skip = FALSE;
1465 ArrayType *array;
1466 Oid etype;
1467 Datum *e;
1468 bool *nulls;
1469 int16 typlen;
1470 bool typbyval;
1471 char typalign;
1472
1473 uint32_t numBands;
1474 uint32_t *bandNums;
1475 uint32 idx = 0;
1476 int n;
1477 int i = 0;
1478 int j = 0;
1479
1480 if (PG_ARGISNULL(0))
1481 PG_RETURN_NULL();
1482 pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
1483
1484 raster = rt_raster_deserialize(pgraster, FALSE);
1485 if (!raster) {
1486 PG_FREE_IF_COPY(pgraster, 0);
1487 elog(ERROR, "RASTER_band: Could not deserialize raster");
1488 PG_RETURN_NULL();
1489 }
1490
1491 /* process bandNums */
1492 if (PG_ARGISNULL(1)) {
1493 elog(NOTICE, "Band number(s) not provided. Returning original raster");
1494 skip = TRUE;
1495 }
1496 if (!skip) {
1497 numBands = rt_raster_get_num_bands(raster);
1498
1499 array = PG_GETARG_ARRAYTYPE_P(1);
1500 etype = ARR_ELEMTYPE(array);
1501 get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
1502
1503 switch (etype) {
1504 case INT2OID:
1505 case INT4OID:
1506 break;
1507 default:
1508 rt_raster_destroy(raster);
1509 PG_FREE_IF_COPY(pgraster, 0);
1510 elog(ERROR, "RASTER_band: Invalid data type for band number(s)");
1511 PG_RETURN_NULL();
1512 break;
1513 }
1514
1515 deconstruct_array(array, etype, typlen, typbyval, typalign, &e,
1516 &nulls, &n);
1517
1518 bandNums = palloc(sizeof(uint32_t) * n);
1519 for (i = 0, j = 0; i < n; i++) {
1520 if (nulls[i]) continue;
1521
1522 switch (etype) {
1523 case INT2OID:
1524 idx = (uint32_t) DatumGetInt16(e[i]);
1525 break;
1526 case INT4OID:
1527 idx = (uint32_t) DatumGetInt32(e[i]);
1528 break;
1529 }
1530
1531 POSTGIS_RT_DEBUGF(3, "band idx (before): %d", idx);
1532 if (idx > numBands || idx < 1) {
1533 elog(NOTICE, "Invalid band index (must use 1-based). Returning original raster");
1534 skip = TRUE;
1535 break;
1536 }
1537
1538 bandNums[j] = idx - 1;
1539 POSTGIS_RT_DEBUGF(3, "bandNums[%d] = %d", j, bandNums[j]);
1540 j++;
1541 }
1542
1543 if (skip || j < 1) {
1544 pfree(bandNums);
1545 skip = TRUE;
1546 }
1547 }
1548
1549 if (!skip) {
1550 rast = rt_raster_from_band(raster, bandNums, j);
1551 pfree(bandNums);
1552 rt_raster_destroy(raster);
1553 PG_FREE_IF_COPY(pgraster, 0);
1554 if (!rast) {
1555 elog(ERROR, "RASTER_band: Could not create new raster");
1556 PG_RETURN_NULL();
1557 }
1558
1559 pgrast = rt_raster_serialize(rast);
1560 rt_raster_destroy(rast);
1561
1562 if (!pgrast)
1563 PG_RETURN_NULL();
1564
1565 SET_VARSIZE(pgrast, pgrast->size);
1566 PG_RETURN_POINTER(pgrast);
1567 }
1568
1569 PG_RETURN_POINTER(pgraster);
1570}
#define TRUE
Definition dbfopen.c:73
#define FALSE
Definition dbfopen.c:72
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition rt_raster.c:86
uint16_t rt_raster_get_num_bands(rt_raster raster)
Definition rt_raster.c:376
rt_raster rt_raster_from_band(rt_raster raster, uint32_t *bandNums, int count)
Construct a new rt_raster from an existing rt_raster and an array of band numbers.
Definition rt_raster.c:1341
void * rt_raster_serialize(rt_raster raster)
Return this raster in serialized form.
rt_raster rt_raster_deserialize(void *serialized, int header_only)
Return a raster from a serialized form.
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition rtrowdump.py:125
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition rtpostgis.h:69
Struct definitions.
Definition librtcore.h:2452

References FALSE, POSTGIS_RT_DEBUGF, rt_raster_deserialize(), rt_raster_destroy(), rt_raster_from_band(), rt_raster_get_num_bands(), rt_raster_serialize(), rt_raster_serialized_t::size, and TRUE.

Here is the call graph for this function: