* @return the warped raster or NULL
*/
rt_raster rt_raster_gdal_warp(
- rt_raster raster, const char *src_srs,
- const char *dst_srs,
+ 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,
RASTER_DEBUG(3, "starting");
assert(NULL != raster);
- assert(NULL != src_srs);
/*
max_err must be gte zero
if (max_err < 0.) max_err = 0.125;
RASTER_DEBUGF(4, "max_err = %f", max_err);
- _src_srs = rt_util_gdal_convert_sr(src_srs, 0);
- /* dst_srs not provided, set to src_srs */
- if (NULL == dst_srs)
- _dst_srs = rt_util_gdal_convert_sr(src_srs, 0);
- else
- _dst_srs = rt_util_gdal_convert_sr(dst_srs, 0);
+ /* handle srs */
+ if (src_srs != NULL) {
+ /* reprojection taking place */
+ if (dst_srs != NULL && strcmp(src_srs, dst_srs) != 0) {
+ RASTER_DEBUG(4, "Warp operation does include a reprojection");
+ _src_srs = rt_util_gdal_convert_sr(src_srs, 0);
+ _dst_srs = rt_util_gdal_convert_sr(dst_srs, 0);
+ }
+ /* no reprojection, a stub just for clarity */
+ else {
+ RASTER_DEBUG(4, "Warp operation does NOT include reprojection");
+ }
+ }
+ else if (dst_srs != NULL) {
+ /* dst_srs provided but not src_srs */
+ rterror("rt_raster_gdal_warp: SRS required for input raster if SRS provided for warped raster");
+ return NULL;
+ }
/* load raster into a GDAL MEM dataset */
src_ds = rt_raster_to_gdal_mem(raster, _src_srs, NULL, NULL, 0, &src_drv);
if (NULL == src_ds) {
rterror("rt_raster_gdal_warp: Unable to convert raster to GDAL MEM format");
- CPLFree(_src_srs);
- CPLFree(_dst_srs);
+ if (_src_srs != NULL) {
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+ }
return NULL;
}
GDALClose(src_ds);
- CPLFree(_src_srs);
- CPLFree(_dst_srs);
+ if (_src_srs != NULL) {
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+ }
return NULL;
}
for (i = 0; i < transform_opts_len; i++) {
switch (i) {
case 1:
- transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1));
+ if (_dst_srs != NULL)
+ transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1));
+ else
+ transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("DST_SRS=") + 1));
break;
case 0:
- transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1));
+ if (_src_srs != NULL)
+ transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1));
+ else
+ transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("SRC_SRS=") + 1));
break;
}
if (NULL == transform_opts[i]) {
rtdealloc(transform_opts);
GDALClose(src_ds);
- CPLFree(_src_srs);
- CPLFree(_dst_srs);
+ if (_src_srs != NULL) {
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+ }
return NULL;
}
switch (i) {
case 1:
- snprintf(
- transform_opts[i],
- sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1),
- "DST_SRS=%s",
- _dst_srs
- );
+ if (_dst_srs != NULL) {
+ snprintf(
+ transform_opts[i],
+ sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1),
+ "DST_SRS=%s",
+ _dst_srs
+ );
+ }
+ else
+ sprintf(transform_opts[i], "%s", "DST_SRS=");
break;
case 0:
- snprintf(
- transform_opts[i],
- sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1),
- "SRC_SRS=%s",
- _src_srs
- );
+ if (_src_srs != NULL) {
+ snprintf(
+ transform_opts[i],
+ sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1),
+ "SRC_SRS=%s",
+ _src_srs
+ );
+ }
+ else
+ sprintf(transform_opts[i], "%s", "SRC_SRS=");
break;
}
RASTER_DEBUGF(4, "transform_opts[%d] = %s", i, transform_opts[i]);
}
transform_opts[transform_opts_len] = NULL;
- CPLFree(_src_srs);
- CPLFree(_dst_srs);
+ if (_src_srs != NULL) CPLFree(_src_srs);
/* transformation object for building dst dataset */
transform_arg = GDALCreateGenImgProjTransformer2(src_ds, NULL, transform_opts);
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
return NULL;
}
GDALClose(src_ds);
+ for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
+ rtdealloc(transform_opts);
+ if (_dst_srs != NULL) CPLFree(_dst_srs);
+
+ return NULL;
+ }
+
+ /* set dst srs */
+ if (_dst_srs != NULL) {
+ cplerr = GDALSetProjection(dst_ds, _dst_srs);
+ CPLFree(_dst_srs);
+ if (cplerr != CE_None) {
+ rterror("rt_raster_gdal_warp: Unable to set projection");
+
+ GDALClose(dst_ds);
+ GDALClose(src_ds);
+
+ for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
+ rtdealloc(transform_opts);
+
+ return NULL;
+ }
+ }
+
+ /* set dst geotransform */
+ cplerr = GDALSetGeoTransform(dst_ds, _gt);
+ if (cplerr != CE_None) {
+ rterror("rt_raster_gdal_warp: Unable to set geotransform");
+
+ GDALClose(dst_ds);
+ GDALClose(src_ds);
+
for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
rtdealloc(transform_opts);
}
}
- /* set dst srs */
- _dst_srs = rt_util_gdal_convert_sr((NULL == dst_srs ? src_srs : dst_srs), 1);
- cplerr = GDALSetProjection(dst_ds, _dst_srs);
- CPLFree(_dst_srs);
- if (cplerr != CE_None) {
- rterror("rt_raster_gdal_warp: Unable to set projection");
-
- GDALClose(dst_ds);
- GDALClose(src_ds);
-
- for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
- rtdealloc(transform_opts);
-
- return NULL;
- }
-
- /* set dst geotransform */
- cplerr = GDALSetGeoTransform(dst_ds, _gt);
- if (cplerr != CE_None) {
- rterror("rt_raster_gdal_warp: Unable to set geotransform");
-
- GDALClose(dst_ds);
- GDALClose(src_ds);
-
- for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[i]);
- rtdealloc(transform_opts);
-
- return NULL;
- }
-
/* create transformation object */
transform_arg = imgproj_arg = GDALCreateGenImgProjTransformer2(src_ds, dst_ds, transform_opts);
if (NULL == transform_arg) {
dst_srid = src_srid;
POSTGIS_RT_DEBUGF(4, "destination SRID: %d", dst_srid);
- /* source SRID = SRID_UNKNOWN */
- if (src_srid == SRID_UNKNOWN) {
- /* target SRID != src SRID, error */
- if (dst_srid != src_srid) {
- elog(ERROR, "RASTER_GDALWarp: Input raster has unknown (%d) SRID", src_srid);
- rt_raster_destroy(raster);
- PG_FREE_IF_COPY(pgraster, 0);
- PG_RETURN_NULL();
+ /* target SRID != src SRID, error */
+ if (src_srid == SRID_UNKNOWN && dst_srid != src_srid) {
+ elog(ERROR, "RASTER_GDALWarp: Input raster has unknown (%d) SRID", src_srid);
+ rt_raster_destroy(raster);
+ PG_FREE_IF_COPY(pgraster, 0);
+ PG_RETURN_NULL();
+ }
+ /* target SRID == src SRID, no reprojection */
+ else if (dst_srid == src_srid) {
+ /* set geotransform */
+ if (src_srid == SRID_UNKNOWN) {
+ double gt[6] = {0, 10, 0, 0, 0, -10};
+ rt_raster_set_geotransform_matrix(raster, gt);
}
- /* target SRID == src SRID, special */
no_srid = 1;
}
}
/* get srses from srids */
- /* source srs */
- /* no SRID, use EPSG:4326 (WGS84) */
- if (no_srid)
- src_srs = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
- /* legitimate SRID */
- else {
+ if (!no_srid) {
+ /* source srs */
src_srs = rtpg_getSR(src_srid);
if (NULL == src_srs) {
elog(ERROR, "RASTER_GDALWarp: Input raster has unknown SRID (%d)", src_srid);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
}
- }
- POSTGIS_RT_DEBUGF(4, "src srs: %s", src_srs);
+ POSTGIS_RT_DEBUGF(4, "src srs: %s", src_srs);
- /* target srs */
- /* no SRID, use src_srs */
- if (no_srid)
- dst_srs = src_srs;
- /* legitimate SRID */
- else if (dst_srid != SRID_UNKNOWN) {
dst_srs = rtpg_getSR(dst_srid);
if (NULL == dst_srs) {
elog(ERROR, "RASTER_GDALWarp: Target SRID (%d) is unknown", dst_srid);
- if (!no_srid && NULL != src_srs) pfree(src_srs);
+ if (!no_srid) pfree(src_srs);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
if (!no_srid) {
- if (NULL != src_srs) pfree(src_srs);
- if (NULL != dst_srs) pfree(dst_srs);
+ pfree(src_srs);
+ pfree(dst_srs);
}
if (!rast) {
elog(ERROR, "RASTER_band: Could not create transformed raster");
PG_RETURN_NULL();
}
- /* add target SRID but only if we're not using a no SRID */
- if (!no_srid)
- rt_raster_set_srid(rast, dst_srid);
+ /* add target SRID */
+ rt_raster_set_srid(rast, dst_srid);
+
+ if (no_srid && src_srid == SRID_UNKNOWN) {
+ double gt[6] = {0, 1, 0, 0, 0, -1};
+ rt_raster_set_geotransform_matrix(rast, gt);
+ }
pgrast = rt_raster_serialize(rast);
rt_raster_destroy(rast);