PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ RASTER_clip()

Datum RASTER_clip ( PG_FUNCTION_ARGS  )

Definition at line 2967 of file rtpg_mapalgebra.c.

2968 {
2969  rt_pgraster *pgraster = NULL;
2970  LWGEOM *rastgeom = NULL;
2971  double gt[6] = {0};
2972  int32_t srid = SRID_UNKNOWN;
2973 
2974  rt_pgraster *pgrtn = NULL;
2975  rt_raster rtn = NULL;
2976 
2977  GSERIALIZED *gser = NULL;
2978  LWGEOM *geom = NULL;
2979  lwvarlena_t *wkb = NULL;
2980 
2981  ArrayType *array;
2982  Oid etype;
2983  Datum *e;
2984  bool *nulls;
2985 
2986  int16 typlen;
2987  bool typbyval;
2988  char typalign;
2989 
2990  int i = 0;
2991  int j = 0;
2992  int k = 0;
2993  rtpg_clip_arg arg = NULL;
2994  LWGEOM *tmpgeom = NULL;
2995 
2996  rt_pixtype pixtype;
2997  int hasnodata;
2998  double nodataval;
2999 
3000  double offset[4] = {0.};
3001  int input_x = 0;
3002  int input_y = 0;
3003  int mask_x = 0;
3004  int mask_y = 0;
3005  int x = 0;
3006  int y = 0;
3007  int width = 0;
3008  int height = 0;
3009  int mask_width = 0;
3010  int mask_height = 0;
3011  rt_band input_band = NULL;
3012  rt_band mask_band = NULL;
3013  rt_band output_band = NULL;
3014  double value;
3015  int isnodata;
3016 
3017  POSTGIS_RT_DEBUG(3, "Starting...");
3018 
3019  /* raster or geometry is NULL, return NULL */
3020  if (PG_ARGISNULL(0) || PG_ARGISNULL(2))
3021  PG_RETURN_NULL();
3022 
3023  /* init arg */
3024  arg = rtpg_clip_arg_init();
3025  if (arg == NULL) {
3026  elog(ERROR, "RASTER_clip: Could not initialize argument structure");
3027  PG_RETURN_NULL();
3028  }
3029 
3030  /* raster (0) */
3031  pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
3032 
3033  /* Get raster object */
3034  arg->raster = rt_raster_deserialize(pgraster, FALSE);
3035  if (arg->raster == NULL) {
3036  rtpg_clip_arg_destroy(arg);
3037  PG_FREE_IF_COPY(pgraster, 0);
3038  elog(ERROR, "RASTER_clip: Could not deserialize raster");
3039  PG_RETURN_NULL();
3040  }
3041 
3042  /* raster is empty, return empty raster */
3043  if (rt_raster_is_empty(arg->raster) || rt_raster_get_num_bands(arg->raster) == 0) {
3044  elog(NOTICE, "Input raster is empty or has no bands. Returning empty raster");
3045 
3046  rtpg_clip_arg_destroy(arg);
3047  PG_FREE_IF_COPY(pgraster, 0);
3048 
3049  rtn = rt_raster_new(0, 0);
3050  if (rtn == NULL) {
3051  elog(ERROR, "RASTER_clip: Could not create empty raster");
3052  PG_RETURN_NULL();
3053  }
3054 
3055  pgrtn = rt_raster_serialize(rtn);
3056  rt_raster_destroy(rtn);
3057  if (NULL == pgrtn)
3058  PG_RETURN_NULL();
3059 
3060  SET_VARSIZE(pgrtn, pgrtn->size);
3061  PG_RETURN_POINTER(pgrtn);
3062  }
3063 
3064  /* metadata */
3066  srid = clamp_srid(rt_raster_get_srid(arg->raster));
3067 
3068  /* geometry (2) */
3069  gser = PG_GETARG_GSERIALIZED_P(2);
3070  geom = lwgeom_from_gserialized(gser);
3071 
3072  /* Get a 2D version of the geometry if necessary */
3073  if (lwgeom_ndims(geom) > 2) {
3074  LWGEOM *geom2d = lwgeom_force_2d(geom);
3075  lwgeom_free(geom);
3076  geom = geom2d;
3077  }
3078 
3079  /* check that SRIDs match */
3080  if (srid != clamp_srid(gserialized_get_srid(gser))) {
3081  elog(NOTICE, "Geometry provided does not have the same SRID as the raster. Returning NULL");
3082 
3083  rtpg_clip_arg_destroy(arg);
3084  PG_FREE_IF_COPY(pgraster, 0);
3085  lwgeom_free(geom);
3086  PG_FREE_IF_COPY(gser, 2);
3087 
3088  PG_RETURN_NULL();
3089  }
3090 
3091  /* crop (4) */
3092  if (!PG_ARGISNULL(4) && !PG_GETARG_BOOL(4))
3093  arg->extenttype = ET_FIRST;
3094 
3095  /* get intersection geometry of input raster and input geometry */
3096  if (rt_raster_get_convex_hull(arg->raster, &rastgeom) != ES_NONE) {
3097 
3098  rtpg_clip_arg_destroy(arg);
3099  PG_FREE_IF_COPY(pgraster, 0);
3100  lwgeom_free(geom);
3101  PG_FREE_IF_COPY(gser, 2);
3102 
3103  elog(ERROR, "RASTER_clip: Could not get convex hull of raster");
3104  PG_RETURN_NULL();
3105  }
3106 
3107  tmpgeom = lwgeom_intersection(rastgeom, geom);
3108  lwgeom_free(rastgeom);
3109  lwgeom_free(geom);
3110  PG_FREE_IF_COPY(gser, 2);
3111  geom = tmpgeom;
3112 
3113  /* intersection is empty AND extent type is INTERSECTION, return empty */
3114  if (lwgeom_is_empty(geom) && arg->extenttype == ET_INTERSECTION) {
3115  elog(NOTICE, "The input raster and input geometry do not intersect. Returning empty raster");
3116 
3117  rtpg_clip_arg_destroy(arg);
3118  PG_FREE_IF_COPY(pgraster, 0);
3119  lwgeom_free(geom);
3120 
3121  rtn = rt_raster_new(0, 0);
3122  if (rtn == NULL) {
3123  elog(ERROR, "RASTER_clip: Could not create empty raster");
3124  PG_RETURN_NULL();
3125  }
3126 
3127  pgrtn = rt_raster_serialize(rtn);
3128  rt_raster_destroy(rtn);
3129  if (NULL == pgrtn)
3130  PG_RETURN_NULL();
3131 
3132  SET_VARSIZE(pgrtn, pgrtn->size);
3133  PG_RETURN_POINTER(pgrtn);
3134  }
3135 
3136  /* nband (1) */
3137  if (!PG_ARGISNULL(1)) {
3138  array = PG_GETARG_ARRAYTYPE_P(1);
3139  etype = ARR_ELEMTYPE(array);
3140  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3141 
3142  switch (etype) {
3143  case INT2OID:
3144  case INT4OID:
3145  break;
3146  default:
3147  rtpg_clip_arg_destroy(arg);
3148  PG_FREE_IF_COPY(pgraster, 0);
3149  lwgeom_free(geom);
3150  elog(ERROR, "RASTER_clip: Invalid data type for band indexes");
3151  PG_RETURN_NULL();
3152  break;
3153  }
3154 
3155  deconstruct_array(
3156  array, etype,
3157  typlen, typbyval, typalign,
3158  &e, &nulls, &(arg->numbands)
3159  );
3160 
3161  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3162  if (arg->band == NULL) {
3163  rtpg_clip_arg_destroy(arg);
3164  PG_FREE_IF_COPY(pgraster, 0);
3165  lwgeom_free(geom);
3166  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3167  PG_RETURN_NULL();
3168  }
3169 
3170  for (i = 0, j = 0; i < arg->numbands; i++) {
3171  if (nulls[i]) continue;
3172 
3173  switch (etype) {
3174  case INT2OID:
3175  arg->band[j].nband = DatumGetInt16(e[i]) - 1;
3176  break;
3177  case INT4OID:
3178  arg->band[j].nband = DatumGetInt32(e[i]) - 1;
3179  break;
3180  }
3181 
3182  j++;
3183  }
3184 
3185  if (j < arg->numbands) {
3186  arg->band = repalloc(arg->band, sizeof(struct rtpg_clip_band_t) * j);
3187  if (arg->band == NULL) {
3188  rtpg_clip_arg_destroy(arg);
3189  PG_FREE_IF_COPY(pgraster, 0);
3190  lwgeom_free(geom);
3191  elog(ERROR, "RASTER_clip: Could not reallocate memory for band arguments");
3192  PG_RETURN_NULL();
3193  }
3194 
3195  arg->numbands = j;
3196  }
3197 
3198  /* validate band */
3199  for (i = 0; i < arg->numbands; i++) {
3200  if (!rt_raster_has_band(arg->raster, arg->band[i].nband)) {
3201  elog(NOTICE, "Band at index %d not found in raster", arg->band[i].nband + 1);
3202  rtpg_clip_arg_destroy(arg);
3203  PG_FREE_IF_COPY(pgraster, 0);
3204  lwgeom_free(geom);
3205  PG_RETURN_NULL();
3206  }
3207 
3208  arg->band[i].hasnodata = 0;
3209  arg->band[i].nodataval = 0;
3210  }
3211  }
3212  else {
3214 
3215  /* raster may have no bands */
3216  if (arg->numbands) {
3217  arg->band = palloc(sizeof(struct rtpg_clip_band_t) * arg->numbands);
3218  if (arg->band == NULL) {
3219 
3220  rtpg_clip_arg_destroy(arg);
3221  PG_FREE_IF_COPY(pgraster, 0);
3222  lwgeom_free(geom);
3223 
3224  elog(ERROR, "RASTER_clip: Could not allocate memory for band arguments");
3225  PG_RETURN_NULL();
3226  }
3227 
3228  for (i = 0; i < arg->numbands; i++) {
3229  arg->band[i].nband = i;
3230  arg->band[i].hasnodata = 0;
3231  arg->band[i].nodataval = 0;
3232  }
3233  }
3234  }
3235 
3236  /* nodataval (3) */
3237  if (!PG_ARGISNULL(3)) {
3238  array = PG_GETARG_ARRAYTYPE_P(3);
3239  etype = ARR_ELEMTYPE(array);
3240  get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3241 
3242  switch (etype) {
3243  case FLOAT4OID:
3244  case FLOAT8OID:
3245  break;
3246  default:
3247  rtpg_clip_arg_destroy(arg);
3248  PG_FREE_IF_COPY(pgraster, 0);
3249  lwgeom_free(geom);
3250  elog(ERROR, "RASTER_clip: Invalid data type for NODATA values");
3251  PG_RETURN_NULL();
3252  break;
3253  }
3254 
3255  deconstruct_array(
3256  array, etype,
3257  typlen, typbyval, typalign,
3258  &e, &nulls, &k
3259  );
3260 
3261  /* it doesn't matter if there are more nodataval */
3262  for (i = 0, j = 0; i < arg->numbands; i++, j++) {
3263  /* cap j to the last nodataval element */
3264  if (j >= k)
3265  j = k - 1;
3266 
3267  if (nulls[j])
3268  continue;
3269 
3270  arg->band[i].hasnodata = 1;
3271  switch (etype) {
3272  case FLOAT4OID:
3273  arg->band[i].nodataval = DatumGetFloat4(e[j]);
3274  break;
3275  case FLOAT8OID:
3276  arg->band[i].nodataval = DatumGetFloat8(e[j]);
3277  break;
3278  }
3279  }
3280  }
3281 
3282  /* get wkb of geometry */
3283  POSTGIS_RT_DEBUG(3, "getting wkb of geometry");
3284  wkb = lwgeom_to_wkb_varlena(geom, WKB_SFSQL);
3285  lwgeom_free(geom);
3286 
3287  /* rasterize geometry */
3288  arg->mask = rt_raster_gdal_rasterize((unsigned char *)wkb->data,
3289  LWSIZE_GET(wkb->size) - LWVARHDRSZ,
3290  NULL,
3291  0,
3292  NULL,
3293  NULL,
3294  NULL,
3295  NULL,
3296  NULL,
3297  NULL,
3298  NULL,
3299  &(gt[1]),
3300  &(gt[5]),
3301  NULL,
3302  NULL,
3303  &(gt[0]),
3304  &(gt[3]),
3305  &(gt[2]),
3306  &(gt[4]),
3307  NULL);
3308 
3309  pfree(wkb);
3310  if (arg->mask == NULL) {
3311  rtpg_clip_arg_destroy(arg);
3312  PG_FREE_IF_COPY(pgraster, 0);
3313  elog(ERROR, "RASTER_clip: Could not rasterize intersection geometry");
3314  PG_RETURN_NULL();
3315  }
3316 
3317  /* set SRID */
3318  rt_raster_set_srid(arg->mask, srid);
3319 
3320  mask_width = rt_raster_get_width(arg->mask);
3321  mask_height = rt_raster_get_height(arg->mask);
3322 
3323  if (rt_raster_from_two_rasters(arg->raster, arg->mask, arg->extenttype, &rtn, offset) != ES_NONE) {
3324  rtpg_clip_arg_destroy(arg);
3325  PG_FREE_IF_COPY(pgraster, 0);
3326  elog(ERROR, "RASTER_clip: Could not compute extent of rasters");
3327  PG_RETURN_NULL();
3328  }
3329 
3330  width = rt_raster_get_width(rtn);
3331  height = rt_raster_get_height(rtn);
3332 
3333  mask_band = rt_raster_get_band(arg->mask, 0);
3334 
3335  for (i = 0; i < arg->numbands; i++) {
3336  input_band = rt_raster_get_band(arg->raster, arg->band[i].nband);
3337 
3338  /* band metadata */
3339  pixtype = rt_band_get_pixtype(input_band);
3340 
3341  if (arg->band[i].hasnodata) {
3342  hasnodata = 1;
3343  nodataval = arg->band[i].nodataval;
3344  }
3345  else if (rt_band_get_hasnodata_flag(input_band)) {
3346  hasnodata = 1;
3347  rt_band_get_nodata(input_band, &nodataval);
3348  }
3349  else {
3350  hasnodata = 0;
3351  nodataval = rt_band_get_min_value(input_band);
3352  }
3353 
3354  if (rt_raster_generate_new_band(rtn, pixtype, nodataval, hasnodata, nodataval, i) < 0) {
3355  rtpg_clip_arg_destroy(arg);
3356  PG_FREE_IF_COPY(pgraster, 0);
3357  elog(ERROR, "RASTER_clip: Could not add new band in output raster");
3358  PG_RETURN_NULL();
3359  }
3360 
3361  if (rt_band_get_isnodata_flag(input_band)) {
3362  continue;
3363  }
3364 
3365  output_band = rt_raster_get_band(rtn, arg->band[i].nband);
3366 
3367  if (!mask_band) {
3368  continue;
3369  }
3370 
3371  for (y = 0; y < height; y++) {
3372  for (x = 0; x < width; x++) {
3373  mask_x = x - (int)offset[2];
3374  mask_y = y - (int)offset[3];
3375 
3376  if (!(
3377  mask_x >= 0 &&
3378  mask_x < mask_width &&
3379  mask_y >= 0 &&
3380  mask_y < mask_height
3381  )) {
3382  continue;
3383  }
3384 
3385  if (rt_band_get_pixel(mask_band, mask_x, mask_y, &value, &isnodata) != ES_NONE) {
3386  rtpg_clip_arg_destroy(arg);
3387  PG_FREE_IF_COPY(pgraster, 0);
3388  elog(ERROR, "RASTER_clip: Could not get pixel value");
3389  PG_RETURN_NULL();
3390  }
3391 
3392  if (isnodata) {
3393  continue;
3394  }
3395 
3396  input_x = x - (int)offset[0];
3397  input_y = y - (int)offset[1];
3398 
3399  if (rt_band_get_pixel(input_band, input_x, input_y, &value, &isnodata) != ES_NONE) {
3400  rtpg_clip_arg_destroy(arg);
3401  PG_FREE_IF_COPY(pgraster, 0);
3402  elog(ERROR, "RASTER_clip: Could not get pixel value");
3403  PG_RETURN_NULL();
3404  }
3405 
3406  if (isnodata) {
3407  continue;
3408  }
3409 
3410  if (rt_band_set_pixel(output_band, x, y, value, NULL)) {
3411  rtpg_clip_arg_destroy(arg);
3412  PG_FREE_IF_COPY(pgraster, 0);
3413  elog(ERROR, "RASTER_clip: Could not set pixel value");
3414  PG_RETURN_NULL();
3415  }
3416  }
3417  }
3418  }
3419 
3420  rtpg_clip_arg_destroy(arg);
3421  PG_FREE_IF_COPY(pgraster, 0);
3422 
3423  pgrtn = rt_raster_serialize(rtn);
3424  rt_raster_destroy(rtn);
3425 
3426  POSTGIS_RT_DEBUG(3, "Finished");
3427 
3428  if (!pgrtn)
3429  PG_RETURN_NULL();
3430 
3431  SET_VARSIZE(pgrtn, pgrtn->size);
3432  PG_RETURN_POINTER(pgrtn);
3433 }
#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:311
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:324
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:215
lwvarlena_t * lwgeom_to_wkb_varlena(const LWGEOM *geom, uint8_t variant)
Definition: lwout_wkb.c:851
#define WKB_SFSQL
Definition: liblwgeom.h:2176
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:65
uint32_t size
Definition: liblwgeom.h:307
char data[]
Definition: liblwgeom.h:308
Struct definitions.
Definition: librtcore.h:2403
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: