return ET_INTERSECTION;
}
+char*
+rt_util_gdal_sr(const char *srs, int proj4) {
+ OGRSpatialReferenceH hsrs;
+ char *rtn = NULL;
+
+ hsrs = OSRNewSpatialReference(NULL);
+ if (OSRSetFromUserInput(hsrs, srs) == OGRERR_NONE) {
+ if (proj4)
+ OSRExportToProj4(hsrs, &rtn);
+ else
+ OSRExportToWkt(hsrs, &rtn);
+ }
+ else {
+ rterror("rt_util_gdal_sr: Could not process the provided srs:%s", srs);
+ return NULL;
+ }
+
+ OSRDestroySpatialReference(hsrs);
+ if (rtn == NULL) {
+ rterror("rt_util_gdal_sr: Could not process the provided srs:%s", srs);
+ return NULL;
+ }
+
+ return rtn;
+}
+
/*- rt_context -------------------------------------------------------*/
/* Functions definitions */
GDALWarpOptions *wopts = NULL;
GDALDriverH dst_drv = NULL;
GDALDatasetH dst_ds = NULL;
- const char *_dst_srs = NULL;
+ char *_src_srs = NULL;
+ char *_dst_srs = NULL;
char *dst_options[] = {"SUBCLASS=VRTWarpedDataset", NULL};
char **transform_opts = NULL;
int transform_opts_len = 2;
if (max_err < 0.) max_err = 0.125;
RASTER_DEBUGF(4, "max_err = %f", max_err);
+ _src_srs = rt_util_gdal_sr(src_srs, 0);
/* dst_srs not provided, set to src_srs */
if (NULL == dst_srs)
- _dst_srs = src_srs;
+ _dst_srs = rt_util_gdal_sr(src_srs, 0);
else
- _dst_srs = dst_srs;
+ _dst_srs = rt_util_gdal_sr(dst_srs, 0);
/* load raster into a GDAL MEM dataset */
- src_ds = rt_raster_to_gdal_mem(raster, src_srs, NULL, 0, &src_drv);
+ src_ds = rt_raster_to_gdal_mem(raster, _src_srs, NULL, 0, &src_drv);
if (NULL == src_ds) {
rterror("rt_raster_gdal_warp: Unable to convert raster to GDAL MEM format\n");
if (NULL != src_drv) {
GDALDeregisterDriver(src_drv);
GDALDestroyDriver(src_drv);
}
+
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+
return NULL;
}
RASTER_DEBUG(3, "raster loaded into GDAL MEM dataset");
GDALDeregisterDriver(src_drv);
GDALDestroyDriver(src_drv);
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+
return NULL;
}
for (i = 0; i < transform_opts_len; i++) {
transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1));
break;
case 0:
- transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("SRC_SRS=") + strlen(src_srs) + 1));
+ transform_opts[i] = (char *) rtalloc(sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1));
break;
}
if (NULL == transform_opts[i]) {
GDALDeregisterDriver(src_drv);
GDALDestroyDriver(src_drv);
+ CPLFree(_src_srs);
+ CPLFree(_dst_srs);
+
return NULL;
}
case 0:
snprintf(
transform_opts[i],
- sizeof(char) * (strlen("SRC_SRS=") + strlen(src_srs) + 1),
+ sizeof(char) * (strlen("SRC_SRS=") + strlen(_src_srs) + 1),
"SRC_SRS=%s",
- src_srs
+ _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);
/* transformation object for building dst dataset */
transform_arg = GDALCreateGenImgProjTransformer2(src_ds, NULL, transform_opts);
}
/* set dst srs */
+ _dst_srs = rt_util_gdal_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\n");
/* OGR spatial reference */
if (NULL != srs && strlen(srs)) {
- src_sr = OSRNewSpatialReference(srs);
- if (NULL == src_sr) {
+ src_sr = OSRNewSpatialReference(NULL);
+ if (OSRSetFromUserInput(src_sr, srs) != OGRERR_NONE) {
rterror("rt_raster_gdal_rasterize: Unable to create OSR spatial reference");
if (noband) {
rt_extenttype
rt_util_extent_type(const char *name);
+char*
+rt_util_gdal_sr(const char *srs, int proj4);
+
/*
helper macros for consistent floating point equality checks
*/
static char **rtpg_strsplit(const char *str, const char *delimiter, int *n);
static char *rtpg_removespaces(char *str);
static char *rtpg_trim(const char* input);
-static char *rtpg_getSRTextSPI(int srid);
+static char *rtpg_getSR(int srid);
/***************************************************************
* Some rules for returning NOTICE or ERROR...
}
static char*
-rtpg_getSRTextSPI(int srid)
+rtpg_getSR(int srid)
{
int len = 0;
char *sql = NULL;
char *tmp = NULL;
char *srs = NULL;
- len = sizeof(char) * (strlen("SELECT srtext FROM spatial_ref_sys WHERE srid = LIMIT 1") + MAX_INT_CHARLEN + 1);
+ len = sizeof(char) * (strlen("SELECT CASE WHEN length(proj4text) > 0 THEN proj4text ELSE srtext END FROM spatial_ref_sys WHERE srid = LIMIT 1") + MAX_INT_CHARLEN + 1);
sql = (char *) palloc(len);
if (NULL == sql) {
- elog(ERROR, "rtpg_getSRTextSPI: Unable to allocate memory for sql\n");
+ elog(ERROR, "rtpg_getSR: Unable to allocate memory for sql\n");
return NULL;
}
spi_result = SPI_connect();
if (spi_result != SPI_OK_CONNECT) {
- elog(ERROR, "rtpg_getSRTextSPI: Could not connect to database using SPI\n");
+ elog(ERROR, "rtpg_getSR: Could not connect to database using SPI\n");
pfree(sql);
return NULL;
}
/* execute query */
- snprintf(sql, len, "SELECT srtext FROM spatial_ref_sys WHERE srid = %d LIMIT 1", srid);
+ snprintf(sql, len, "SELECT CASE WHEN length(proj4text) > 0 THEN proj4text ELSE srtext END FROM spatial_ref_sys WHERE srid = %d LIMIT 1", srid);
spi_result = SPI_execute(sql, TRUE, 0);
SPI_pfree(sql);
if (spi_result != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
- elog(ERROR, "rtpg_getSRTextSPI: Cannot find SRID (%d) in spatial_ref_sys", srid);
+ elog(ERROR, "rtpg_getSR: Cannot find SRID (%d) in spatial_ref_sys", srid);
if (SPI_tuptable) SPI_freetuptable(tuptable);
SPI_finish();
return NULL;
tmp = SPI_getvalue(tuple, tupdesc, 1);
if (NULL == tmp || !strlen(tmp)) {
- elog(ERROR, "rtpg_getSRTextSPI: Cannot find SRID (%d) in spatial_ref_sys", srid);
+ elog(ERROR, "rtpg_getSR: Cannot find SRID (%d) in spatial_ref_sys", srid);
if (SPI_tuptable) SPI_freetuptable(tuptable);
SPI_finish();
return NULL;
len = strlen(tmp) + 1;
srs = SPI_palloc(sizeof(char) * len);
if (NULL == srs) {
- elog(ERROR, "rtpg_getSRTextSPI: Unable to allocate memory for srtext\n");
+ elog(ERROR, "rtpg_getSR: Unable to allocate memory for srtext\n");
pfree(tmp);
if (SPI_tuptable) SPI_freetuptable(tuptable);
SPI_finish();
/* get srs from srid */
if (clamp_srid(srid) != SRID_UNKNOWN) {
- srs = rtpg_getSRTextSPI(srid);
+ srs = rtpg_getSR(srid);
if (NULL == srs) {
elog(ERROR, "RASTER_asGDALRaster: Could not find srtext for SRID (%d)", srid);
if (NULL != options) {
POSTGIS_RT_DEBUGF(3, "RASTER_asRaster: srid = %d", srid);
if (clamp_srid(srid) != SRID_UNKNOWN) {
- srs = rtpg_getSRTextSPI(srid);
+ srs = rtpg_getSR(srid);
if (NULL == srs) {
elog(ERROR, "RASTER_asRaster: Could not find srtext for SRID (%d)", srid);
/* get srses from srids */
/* source srs */
- src_srs = rtpg_getSRTextSPI(src_srid);
+ src_srs = rtpg_getSR(src_srid);
if (NULL == src_srs) {
elog(ERROR, "RASTER_resample: Input raster has unknown SRID (%d)", src_srid);
rt_raster_destroy(raster);
/* target srs */
if (clamp_srid(dst_srid) != SRID_UNKNOWN) {
- dst_srs = rtpg_getSRTextSPI(dst_srid);
+ dst_srs = rtpg_getSR(dst_srid);
if (NULL == dst_srs) {
elog(ERROR, "RASTER_resample: Target SRID (%d) is unknown", dst_srid);
rt_raster_destroy(raster);