839 text *algtext = NULL;
840 char *algchar = NULL;
841 GDALResampleAlg alg = GRA_NearestNeighbour;
842 double max_err = 0.125;
845 char *src_srs = NULL;
847 char *dst_srs = NULL;
850 double scale[2] = {0};
851 double *scale_x = NULL;
852 double *scale_y = NULL;
854 double gridw[2] = {0};
855 double *grid_xw = NULL;
856 double *grid_yw = NULL;
858 double skew[2] = {0};
859 double *skew_x = NULL;
860 double *skew_y = NULL;
871 pgraster = (
rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
876 PG_FREE_IF_COPY(pgraster, 0);
877 elog(ERROR,
"RASTER_GDALWarp: Could not deserialize raster");
882 if (!PG_ARGISNULL(1)) {
883 algtext = PG_GETARG_TEXT_P(1);
890 if (!PG_ARGISNULL(2)) {
891 max_err = PG_GETARG_FLOAT8(2);
892 if (max_err < 0.) max_err = 0.;
901 if (!PG_ARGISNULL(3)) {
905 PG_FREE_IF_COPY(pgraster, 0);
906 elog(ERROR,
"RASTER_GDALWarp: %d is an invalid target SRID", dst_srid);
917 PG_FREE_IF_COPY(pgraster, 0);
918 elog(ERROR,
"RASTER_GDALWarp: Input raster has unknown (%d) SRID", src_srid);
922 else if (dst_srid == src_srid) {
927 if (!PG_ARGISNULL(4)) {
928 scale[0] = PG_GETARG_FLOAT8(4);
934 if (!PG_ARGISNULL(5)) {
935 scale[1] = PG_GETARG_FLOAT8(5);
941 if (!PG_ARGISNULL(6)) {
942 gridw[0] = PG_GETARG_FLOAT8(6);
947 if (!PG_ARGISNULL(7)) {
948 gridw[1] = PG_GETARG_FLOAT8(7);
953 if (!PG_ARGISNULL(8)) {
954 skew[0] = PG_GETARG_FLOAT8(8);
960 if (!PG_ARGISNULL(9)) {
961 skew[1] = PG_GETARG_FLOAT8(9);
967 if (!PG_ARGISNULL(10)) {
968 dim[0] = PG_GETARG_INT32(10);
969 if (dim[0] < 0) dim[0] = 0;
970 if (dim[0] > 0) dim_x = &dim[0];
974 if (!PG_ARGISNULL(11)) {
975 dim[1] = PG_GETARG_INT32(11);
976 if (dim[1] < 0) dim[1] = 0;
977 if (dim[1] > 0) dim_y = &dim[1];
983 (scale_x == NULL) && (scale_y == NULL) &&
984 (grid_xw == NULL) && (grid_yw == NULL) &&
985 (skew_x == NULL) && (skew_y == NULL) &&
986 (dim_x == NULL) && (dim_y == NULL)
988 elog(NOTICE,
"No resampling parameters provided. Returning original raster");
990 PG_RETURN_POINTER(pgraster);
994 (grid_xw != NULL && grid_yw == NULL) ||
995 (grid_xw == NULL && grid_yw != NULL)
997 elog(NOTICE,
"Values must be provided for both X and Y when specifying the alignment. Returning original raster");
999 PG_RETURN_POINTER(pgraster);
1003 (scale_x != NULL && scale_y == NULL) ||
1004 (scale_x == NULL && scale_y != NULL)
1006 elog(NOTICE,
"Values must be provided for both X and Y when specifying the scale. Returning original raster");
1008 PG_RETURN_POINTER(pgraster);
1012 (scale_x != NULL || scale_y != NULL) &&
1013 (dim_x != NULL || dim_y != NULL)
1015 elog(NOTICE,
"Scale X/Y and width/height are mutually exclusive. Only provide one. Returning original raster");
1017 PG_RETURN_POINTER(pgraster);
1024 if (NULL == src_srs) {
1026 PG_FREE_IF_COPY(pgraster, 0);
1027 elog(ERROR,
"RASTER_GDALWarp: Input raster has unknown SRID (%d)", src_srid);
1033 if (NULL == dst_srs) {
1036 PG_FREE_IF_COPY(pgraster, 0);
1037 elog(ERROR,
"RASTER_GDALWarp: Target SRID (%d) is unknown", dst_srid);
1053 PG_FREE_IF_COPY(pgraster, 0);
1059 elog(ERROR,
"RASTER_band: Could not create transformed raster");
1069 if (NULL == pgrast) PG_RETURN_NULL();
1073 SET_VARSIZE(pgrast, pgrast->
size);
1074 PG_RETURN_POINTER(pgrast);
#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.
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
void * rt_raster_serialize(rt_raster raster)
Return this raster in serialized form.
GDALResampleAlg rt_util_gdal_resample_alg(const char *algname)
Convert cstring name to GDAL Resample Algorithm.
void rt_raster_set_srid(rt_raster raster, int32_t srid)
Set raster's SRID.
rt_raster rt_raster_gdal_warp(rt_raster raster, const char *src_srs, const char *dst_srs, double *scale_x, double *scale_y, int *width, int *height, double *ul_xw, double *ul_yw, double *grid_xw, double *grid_yw, double *skew_x, double *skew_y, GDALResampleAlg resample_alg, double max_err)
Return a warped raster using GDAL Warp API.
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_strtoupper(char *str)
char * rtpg_trim(const char *input)
#define POSTGIS_RT_DEBUG(level, msg)
#define POSTGIS_RT_DEBUGF(level, msg,...)