From: Bborie Park Date: Sat, 24 Dec 2011 01:14:16 +0000 (+0000) Subject: Instead of using spatial reference text in WKT format, use PROJ.4 format when possibl... X-Git-Tag: 2.0.0alpha1~338 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=63e7bbcd676c5ff6e304ab39bedb20a474b12052;p=postgis Instead of using spatial reference text in WKT format, use PROJ.4 format when possible. This does mean that in situations that require WKT format, rt_raster_gdal_sr must be called to convert from one format to the other. git-svn-id: http://svn.osgeo.org/postgis/trunk@8537 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/raster/rt_core/rt_api.c b/raster/rt_core/rt_api.c index c2b55f4db..0c0a7195a 100644 --- a/raster/rt_core/rt_api.c +++ b/raster/rt_core/rt_api.c @@ -304,6 +304,32 @@ rt_util_extent_type(const char *name) { 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 */ @@ -7071,7 +7097,8 @@ rt_raster rt_raster_gdal_warp( 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; @@ -7122,20 +7149,25 @@ rt_raster rt_raster_gdal_warp( 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"); @@ -7150,6 +7182,9 @@ rt_raster rt_raster_gdal_warp( GDALDeregisterDriver(src_drv); GDALDestroyDriver(src_drv); + CPLFree(_src_srs); + CPLFree(_dst_srs); + return NULL; } for (i = 0; i < transform_opts_len; i++) { @@ -7158,7 +7193,7 @@ rt_raster rt_raster_gdal_warp( 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]) { @@ -7171,6 +7206,9 @@ rt_raster rt_raster_gdal_warp( GDALDeregisterDriver(src_drv); GDALDestroyDriver(src_drv); + CPLFree(_src_srs); + CPLFree(_dst_srs); + return NULL; } @@ -7186,15 +7224,17 @@ rt_raster rt_raster_gdal_warp( 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); @@ -7573,7 +7613,9 @@ rt_raster rt_raster_gdal_warp( } /* 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"); @@ -7930,8 +7972,8 @@ rt_raster_gdal_rasterize(const unsigned char *wkb, /* 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) { diff --git a/raster/rt_core/rt_api.h b/raster/rt_core/rt_api.h index 3245304c2..d661bd271 100644 --- a/raster/rt_core/rt_api.h +++ b/raster/rt_core/rt_api.h @@ -1308,6 +1308,9 @@ rt_util_gdal_version(const char *request); 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 */ diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index 67b0d8545..cd20cb3d4 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -81,7 +81,7 @@ static char *rtpg_chartrim(const char* input, char *remove); 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... @@ -474,7 +474,7 @@ rtpg_trim(const char *input) { } static char* -rtpg_getSRTextSPI(int srid) +rtpg_getSR(int srid) { int len = 0; char *sql = NULL; @@ -485,26 +485,26 @@ rtpg_getSRTextSPI(int srid) 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; @@ -516,7 +516,7 @@ rtpg_getSRTextSPI(int srid) 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; @@ -525,7 +525,7 @@ rtpg_getSRTextSPI(int srid) 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(); @@ -6618,7 +6618,7 @@ Datum RASTER_asGDALRaster(PG_FUNCTION_ARGS) /* 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) { @@ -7279,7 +7279,7 @@ Datum RASTER_asRaster(PG_FUNCTION_ARGS) 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); @@ -7555,7 +7555,7 @@ Datum RASTER_resample(PG_FUNCTION_ARGS) /* 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); @@ -7565,7 +7565,7 @@ Datum RASTER_resample(PG_FUNCTION_ARGS) /* 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);