154 text *formattext = NULL;
156 char **options = NULL;
157 text *optiontext = NULL;
173 uint8_t *gdal = NULL;
174 uint64_t gdal_size = 0;
176 uint64_t result_size = 0;
181 if (PG_ARGISNULL(0)) PG_RETURN_NULL();
182 pgraster = (
rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
186 PG_FREE_IF_COPY(pgraster, 0);
187 elog(ERROR,
"RASTER_asGDALRaster: Could not deserialize raster");
192 if (PG_ARGISNULL(1)) {
193 elog(NOTICE,
"Format must be provided");
195 PG_FREE_IF_COPY(pgraster, 0);
199 formattext = PG_GETARG_TEXT_P(1);
200 format = text_to_cstring(formattext);
206 if (!PG_ARGISNULL(2)) {
208 array = PG_GETARG_ARRAYTYPE_P(2);
209 etype = ARR_ELEMTYPE(array);
210 get_typlenbyvalalign(etype, &typlen, &typbyval, &typalign);
217 PG_FREE_IF_COPY(pgraster, 0);
218 elog(ERROR,
"RASTER_asGDALRaster: Invalid data type for options");
223 deconstruct_array(array, etype, typlen, typbyval, typalign, &e,
227 options = (
char **) palloc(
sizeof(
char *) * (n + 1));
228 if (options == NULL) {
230 PG_FREE_IF_COPY(pgraster, 0);
231 elog(ERROR,
"RASTER_asGDALRaster: Could not allocate memory for options");
236 for (i = 0, j = 0; i < n; i++) {
237 if (nulls[i])
continue;
242 optiontext = (text *) DatumGetPointer(e[i]);
243 if (NULL == optiontext)
break;
244 option = text_to_cstring(optiontext);
252 if (strlen(option)) {
253 options[j] = (
char *) palloc(
sizeof(
char) * (strlen(option) + 1));
254 strcpy(options[j], option);
261 options = repalloc(options, (j + 1) *
sizeof(
char *));
279 srid = PG_GETARG_INT32(3);
285 if (NULL != options) {
286 for (i = j - 1; i >= 0; i--) pfree(options[i]);
290 PG_FREE_IF_COPY(pgraster, 0);
291 elog(ERROR,
"RASTER_asGDALRaster: Could not find srtext for SRID (%d)", srid);
303 if (NULL != options) {
304 for (i = j - 1; i >= 0; i--) pfree(options[i]);
307 if (NULL != srs) pfree(srs);
309 PG_FREE_IF_COPY(pgraster, 0);
312 elog(ERROR,
"RASTER_asGDALRaster: Could not allocate and generate GDAL raster");
315 POSTGIS_RT_DEBUGF(3,
"RASTER_asGDALRaster: GDAL raster generated with %d bytes", (
int) gdal_size);
318 result_size = gdal_size + VARHDRSZ;
319 result = (bytea *) palloc(result_size);
321 elog(ERROR,
"RASTER_asGDALRaster: Insufficient virtual memory for GDAL raster");
324 SET_VARSIZE(
result, result_size);
325 memcpy(VARDATA(
result), gdal, VARSIZE_ANY_EXHDR(
result));
330 POSTGIS_RT_DEBUG(3,
"RASTER_asGDALRaster: Returning pointer to GDAL raster");
331 PG_RETURN_POINTER(
result);
char result[OUT_DOUBLE_BUFFER_SIZE]
#define SRID_UNKNOWN
Unknown SRID value.
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...
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
uint8_t * rt_raster_to_gdal(rt_raster raster, const char *srs, char *format, char **options, uint64_t *gdalsize)
Return formatted GDAL raster from raster.
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
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): ...
char * rtpg_getSR(int32_t srid)
char * rtpg_trim(const char *input)
#define POSTGIS_RT_DEBUG(level, msg)
#define POSTGIS_RT_DEBUGF(level, msg,...)