PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ RASTER_clip()

Datum RASTER_clip ( PG_FUNCTION_ARGS  )

Definition at line 3013 of file rtpg_mapalgebra.c.

3014 {
3015  rt_pgraster *pgraster = NULL;
3016  LWGEOM *rastgeom = NULL;
3017  double gt[6] = {0};
3018  int32_t srid = SRID_UNKNOWN;
3019 
3020  rt_pgraster *pgrtn = NULL;
3021  rt_raster rtn = NULL;
3022 
3023  GSERIALIZED *gser = NULL;
3024  LWGEOM *geom = NULL;
3025  lwvarlena_t *wkb = NULL;
3026 
3027  ArrayType *array;
3028  Oid etype;
3029  Datum *e;
3030  bool *nulls;
3031 
3032  int16 typlen;
3033  bool typbyval;
3034  char typalign;
3035 
3036  int i = 0;
3037  int j = 0;
3038  int k = 0;
3039  rtpg_clip_arg arg = NULL;
3040  LWGEOM *tmpgeom = NULL;
3041 
3042  rt_pixtype pixtype;
3043  int hasnodata;
3044  double nodataval;
3045 
3046  double offset[4] = {0.};
3047  int input_x = 0;
3048  int input_y = 0;
3049  int mask_x = 0;
3050  int mask_y = 0;
3051  int x = 0;
3052  int y = 0;
3053  int width = 0;
3054  int height = 0;
3055  int mask_width = 0;
3056  int mask_height = 0;
3057  rt_band input_band = NULL;
3058  rt_band mask_band = NULL;
3059  rt_band output_band = NULL;
3060  double value;
3061  int isnodata;
3062 
3063  POSTGIS_RT_DEBUG(3, "Starting...");
3064 
3065  /* raster or geometry is NULL, return NULL */
3066  if (PG_ARGISNULL(0) || PG_ARGISNULL(2))
3067  PG_RETURN_NULL();
3068 
3069  /* init arg */
3070  arg = rtpg_clip_arg_init();
3071  if (arg == NULL) {
3072  elog(ERROR, "RASTER_clip: Could not initialize argument structure");
3073  PG_RETURN_NULL();
3074  }
3075 
3076  /* raster (0) */
3077  pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
3078 
3079  /* Get raster object */
3080  arg->raster = rt_raster_deserialize(pgraster, FALSE);
3081  if (arg->raster == NULL) {
3082  rtpg_clip_arg_destroy(arg);
3083  PG_FREE_IF_COPY(pgraster, 0);
3084  elog(ERROR, "RASTER_clip: Could not deserialize raster");
3085  PG_RETURN_NULL();
3086  }
3087 
3088  /* raster is empty, return empty raster */
3089  if (rt_raster_is_empty(arg->raster) || rt_raster_get_num_bands(arg->raster) == 0) {
3090  elog(NOTICE, "Input raster is empty or has no bands. Returning empty raster");
3091 
3092  rtpg_clip_arg_destroy(arg);
3093  PG_FREE_IF_COPY(pgraster, 0);
3094 
3095  rtn = rt_raster_new(0, 0);
3096  if (rtn == NULL) {
3097  elog(ERROR, "RASTER_clip: Could not create empty raster");
3098  PG_RETURN_NULL();
3099  }
3100 
3101  pgrtn = rt_raster_serialize(rtn);
3102  rt_raster_destroy(rtn);
3103  if (NULL == pgrtn)
3104  PG_RETURN_NULL();
3105 
3106  SET_VARSIZE(pgrtn, pgrtn->size);
3107  PG_RETURN_POINTER(pgrtn);
3108  }
3109 
3110  /* metadata */
3112  srid = clamp_srid(rt_raster_get_srid(arg->raster));
3113 
3114  /* geometry (2) */
3115  gser = PG_GETARG_GSERIALIZED_P(2);
3116  geom = lwgeom_from_gserialized(gser);
3117 
3118  /* Get a 2D version of the geometry if necessary */
3119  if (lwgeom_ndims(geom) > 2) {
3120  LWGEOM *geom2d = lwgeom_force_2d(geom);
3121  lwgeom_free(geom);
3122  geom = geom2d;
3123  }
3124 
3125  /* check that SRIDs match */
3126  if (srid != clamp_srid(gserialized_get_srid(gser))) {
3127  elog(NOTICE, "Geometry provided does not have the same SRID as the raster. Returning NULL");
3128 
3129  rtpg_clip_arg_destroy(arg);
3130  PG_FREE_IF_COPY(pgraster, 0);
3131  lwgeom_free(geom);
3132  PG_FREE_IF_COPY(gser, 2);
3133 
3134  PG_RETURN_NULL();
3135  }
3136 
3137  /* crop (4) */
3138  if (!PG_ARGISNULL(4) && !PG_GETARG_BOOL(4))
3139  arg->extenttype = ET_FIRST;
3140 
3141  /* get intersection geometry of input raster and input geometry */
3142  if (rt_raster_get_convex_hull(arg->raster, &rastgeom) != ES_NONE) {
3143 
3144  rtpg_clip_arg_destroy(arg);
3145  PG_FREE_IF_COPY(pgraster, 0);
3146  lwgeom_free(geom);
3147  PG_FREE_IF_COPY(gser, 2);
3148 
3149  elog(ERROR, "RASTER_clip: Could not get convex hull of raster");
3150  PG_RETURN_NULL();
3151  }
3152 
3153  tmpgeom = lwgeom_intersection(rastgeom, geom);
3154  lwgeom_free(rastgeom);
3155  lwgeom_free(geom);
3156  PG_FREE_IF_COPY(gser, 2);
3157  geom = tmpgeom;
3158 
3159  /* intersection is empty AND extent type is INTERSECTION, return empty */
3160  if (lwgeom_is_empty(geom) && arg->extenttype == ET_INTERSECTION) {
3161  elog(NOTICE, "The input raster and input geometry do not intersect. Returning empty raster");
3162 
3163  rtpg_clip_arg_destroy(arg);
3164  PG_FREE_IF_COPY(pgraster, 0);
3165  lwgeom_free(geom);
3166 
3167  rtn = rt_raster_new(0, 0);
3168  if (rtn == NULL) {
3169  elog(ERROR, "RASTER_clip: Could not create empty raster");
3170  PG_RETURN_NULL();
3171  }
3172 
3173  pgrtn = rt_raster_serialize(rtn);
3174  rt_raster_destroy(rtn);
3175  if (NULL == pgrtn)
3176  PG_RETURN_NULL();
3177 
3178  SET_VARSIZE(pgrtn, pgrtn->size);
3179  PG_RETURN_POINTER(pgrtn);
3180  }
3181 
3182  /* nband (1) */
3183  if (!PG_ARGISNULL(1)) {
3184  array = PG_GETARG_ARRAYTYPE_P(1);
3185  etype = ARR_ELEMTYPE(array);
3186  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3187 
3188  switch (etype) {
3189  case INT2OID:
3190  case INT4OID:
3191  break;
3192  default:
3193  rtpg_clip_arg_destroy(arg);
3194  PG_FREE_IF_COPY(pgraster, 0);
3195  lwgeom_free(geom);
3196  elog(ERROR, "RASTER_clip: Invalid data type for band indexes");
3197  PG_RETURN_NULL();
3198  break;
3199  }
3200 
3201  deconstruct_array(
3202  array, etype,
3203  typlen, typbyval, typalign,
3204  &e, &nulls, &(arg->numbands)
3205  );
3206 
3207  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3208  if (arg->band == NULL) {
3209  rtpg_clip_arg_destroy(arg);
3210  PG_FREE_IF_COPY(pgraster, 0);
3211  lwgeom_free(geom);
3212  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3213  PG_RETURN_NULL();
3214  }
3215 
3216  for (i = 0, j = 0; i < arg->numbands; i++) {
3217  if (nulls[i]) continue;
3218 
3219  switch (etype) {
3220  case INT2OID:
3221  arg->band[j].nband = DatumGetInt16(e[i]) - 1;
3222  break;
3223  case INT4OID:
3224  arg->band[j].nband = DatumGetInt32(e[i]) - 1;
3225  break;
3226  }
3227 
3228  j++;
3229  }
3230 
3231  if (j < arg->numbands) {
3232  arg->band = repalloc(arg->band, sizeof(struct rtpg_clip_band_t) * j);
3233  if (arg->band == NULL) {
3234  rtpg_clip_arg_destroy(arg);
3235  PG_FREE_IF_COPY(pgraster, 0);
3236  lwgeom_free(geom);
3237  elog(ERROR, "RASTER_clip: Could not reallocate memory for band arguments");
3238  PG_RETURN_NULL();
3239  }
3240 
3241  arg->numbands = j;
3242  }
3243 
3244  /* validate band */
3245  for (i = 0; i < arg->numbands; i++) {
3246  if (!rt_raster_has_band(arg->raster, arg->band[i].nband)) {
3247  elog(NOTICE, "Band at index %d not found in raster", arg->band[i].nband + 1);
3248  rtpg_clip_arg_destroy(arg);
3249  PG_FREE_IF_COPY(pgraster, 0);
3250  lwgeom_free(geom);
3251  PG_RETURN_NULL();
3252  }
3253 
3254  arg->band[i].hasnodata = 0;
3255  arg->band[i].nodataval = 0;
3256  }
3257  }
3258  else {
3260 
3261  /* raster may have no bands */
3262  if (arg->numbands) {
3263  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3264  if (arg->band == NULL) {
3265 
3266  rtpg_clip_arg_destroy(arg);
3267  PG_FREE_IF_COPY(pgraster, 0);
3268  lwgeom_free(geom);
3269 
3270  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3271  PG_RETURN_NULL();
3272  }
3273 
3274  for (i = 0; i < arg->numbands; i++) {
3275  arg->band[i].nband = i;
3276  arg->band[i].hasnodata = 0;
3277  arg->band[i].nodataval = 0;
3278  }
3279  }
3280  }
3281 
3282  /* nodataval (3) */
3283  if (!PG_ARGISNULL(3)) {
3284  array = PG_GETARG_ARRAYTYPE_P(3);
3285  etype = ARR_ELEMTYPE(array);
3286  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3287 
3288  switch (etype) {
3289  case FLOAT4OID:
3290  case FLOAT8OID:
3291  break;
3292  default:
3293  rtpg_clip_arg_destroy(arg);
3294  PG_FREE_IF_COPY(pgraster, 0);
3295  lwgeom_free(geom);
3296  elog(ERROR, "RASTER_clip: Invalid data type for NODATA values");
3297  PG_RETURN_NULL();
3298  break;
3299  }
3300 
3301  deconstruct_array(
3302  array, etype,
3303  typlen, typbyval, typalign,
3304  &e, &nulls, &k
3305  );
3306 
3307  /* it doesn't matter if there are more nodataval */
3308  for (i = 0, j = 0; i < arg->numbands; i++, j++) {
3309  /* cap j to the last nodataval element */
3310  if (j >= k)
3311  j = k - 1;
3312 
3313  if (nulls[j])
3314  continue;
3315 
3316  arg->band[i].hasnodata = 1;
3317  switch (etype) {
3318  case FLOAT4OID:
3319  arg->band[i].nodataval = DatumGetFloat4(e[j]);
3320  break;
3321  case FLOAT8OID:
3322  arg->band[i].nodataval = DatumGetFloat8(e[j]);
3323  break;
3324  }
3325  }
3326  }
3327 
3328  /* get wkb of geometry */
3329  POSTGIS_RT_DEBUG(3, "getting wkb of geometry");
3330  wkb = lwgeom_to_wkb_varlena(geom, WKB_SFSQL);
3331  lwgeom_free(geom);
3332 
3333  /* rasterize geometry */
3334  arg->mask = rt_raster_gdal_rasterize((unsigned char *)wkb->data,
3335  LWSIZE_GET(wkb->size) - LWVARHDRSZ,
3336  NULL,
3337  0,
3338  NULL,
3339  NULL,
3340  NULL,
3341  NULL,
3342  NULL,
3343  NULL,
3344  NULL,
3345  &(gt[1]),
3346  &(gt[5]),
3347  NULL,
3348  NULL,
3349  &(gt[0]),
3350  &(gt[3]),
3351  &(gt[2]),
3352  &(gt[4]),
3353  NULL);
3354 
3355  pfree(wkb);
3356  if (arg->mask == NULL) {
3357  rtpg_clip_arg_destroy(arg);
3358  PG_FREE_IF_COPY(pgraster, 0);
3359  elog(ERROR, "RASTER_clip: Could not rasterize intersection geometry");
3360  PG_RETURN_NULL();
3361  }
3362 
3363  /* set SRID */
3364  rt_raster_set_srid(arg->mask, srid);
3365 
3366  mask_width = rt_raster_get_width(arg->mask);
3367  mask_height = rt_raster_get_height(arg->mask);
3368 
3369  if (rt_raster_from_two_rasters(arg->raster, arg->mask, arg->extenttype, &rtn, offset) != ES_NONE) {
3370  rtpg_clip_arg_destroy(arg);
3371  PG_FREE_IF_COPY(pgraster, 0);
3372  elog(ERROR, "RASTER_clip: Could not compute extent of rasters");
3373  PG_RETURN_NULL();
3374  }
3375 
3376  width = rt_raster_get_width(rtn);
3377  height = rt_raster_get_height(rtn);
3378 
3379  mask_band = rt_raster_get_band(arg->mask, 0);
3380 
3381  for (i = 0; i < arg->numbands; i++) {
3382  input_band = rt_raster_get_band(arg->raster, arg->band[i].nband);
3383 
3384  /* band metadata */
3385  pixtype = rt_band_get_pixtype(input_band);
3386 
3387  if (arg->band[i].hasnodata) {
3388  hasnodata = 1;
3389  nodataval = arg->band[i].nodataval;
3390  }
3391  else if (rt_band_get_hasnodata_flag(input_band)) {
3392  hasnodata = 1;
3393  rt_band_get_nodata(input_band, &nodataval);
3394  }
3395  else {
3396  hasnodata = 0;
3397  nodataval = rt_band_get_min_value(input_band);
3398  }
3399 
3400  if (rt_raster_generate_new_band(rtn, pixtype, nodataval, hasnodata, nodataval, i) < 0) {
3401  rtpg_clip_arg_destroy(arg);
3402  PG_FREE_IF_COPY(pgraster, 0);
3403  elog(ERROR, "RASTER_clip: Could not add new band in output raster");
3404  PG_RETURN_NULL();
3405  }
3406 
3407  if (rt_band_get_isnodata_flag(input_band)) {
3408  continue;
3409  }
3410 
3411  output_band = rt_raster_get_band(rtn, arg->band[i].nband);
3412 
3413  if (!mask_band) {
3414  continue;
3415  }
3416 
3417  for (y = 0; y < height; y++) {
3418  for (x = 0; x < width; x++) {
3419  mask_x = x - (int)offset[2];
3420  mask_y = y - (int)offset[3];
3421 
3422  if (!(
3423  mask_x >= 0 &&
3424  mask_x < mask_width &&
3425  mask_y >= 0 &&
3426  mask_y < mask_height
3427  )) {
3428  continue;
3429  }
3430 
3431  if (rt_band_get_pixel(mask_band, mask_x, mask_y, &value, &isnodata) != ES_NONE) {
3432  rtpg_clip_arg_destroy(arg);
3433  PG_FREE_IF_COPY(pgraster, 0);
3434  elog(ERROR, "RASTER_clip: Could not get pixel value");
3435  PG_RETURN_NULL();
3436  }
3437 
3438  if (isnodata) {
3439  continue;
3440  }
3441 
3442  input_x = x - (int)offset[0];
3443  input_y = y - (int)offset[1];
3444 
3445  if (rt_band_get_pixel(input_band, input_x, input_y, &value, &isnodata) != ES_NONE) {
3446  rtpg_clip_arg_destroy(arg);
3447  PG_FREE_IF_COPY(pgraster, 0);
3448  elog(ERROR, "RASTER_clip: Could not get pixel value");
3449  PG_RETURN_NULL();
3450  }
3451 
3452  if (isnodata) {
3453  continue;
3454  }
3455 
3456  if (rt_band_set_pixel(output_band, x, y, value, NULL)) {
3457  rtpg_clip_arg_destroy(arg);
3458  PG_FREE_IF_COPY(pgraster, 0);
3459  elog(ERROR, "RASTER_clip: Could not set pixel value");
3460  PG_RETURN_NULL();
3461  }
3462  }
3463  }
3464  }
3465 
3466  rtpg_clip_arg_destroy(arg);
3467  PG_FREE_IF_COPY(pgraster, 0);
3468 
3469  pgrtn = rt_raster_serialize(rtn);
3470  rt_raster_destroy(rtn);
3471 
3472  POSTGIS_RT_DEBUG(3, "Finished");
3473 
3474  if (!pgrtn)
3475  PG_RETURN_NULL();
3476 
3477  SET_VARSIZE(pgrtn, pgrtn->size);
3478  PG_RETURN_POINTER(pgrtn);
3479 }
#define FALSE
Definition: dbfopen.c:72
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
Definition: gserialized.c:126
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
int lwgeom_ndims(const LWGEOM *geom)
Return the number of dimensions (2, 3, 4) in a geometry.
Definition: lwgeom.c:955
#define LWVARHDRSZ
Definition: liblwgeom.h:326
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1155
LWGEOM * lwgeom_intersection(const LWGEOM *geom1, const LWGEOM *geom2)
#define LWSIZE_GET(varsize)
Macro for reading the size from the GSERIALIZED size attribute.
Definition: liblwgeom.h:339
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:230
lwvarlena_t * lwgeom_to_wkb_varlena(const LWGEOM *geom, uint8_t variant)
Definition: lwout_wkb.c:851
#define WKB_SFSQL
Definition: liblwgeom.h:2158
int32_t clamp_srid(int32_t srid)
Return a valid SRID from an arbitrary integer Raises a notice if what comes out is different from wha...
Definition: lwutil.c:333
LWGEOM * lwgeom_force_2d(const LWGEOM *geom)
Strip out the Z/M components of an LWGEOM.
Definition: lwgeom.c:793
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
Definition: rt_raster.c:360
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:489
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:674
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition: rt_band.c:1376
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition: rt_raster.c:86
rt_pixtype
Definition: librtcore.h:187
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:52
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
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:1902
rt_errorstate rt_band_set_pixel(rt_band band, int x, int y, double val, int *converted)
Set single pixel's value.
Definition: rt_band.c:974
@ ES_NONE
Definition: librtcore.h:182
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:2618
uint16_t rt_raster_get_num_bands(rt_raster raster)
Definition: rt_raster.c:376
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
Definition: rt_geometry.c:838
uint16_t rt_raster_get_height(rt_raster raster)
Definition: rt_raster.c:133
void rt_raster_set_srid(rt_raster raster, int32_t srid)
Set raster's SRID.
Definition: rt_raster.c:367
@ ET_INTERSECTION
Definition: librtcore.h:203
@ ET_FIRST
Definition: librtcore.h:205
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
Definition: rt_band.c:1887
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
Definition: rt_band.c:631
uint16_t rt_raster_get_width(rt_raster raster)
Definition: rt_raster.c:125
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:3464
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.
Definition: rt_raster.c:710
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
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
Definition: rt_raster.c:385
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition: lwinline.h:203
int value
Definition: genraster.py:62
gt
Definition: window.py:78
static rtpg_clip_arg rtpg_clip_arg_init()
static void rtpg_clip_arg_destroy(rtpg_clip_arg arg)
#define POSTGIS_RT_DEBUG(level, msg)
Definition: rtpostgis.h:69
uint32_t size
Definition: liblwgeom.h:322
char data[]
Definition: liblwgeom.h:323
Struct definitions.
Definition: librtcore.h:2396
rtpg_clip_band band
rt_extenttype extenttype

References rtpg_clip_arg_t::band, clamp_srid(), lwvarlena_t::data, 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_varlena(), LWSIZE_GET, LWVARHDRSZ, rtpg_clip_arg_t::mask, rtpg_clip_band_t::nband, rtpg_clip_band_t::nodataval, rtpg_clip_arg_t::numbands, POSTGIS_RT_DEBUG, 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_pixel(), rt_band_get_pixtype(), rt_band_set_pixel(), 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_height(), rt_raster_get_num_bands(), rt_raster_get_srid(), rt_raster_get_width(), rt_raster_has_band(), rt_raster_is_empty(), rt_raster_new(), rt_raster_serialize(), rt_raster_set_srid(), rtpg_clip_arg_destroy(), rtpg_clip_arg_init(), lwvarlena_t::size, rt_raster_serialized_t::size, SRID_UNKNOWN, genraster::value, WKB_SFSQL, pixval::x, and pixval::y.

Here is the call graph for this function: