]> granicus.if.org Git - postgis/commitdiff
Added robustness checking that GDAL supports spatial reference text from
authorBborie Park <bkpark at ucdavis.edu>
Tue, 27 Mar 2012 22:05:56 +0000 (22:05 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Tue, 27 Mar 2012 22:05:56 +0000 (22:05 +0000)
spatial_ref_sys table

git-svn-id: http://svn.osgeo.org/postgis/trunk@9560 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_core/rt_api.c
raster/rt_core/rt_api.h
raster/rt_pg/rt_pg.c

index 94e3a893b38ed408b9f79a68f8f541090c8283d4..cd0fed65d2f1247ad8c01cbb9029bd15678378b9 100644 (file)
@@ -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();
index 3bff7c94eacfd47b06115eada4da49a15ac979be..ca7b0159fe33ed6f0cea1ed0efbe142690bcda4b 100644 (file)
@@ -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);
 
index 31c5f36b816823efa4c0ca9555d797088fff3406..72533bc0885aacb6a1acb96b26cb1f35ae5b31c8 100644 (file)
@@ -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;
 }