From: Bborie Park Date: Tue, 27 Mar 2012 22:05:56 +0000 (+0000) Subject: Added robustness checking that GDAL supports spatial reference text from X-Git-Tag: 2.0.0rc1~11 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=afec91956e522088778c9cc32d6921a3c6125c41;p=postgis Added robustness checking that GDAL supports spatial reference text from spatial_ref_sys table git-svn-id: http://svn.osgeo.org/postgis/trunk@9560 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/raster/rt_core/rt_api.c b/raster/rt_core/rt_api.c index 94e3a893b..cd0fed65d 100644 --- a/raster/rt_core/rt_api.c +++ b/raster/rt_core/rt_api.c @@ -333,6 +333,21 @@ rt_util_gdal_convert_sr(const char *srs, int proj4) { return rtn; } +int +rt_util_gdal_supported_sr(const char *srs) { + OGRSpatialReferenceH hsrs; + OGRErr rtn = OGRERR_NONE; + + hsrs = OSRNewSpatialReference(NULL); + rtn = OSRSetFromUserInput(hsrs, srs); + OSRDestroySpatialReference(hsrs); + + if (rtn == OGRERR_NONE) + return 1; + else + return 0; +} + int rt_util_gdal_driver_registered(const char *drv) { int count = GDALGetDriverCount(); diff --git a/raster/rt_core/rt_api.h b/raster/rt_core/rt_api.h index 3bff7c94e..ca7b0159f 100644 --- a/raster/rt_core/rt_api.h +++ b/raster/rt_core/rt_api.h @@ -1506,6 +1506,9 @@ rt_util_extent_type(const char *name); char* rt_util_gdal_convert_sr(const char *srs, int proj4); +int +rt_util_gdal_supported_sr(const char *srs); + int rt_util_gdal_driver_registered(const char *drv); diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index 31c5f36b8..72533bc08 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -484,6 +484,7 @@ rtpg_trim(const char *input) { static char* rtpg_getSR(int srid) { + int i = 0; int len = 0; char *sql = NULL; int spi_result; @@ -493,7 +494,7 @@ rtpg_getSR(int srid) char *tmp = NULL; char *srs = NULL; - len = sizeof(char) * (strlen("SELECT CASE WHEN upper(auth_name) = 'EPSG' AND length(auth_srid::text) > 0 THEN upper(auth_name) || ':' || auth_srid WHEN length(proj4text) > 0 THEN proj4text ELSE srtext END FROM spatial_ref_sys WHERE srid = LIMIT 1") + MAX_INT_CHARLEN + 1); + len = sizeof(char) * (strlen("SELECT CASE WHEN upper(auth_name) = 'EPSG' AND length(auth_srid::text) > 0 THEN upper(auth_name) || ':' || auth_srid ELSE '' END, proj4text, srtext FROM spatial_ref_sys WHERE srid = LIMIT 1") + MAX_INT_CHARLEN + 1); sql = (char *) palloc(len); if (NULL == sql) { elog(ERROR, "rtpg_getSR: Unable to allocate memory for sql\n"); @@ -508,7 +509,7 @@ rtpg_getSR(int srid) } /* execute query */ - snprintf(sql, len, "SELECT CASE WHEN upper(auth_name) = 'EPSG' AND length(auth_srid::text) > 0 THEN upper(auth_name) || ':' || auth_srid WHEN length(proj4text) > 0 THEN proj4text ELSE srtext END FROM spatial_ref_sys WHERE srid = %d LIMIT 1", srid); + snprintf(sql, len, "SELECT CASE WHEN upper(auth_name) = 'EPSG' AND length(auth_srid::text) > 0 THEN upper(auth_name) || ':' || auth_srid ELSE '' END, proj4text, srtext 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) { @@ -520,31 +521,54 @@ rtpg_getSR(int srid) tupdesc = SPI_tuptable->tupdesc; tuptable = SPI_tuptable; - tuple = tuptable->vals[0]; - tmp = SPI_getvalue(tuple, tupdesc, 1); - if (NULL == tmp || !strlen(tmp)) { - elog(ERROR, "rtpg_getSR: Cannot find SRID (%d) in spatial_ref_sys", srid); - if (SPI_tuptable) SPI_freetuptable(tuptable); - SPI_finish(); - return NULL; - } + /* which tuple to use? */ + for (i = 0; i < 3; i++) { + tuple = tuptable->vals[i]; + + tmp = SPI_getvalue(tuple, tupdesc, 1); + if (NULL == tmp || !strlen(tmp)) { + elog(ERROR, "rtpg_getSR: Cannot find SRID (%d) in spatial_ref_sys", srid); + if (SPI_tuptable) SPI_freetuptable(tuptable); + SPI_finish(); + return NULL; + } + + /* value AND GDAL supports this SR */ + if ( + strlen(tmp) && + rt_util_gdal_supported_sr(tmp) + ) { + len = strlen(tmp) + 1; + srs = SPI_palloc(sizeof(char) * len); + if (NULL == srs) { + elog(ERROR, "rtpg_getSR: Unable to allocate memory for spatial reference text\n"); + pfree(tmp); + if (SPI_tuptable) SPI_freetuptable(tuptable); + SPI_finish(); + return NULL; + } + strncpy(srs, tmp, len); + pfree(tmp); + + break; + } - len = strlen(tmp) + 1; - srs = SPI_palloc(sizeof(char) * len); - if (NULL == srs) { - elog(ERROR, "rtpg_getSR: Unable to allocate memory for srtext\n"); pfree(tmp); - if (SPI_tuptable) SPI_freetuptable(tuptable); - SPI_finish(); - return NULL; + continue; } - strncpy(srs, tmp, len); - pfree(tmp); if (SPI_tuptable) SPI_freetuptable(tuptable); SPI_finish(); + /* unable to get SR info */ + if (srs == NULL) { + elog(ERROR, "rtpg_getSR: Unable to find a viable spatial reference for SRID (%d)", srid); + if (SPI_tuptable) SPI_freetuptable(tuptable); + SPI_finish(); + return NULL; + } + return srs; }