3038 unsigned char *wkb = NULL;
3067 if (PG_ARGISNULL(0) || PG_ARGISNULL(2))
3073 elog(ERROR,
"RASTER_clip: Could not initialize argument structure");
3078 pgraster = (
rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
3082 if (arg->
raster == NULL) {
3084 PG_FREE_IF_COPY(pgraster, 0);
3085 elog(ERROR,
"RASTER_clip: Could not deserialize raster");
3091 elog(NOTICE,
"Input raster is empty or has no bands. Returning empty raster");
3094 PG_FREE_IF_COPY(pgraster, 0);
3098 elog(ERROR,
"RASTER_clip: Could not create empty raster");
3107 SET_VARSIZE(pgrtn, pgrtn->
size);
3108 PG_RETURN_POINTER(pgrtn);
3116 gser = PG_GETARG_GSERIALIZED_P(2);
3128 elog(NOTICE,
"Geometry provided does not have the same SRID as the raster. Returning NULL");
3131 PG_FREE_IF_COPY(pgraster, 0);
3133 PG_FREE_IF_COPY(gser, 2);
3139 if (!PG_ARGISNULL(4) && !PG_GETARG_BOOL(4))
3146 PG_FREE_IF_COPY(pgraster, 0);
3148 PG_FREE_IF_COPY(gser, 2);
3150 elog(ERROR,
"RASTER_clip: Could not get convex hull of raster");
3157 PG_FREE_IF_COPY(gser, 2);
3162 elog(NOTICE,
"The input raster and input geometry do not intersect. Returning empty raster");
3165 PG_FREE_IF_COPY(pgraster, 0);
3170 elog(ERROR,
"RASTER_clip: Could not create empty raster");
3179 SET_VARSIZE(pgrtn, pgrtn->
size);
3180 PG_RETURN_POINTER(pgrtn);
3184 if (!PG_ARGISNULL(1)) {
3185 array = PG_GETARG_ARRAYTYPE_P(1);
3186 etype = ARR_ELEMTYPE(array);
3187 get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3195 PG_FREE_IF_COPY(pgraster, 0);
3197 elog(ERROR,
"RASTER_clip: Invalid data type for band indexes");
3204 typlen, typbyval, typalign,
3209 if (arg->
band == NULL) {
3211 PG_FREE_IF_COPY(pgraster, 0);
3213 elog(ERROR,
"RASTER_clip: Could not allocate memory for band arguments");
3217 for (i = 0, j = 0; i < arg->
numbands; i++) {
3218 if (nulls[i])
continue;
3222 arg->
band[j].
nband = DatumGetInt16(e[i]) - 1;
3225 arg->
band[j].
nband = DatumGetInt32(e[i]) - 1;
3232 if (j < arg->numbands) {
3234 if (arg->
band == NULL) {
3236 PG_FREE_IF_COPY(pgraster, 0);
3238 elog(ERROR,
"RASTER_clip: Could not reallocate memory for band arguments");
3246 for (i = 0; i < arg->
numbands; i++) {
3248 elog(NOTICE,
"Band at index %d not found in raster", arg->
band[i].
nband + 1);
3250 PG_FREE_IF_COPY(pgraster, 0);
3265 if (arg->
band == NULL) {
3268 PG_FREE_IF_COPY(pgraster, 0);
3271 elog(ERROR,
"RASTER_clip: Could not allocate memory for band arguments");
3275 for (i = 0; i < arg->
numbands; i++) {
3284 if (!PG_ARGISNULL(3)) {
3285 array = PG_GETARG_ARRAYTYPE_P(3);
3286 etype = ARR_ELEMTYPE(array);
3287 get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
3295 PG_FREE_IF_COPY(pgraster, 0);
3297 elog(ERROR,
"RASTER_clip: Invalid data type for NODATA values");
3304 typlen, typbyval, typalign,
3309 for (i = 0, j = 0; i < arg->
numbands; i++, j++) {
3350 if (arg->
mask == NULL) {
3352 PG_FREE_IF_COPY(pgraster, 0);
3353 elog(ERROR,
"RASTER_clip: Could not rasterize intersection geometry");
3364 if (itrset == NULL) {
3366 PG_FREE_IF_COPY(pgraster, 0);
3367 elog(ERROR,
"RASTER_clip: Could not allocate memory for iterator arguments");
3372 for (i = 0; i < arg->
numbands; i++) {
3373 POSTGIS_RT_DEBUGF(4,
"band arg %d (nband, hasnodata, nodataval) = (%d, %d, %f)",
3401 PG_FREE_IF_COPY(pgraster, 0);
3402 elog(ERROR,
"RASTER_clip: Could not create output raster");
3411 PG_FREE_IF_COPY(pgraster, 0);
3412 elog(ERROR,
"RASTER_clip: Could not add NODATA band to output raster");
3426 itrset[1].
nband = 0;
3434 hasnodata, nodataval,
3446 PG_FREE_IF_COPY(pgraster, 0);
3447 elog(ERROR,
"RASTER_clip: Could not run raster iterator function");
3462 PG_FREE_IF_COPY(pgraster, 0);
3463 elog(NOTICE,
"RASTER_clip: Could not get band from working raster");
3472 PG_FREE_IF_COPY(pgraster, 0);
3473 elog(ERROR,
"RASTER_clip: Could not add new band to output raster");
3483 PG_FREE_IF_COPY(pgraster, 0);
3493 SET_VARSIZE(pgrtn, pgrtn->
size);
3494 PG_RETURN_POINTER(pgrtn);
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)...
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.
void lwgeom_free(LWGEOM *geom)
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.
int clamp_srid(int srid)
Return a valid SRID from an arbitrary integer Raises a notice if what comes out is different from wha...
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
#define SRID_UNKNOWN
Unknown SRID value.
LWGEOM * lwgeom_force_2d(const LWGEOM *geom)
Strip out the Z/M components of an LWGEOM.
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
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.
int rt_raster_add_band(rt_raster raster, rt_band band, int index)
Add band data to a raster.
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
int rt_raster_has_band(rt_raster raster, int nband)
Return TRUE if the raster has a band of this number.
void * rt_raster_serialize(rt_raster raster)
Return this raster in serialized form.
double rt_band_get_min_value(rt_band band)
Returns the minimal possible value for the band according to the pixel type.
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.
uint16_t rt_raster_get_num_bands(rt_raster raster)
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
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.
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
rt_errorstate rt_raster_from_two_rasters(rt_raster rast1, rt_raster rast2, rt_extenttype extenttype, rt_raster *rtnraster, double *offset)
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.
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.
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
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)
#define POSTGIS_RT_DEBUGF(level, msg,...)