PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ RASTER_clip()

Datum RASTER_clip ( PG_FUNCTION_ARGS  )

Definition at line 3026 of file rtpg_mapalgebra.c.

3027 {
3028  rt_pgraster *pgraster = NULL;
3029  LWGEOM *rastgeom = NULL;
3030  double gt[6] = {0};
3031  int srid = SRID_UNKNOWN;
3032 
3033  rt_pgraster *pgrtn = NULL;
3034  rt_raster rtn = NULL;
3035 
3036  GSERIALIZED *gser = NULL;
3037  LWGEOM *geom = NULL;
3038  unsigned char *wkb = NULL;
3039  size_t wkb_len;
3040 
3041  ArrayType *array;
3042  Oid etype;
3043  Datum *e;
3044  bool *nulls;
3045 
3046  int16 typlen;
3047  bool typbyval;
3048  char typalign;
3049 
3050  int i = 0;
3051  int j = 0;
3052  int k = 0;
3053  rtpg_clip_arg arg = NULL;
3054  LWGEOM *tmpgeom = NULL;
3055  rt_iterator itrset;
3056 
3057  rt_raster _raster = NULL;
3058  rt_band band = NULL;
3059  rt_pixtype pixtype;
3060  int hasnodata;
3061  double nodataval;
3062  int noerr = 0;
3063 
3064  POSTGIS_RT_DEBUG(3, "Starting...");
3065 
3066  /* raster or geometry is NULL, return NULL */
3067  if (PG_ARGISNULL(0) || PG_ARGISNULL(2))
3068  PG_RETURN_NULL();
3069 
3070  /* init arg */
3071  arg = rtpg_clip_arg_init();
3072  if (arg == NULL) {
3073  elog(ERROR, "RASTER_clip: Could not initialize argument structure");
3074  PG_RETURN_NULL();
3075  }
3076 
3077  /* raster (0) */
3078  pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
3079 
3080  /* Get raster object */
3081  arg->raster = rt_raster_deserialize(pgraster, FALSE);
3082  if (arg->raster == NULL) {
3083  rtpg_clip_arg_destroy(arg);
3084  PG_FREE_IF_COPY(pgraster, 0);
3085  elog(ERROR, "RASTER_clip: Could not deserialize raster");
3086  PG_RETURN_NULL();
3087  }
3088 
3089  /* raster is empty, return empty raster */
3090  if (rt_raster_is_empty(arg->raster) || rt_raster_get_num_bands(arg->raster) == 0) {
3091  elog(NOTICE, "Input raster is empty or has no bands. Returning empty raster");
3092 
3093  rtpg_clip_arg_destroy(arg);
3094  PG_FREE_IF_COPY(pgraster, 0);
3095 
3096  rtn = rt_raster_new(0, 0);
3097  if (rtn == NULL) {
3098  elog(ERROR, "RASTER_clip: Could not create empty raster");
3099  PG_RETURN_NULL();
3100  }
3101 
3102  pgrtn = rt_raster_serialize(rtn);
3103  rt_raster_destroy(rtn);
3104  if (NULL == pgrtn)
3105  PG_RETURN_NULL();
3106 
3107  SET_VARSIZE(pgrtn, pgrtn->size);
3108  PG_RETURN_POINTER(pgrtn);
3109  }
3110 
3111  /* metadata */
3113  srid = clamp_srid(rt_raster_get_srid(arg->raster));
3114 
3115  /* geometry (2) */
3116  gser = PG_GETARG_GSERIALIZED_P(2);
3117  geom = lwgeom_from_gserialized(gser);
3118 
3119  /* Get a 2D version of the geometry if necessary */
3120  if (lwgeom_ndims(geom) > 2) {
3121  LWGEOM *geom2d = lwgeom_force_2d(geom);
3122  lwgeom_free(geom);
3123  geom = geom2d;
3124  }
3125 
3126  /* check that SRIDs match */
3127  if (srid != clamp_srid(gserialized_get_srid(gser))) {
3128  elog(NOTICE, "Geometry provided does not have the same SRID as the raster. Returning NULL");
3129 
3130  rtpg_clip_arg_destroy(arg);
3131  PG_FREE_IF_COPY(pgraster, 0);
3132  lwgeom_free(geom);
3133  PG_FREE_IF_COPY(gser, 2);
3134 
3135  PG_RETURN_NULL();
3136  }
3137 
3138  /* crop (4) */
3139  if (!PG_ARGISNULL(4) && !PG_GETARG_BOOL(4))
3140  arg->extenttype = ET_FIRST;
3141 
3142  /* get intersection geometry of input raster and input geometry */
3143  if (rt_raster_get_convex_hull(arg->raster, &rastgeom) != ES_NONE) {
3144 
3145  rtpg_clip_arg_destroy(arg);
3146  PG_FREE_IF_COPY(pgraster, 0);
3147  lwgeom_free(geom);
3148  PG_FREE_IF_COPY(gser, 2);
3149 
3150  elog(ERROR, "RASTER_clip: Could not get convex hull of raster");
3151  PG_RETURN_NULL();
3152  }
3153 
3154  tmpgeom = lwgeom_intersection(rastgeom, geom);
3155  lwgeom_free(rastgeom);
3156  lwgeom_free(geom);
3157  PG_FREE_IF_COPY(gser, 2);
3158  geom = tmpgeom;
3159 
3160  /* intersection is empty AND extent type is INTERSECTION, return empty */
3161  if (lwgeom_is_empty(geom) && arg->extenttype == ET_INTERSECTION) {
3162  elog(NOTICE, "The input raster and input geometry do not intersect. Returning empty raster");
3163 
3164  rtpg_clip_arg_destroy(arg);
3165  PG_FREE_IF_COPY(pgraster, 0);
3166  lwgeom_free(geom);
3167 
3168  rtn = rt_raster_new(0, 0);
3169  if (rtn == NULL) {
3170  elog(ERROR, "RASTER_clip: Could not create empty raster");
3171  PG_RETURN_NULL();
3172  }
3173 
3174  pgrtn = rt_raster_serialize(rtn);
3175  rt_raster_destroy(rtn);
3176  if (NULL == pgrtn)
3177  PG_RETURN_NULL();
3178 
3179  SET_VARSIZE(pgrtn, pgrtn->size);
3180  PG_RETURN_POINTER(pgrtn);
3181  }
3182 
3183  /* nband (1) */
3184  if (!PG_ARGISNULL(1)) {
3185  array = PG_GETARG_ARRAYTYPE_P(1);
3186  etype = ARR_ELEMTYPE(array);
3187  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3188 
3189  switch (etype) {
3190  case INT2OID:
3191  case INT4OID:
3192  break;
3193  default:
3194  rtpg_clip_arg_destroy(arg);
3195  PG_FREE_IF_COPY(pgraster, 0);
3196  lwgeom_free(geom);
3197  elog(ERROR, "RASTER_clip: Invalid data type for band indexes");
3198  PG_RETURN_NULL();
3199  break;
3200  }
3201 
3202  deconstruct_array(
3203  array, etype,
3204  typlen, typbyval, typalign,
3205  &e, &nulls, &(arg->numbands)
3206  );
3207 
3208  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3209  if (arg->band == NULL) {
3210  rtpg_clip_arg_destroy(arg);
3211  PG_FREE_IF_COPY(pgraster, 0);
3212  lwgeom_free(geom);
3213  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3214  PG_RETURN_NULL();
3215  }
3216 
3217  for (i = 0, j = 0; i < arg->numbands; i++) {
3218  if (nulls[i]) continue;
3219 
3220  switch (etype) {
3221  case INT2OID:
3222  arg->band[j].nband = DatumGetInt16(e[i]) - 1;
3223  break;
3224  case INT4OID:
3225  arg->band[j].nband = DatumGetInt32(e[i]) - 1;
3226  break;
3227  }
3228 
3229  j++;
3230  }
3231 
3232  if (j < arg->numbands) {
3233  arg->band = repalloc(arg->band, sizeof(struct rtpg_clip_band_t) * j);
3234  if (arg->band == NULL) {
3235  rtpg_clip_arg_destroy(arg);
3236  PG_FREE_IF_COPY(pgraster, 0);
3237  lwgeom_free(geom);
3238  elog(ERROR, "RASTER_clip: Could not reallocate memory for band arguments");
3239  PG_RETURN_NULL();
3240  }
3241 
3242  arg->numbands = j;
3243  }
3244 
3245  /* validate band */
3246  for (i = 0; i < arg->numbands; i++) {
3247  if (!rt_raster_has_band(arg->raster, arg->band[i].nband)) {
3248  elog(NOTICE, "Band at index %d not found in raster", arg->band[i].nband + 1);
3249  rtpg_clip_arg_destroy(arg);
3250  PG_FREE_IF_COPY(pgraster, 0);
3251  lwgeom_free(geom);
3252  PG_RETURN_NULL();
3253  }
3254 
3255  arg->band[i].hasnodata = 0;
3256  arg->band[i].nodataval = 0;
3257  }
3258  }
3259  else {
3261 
3262  /* raster may have no bands */
3263  if (arg->numbands) {
3264  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3265  if (arg->band == NULL) {
3266 
3267  rtpg_clip_arg_destroy(arg);
3268  PG_FREE_IF_COPY(pgraster, 0);
3269  lwgeom_free(geom);
3270 
3271  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3272  PG_RETURN_NULL();
3273  }
3274 
3275  for (i = 0; i < arg->numbands; i++) {
3276  arg->band[i].nband = i;
3277  arg->band[i].hasnodata = 0;
3278  arg->band[i].nodataval = 0;
3279  }
3280  }
3281  }
3282 
3283  /* nodataval (3) */
3284  if (!PG_ARGISNULL(3)) {
3285  array = PG_GETARG_ARRAYTYPE_P(3);
3286  etype = ARR_ELEMTYPE(array);
3287  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3288 
3289  switch (etype) {
3290  case FLOAT4OID:
3291  case FLOAT8OID:
3292  break;
3293  default:
3294  rtpg_clip_arg_destroy(arg);
3295  PG_FREE_IF_COPY(pgraster, 0);
3296  lwgeom_free(geom);
3297  elog(ERROR, "RASTER_clip: Invalid data type for NODATA values");
3298  PG_RETURN_NULL();
3299  break;
3300  }
3301 
3302  deconstruct_array(
3303  array, etype,
3304  typlen, typbyval, typalign,
3305  &e, &nulls, &k
3306  );
3307 
3308  /* it doesn't matter if there are more nodataval */
3309  for (i = 0, j = 0; i < arg->numbands; i++, j++) {
3310  /* cap j to the last nodataval element */
3311  if (j >= k)
3312  j = k - 1;
3313 
3314  if (nulls[j])
3315  continue;
3316 
3317  arg->band[i].hasnodata = 1;
3318  switch (etype) {
3319  case FLOAT4OID:
3320  arg->band[i].nodataval = DatumGetFloat4(e[j]);
3321  break;
3322  case FLOAT8OID:
3323  arg->band[i].nodataval = DatumGetFloat8(e[j]);
3324  break;
3325  }
3326  }
3327  }
3328 
3329  /* get wkb of geometry */
3330  POSTGIS_RT_DEBUG(3, "getting wkb of geometry");
3331  wkb = lwgeom_to_wkb(geom, WKB_SFSQL, &wkb_len);
3332  lwgeom_free(geom);
3333 
3334  /* rasterize geometry */
3336  wkb, wkb_len,
3337  NULL,
3338  0, NULL,
3339  NULL, NULL,
3340  NULL, NULL,
3341  NULL, NULL,
3342  &(gt[1]), &(gt[5]),
3343  NULL, NULL,
3344  &(gt[0]), &(gt[3]),
3345  &(gt[2]), &(gt[4]),
3346  NULL
3347  );
3348 
3349  pfree(wkb);
3350  if (arg->mask == NULL) {
3351  rtpg_clip_arg_destroy(arg);
3352  PG_FREE_IF_COPY(pgraster, 0);
3353  elog(ERROR, "RASTER_clip: Could not rasterize intersection geometry");
3354  PG_RETURN_NULL();
3355  }
3356 
3357  /* set SRID */
3358  rt_raster_set_srid(arg->mask, srid);
3359 
3360  /* run iterator */
3361 
3362  /* init itrset */
3363  itrset = palloc(sizeof(struct rt_iterator_t) * 2);
3364  if (itrset == NULL) {
3365  rtpg_clip_arg_destroy(arg);
3366  PG_FREE_IF_COPY(pgraster, 0);
3367  elog(ERROR, "RASTER_clip: Could not allocate memory for iterator arguments");
3368  PG_RETURN_NULL();
3369  }
3370 
3371  /* one band at a time */
3372  for (i = 0; i < arg->numbands; i++) {
3373  POSTGIS_RT_DEBUGF(4, "band arg %d (nband, hasnodata, nodataval) = (%d, %d, %f)",
3374  i, arg->band[i].nband, arg->band[i].hasnodata, arg->band[i].nodataval);
3375 
3376  band = rt_raster_get_band(arg->raster, arg->band[i].nband);
3377 
3378  /* band metadata */
3379  pixtype = rt_band_get_pixtype(band);
3380 
3381  if (arg->band[i].hasnodata) {
3382  hasnodata = 1;
3383  nodataval = arg->band[i].nodataval;
3384  }
3385  else if (rt_band_get_hasnodata_flag(band)) {
3386  hasnodata = 1;
3387  rt_band_get_nodata(band, &nodataval);
3388  }
3389  else {
3390  hasnodata = 0;
3391  nodataval = rt_band_get_min_value(band);
3392  }
3393 
3394  /* band is NODATA, create NODATA band and continue */
3396  /* create raster */
3397  if (rtn == NULL) {
3398  noerr = rt_raster_from_two_rasters(arg->raster, arg->mask, arg->extenttype, &rtn, NULL);
3399  if (noerr != ES_NONE) {
3400  rtpg_clip_arg_destroy(arg);
3401  PG_FREE_IF_COPY(pgraster, 0);
3402  elog(ERROR, "RASTER_clip: Could not create output raster");
3403  PG_RETURN_NULL();
3404  }
3405  }
3406 
3407  /* create NODATA band */
3408  if (rt_raster_generate_new_band(rtn, pixtype, nodataval, hasnodata, nodataval, i) < 0) {
3409  rt_raster_destroy(rtn);
3410  rtpg_clip_arg_destroy(arg);
3411  PG_FREE_IF_COPY(pgraster, 0);
3412  elog(ERROR, "RASTER_clip: Could not add NODATA band to output raster");
3413  PG_RETURN_NULL();
3414  }
3415 
3416  continue;
3417  }
3418 
3419  /* raster */
3420  itrset[0].raster = arg->raster;
3421  itrset[0].nband = arg->band[i].nband;
3422  itrset[0].nbnodata = 1;
3423 
3424  /* mask */
3425  itrset[1].raster = arg->mask;
3426  itrset[1].nband = 0;
3427  itrset[1].nbnodata = 1;
3428 
3429  /* pass to iterator */
3430  noerr = rt_raster_iterator(
3431  itrset, 2,
3432  arg->extenttype, NULL,
3433  pixtype,
3434  hasnodata, nodataval,
3435  0, 0,
3436  NULL,
3437  NULL,
3439  &_raster
3440  );
3441 
3442  if (noerr != ES_NONE) {
3443  pfree(itrset);
3444  rtpg_clip_arg_destroy(arg);
3445  if (rtn != NULL) rt_raster_destroy(rtn);
3446  PG_FREE_IF_COPY(pgraster, 0);
3447  elog(ERROR, "RASTER_clip: Could not run raster iterator function");
3448  PG_RETURN_NULL();
3449  }
3450 
3451  /* new raster */
3452  if (rtn == NULL)
3453  rtn = _raster;
3454  /* copy band */
3455  else {
3456  band = rt_raster_get_band(_raster, 0);
3457  if (band == NULL) {
3458  pfree(itrset);
3459  rtpg_clip_arg_destroy(arg);
3460  rt_raster_destroy(_raster);
3461  rt_raster_destroy(rtn);
3462  PG_FREE_IF_COPY(pgraster, 0);
3463  elog(NOTICE, "RASTER_clip: Could not get band from working raster");
3464  PG_RETURN_NULL();
3465  }
3466 
3467  if (rt_raster_add_band(rtn, band, i) < 0) {
3468  pfree(itrset);
3469  rtpg_clip_arg_destroy(arg);
3470  rt_raster_destroy(_raster);
3471  rt_raster_destroy(rtn);
3472  PG_FREE_IF_COPY(pgraster, 0);
3473  elog(ERROR, "RASTER_clip: Could not add new band to output raster");
3474  PG_RETURN_NULL();
3475  }
3476 
3477  rt_raster_destroy(_raster);
3478  }
3479  }
3480 
3481  pfree(itrset);
3482  rtpg_clip_arg_destroy(arg);
3483  PG_FREE_IF_COPY(pgraster, 0);
3484 
3485  pgrtn = rt_raster_serialize(rtn);
3486  rt_raster_destroy(rtn);
3487 
3488  POSTGIS_RT_DEBUG(3, "Finished");
3489 
3490  if (!pgrtn)
3491  PG_RETURN_NULL();
3492 
3493  SET_VARSIZE(pgrtn, pgrtn->size);
3494  PG_RETURN_POINTER(pgrtn);
3495 }
#define FALSE
Definition: dbfopen.c:168
int32_t gserialized_get_srid(const GSERIALIZED *s)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
Definition: g_serialized.c:100
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int lwgeom_ndims(const LWGEOM *geom)
Return the number of dimensions (2, 3, 4) in a geometry.
Definition: lwgeom.c:944
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1144
LWGEOM * lwgeom_intersection(const LWGEOM *geom1, const LWGEOM *geom2)
uint8_t * lwgeom_to_wkb(const LWGEOM *geom, uint8_t variant, size_t *size_out)
Convert LWGEOM to a char* in WKB format.
Definition: lwout_wkb.c:764
int clamp_srid(int srid)
Return a valid SRID from an arbitrary integer Raises a notice if what comes out is different from wha...
Definition: lwutil.c:347
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition: lwgeom.c:1393
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:188
#define WKB_SFSQL
Definition: liblwgeom.h:2067
LWGEOM * lwgeom_force_2d(const LWGEOM *geom)
Strip out the Z/M components of an LWGEOM.
Definition: lwgeom.c:784
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
Definition: rt_raster.c:356
int rt_raster_generate_new_band(rt_raster raster, rt_pixtype pixtype, double initialvalue, uint32_t hasnodata, double nodatavalue, int index)
Generate a new inline band and add it to a raster.
Definition: rt_raster.c:485
int rt_raster_add_band(rt_raster raster, rt_band band, int index)
Add band data to a raster.
Definition: rt_raster.c:405
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:674
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition: rt_raster.c:82
rt_pixtype
Definition: librtcore.h:185
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
Definition: rt_band.c:714
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
Definition: rt_raster.c:48
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:1347
void * rt_raster_serialize(rt_raster raster)
Return this raster in serialized form.
Definition: rt_serialize.c:521
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:1745
@ ES_NONE
Definition: librtcore.h:180
rt_raster rt_raster_gdal_rasterize(const unsigned char *wkb, uint32_t wkb_len, const char *srs, uint32_t num_bands, rt_pixtype *pixtype, double *init, double *value, double *nodata, uint8_t *hasnodata, int *width, int *height, double *scale_x, double *scale_y, double *ul_xw, double *ul_yw, double *grid_xw, double *grid_yw, double *skew_x, double *skew_y, char **options)
Return a raster of the provided geometry.
Definition: rt_raster.c:2509
uint16_t rt_raster_get_num_bands(rt_raster raster)
Definition: rt_raster.c:372
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
Definition: rt_geometry.c:803
rt_errorstate rt_raster_iterator(rt_iterator itrset, uint16_t itrcount, rt_extenttype extenttype, rt_raster customextent, rt_pixtype pixtype, uint8_t hasnodata, double nodataval, uint16_t distancex, uint16_t distancey, rt_mask mask, void *userarg, int(*callback)(rt_iterator_arg arg, void *userarg, double *value, int *nodata), rt_raster *rtnraster)
n-raster iterator.
void rt_raster_set_srid(rt_raster raster, int32_t srid)
Set raster's SRID.
Definition: rt_raster.c:363
@ ET_INTERSECTION
Definition: librtcore.h:201
@ ET_FIRST
Definition: librtcore.h:203
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
Definition: rt_band.c:1730
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
Definition: rt_band.c:631
rt_errorstate rt_raster_from_two_rasters(rt_raster rast1, rt_raster rast2, rt_extenttype extenttype, rt_raster *rtnraster, double *offset)
Definition: rt_raster.c:3361
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.
Definition: rt_raster.c:706
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:1334
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
Definition: rt_raster.c:381
band
Definition: ovdump.py:57
gt
Definition: window.py:77
static rtpg_clip_arg rtpg_clip_arg_init()
static void rtpg_clip_arg_destroy(rtpg_clip_arg arg)
static int rtpg_clip_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata)
#define POSTGIS_RT_DEBUG(level, msg)
Definition: rtpostgis.h:61
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition: rtpostgis.h:65
rt_raster raster
Definition: librtcore.h:2443
uint16_t nband
Definition: librtcore.h:2444
uint8_t nbnodata
Definition: librtcore.h:2445
Struct definitions.
Definition: librtcore.h:2250
rtpg_clip_band band
rt_extenttype extenttype

References rtpg_clip_arg_t::band, ovdump::band, clamp_srid(), ES_NONE, ET_FIRST, ET_INTERSECTION, rtpg_clip_arg_t::extenttype, FALSE, gserialized_get_srid(), window::gt, rtpg_clip_band_t::hasnodata, lwgeom_force_2d(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_intersection(), lwgeom_is_empty(), lwgeom_ndims(), lwgeom_to_wkb(), rtpg_clip_arg_t::mask, rt_iterator_t::nband, rtpg_clip_band_t::nband, rt_iterator_t::nbnodata, rtpg_clip_band_t::nodataval, rtpg_clip_arg_t::numbands, POSTGIS_RT_DEBUG, POSTGIS_RT_DEBUGF, rt_iterator_t::raster, rtpg_clip_arg_t::raster, rt_band_get_hasnodata_flag(), rt_band_get_isnodata_flag(), rt_band_get_min_value(), rt_band_get_nodata(), rt_band_get_pixtype(), rt_raster_add_band(), rt_raster_deserialize(), rt_raster_destroy(), rt_raster_from_two_rasters(), rt_raster_gdal_rasterize(), rt_raster_generate_new_band(), rt_raster_get_band(), rt_raster_get_convex_hull(), rt_raster_get_geotransform_matrix(), rt_raster_get_num_bands(), rt_raster_get_srid(), rt_raster_has_band(), rt_raster_is_empty(), rt_raster_iterator(), rt_raster_new(), rt_raster_serialize(), rt_raster_set_srid(), rtpg_clip_arg_destroy(), rtpg_clip_arg_init(), rtpg_clip_callback(), rt_raster_serialized_t::size, SRID_UNKNOWN, and WKB_SFSQL.

Here is the call graph for this function: