]> granicus.if.org Git - postgis/commitdiff
- wrote function getSRTextSPI to create one code for getting the srtext of a SRID...
authorBborie Park <bkpark at ucdavis.edu>
Mon, 27 Jun 2011 21:35:14 +0000 (21:35 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Mon, 27 Jun 2011 21:35:14 +0000 (21:35 +0000)
- removed plpgsql function _ST_srtext with addition of getSRTextSPI.

The regression failure in ticket #1064 should be resolved as a side-affect of the new function as the srtext returned through SPI is copied to an interval variable.

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

raster/rt_core/rt_api.c
raster/rt_core/rt_api.h
raster/rt_pg/rt_pg.c
raster/rt_pg/rtpostgis.sql.in.c

index bbd540fefe2c17d8a81ae53558c07772c476a1d9..a0dd7a0917fcf20bec0c561f860f83b4157271d8 100644 (file)
@@ -5243,7 +5243,7 @@ rt_raster_replace_band(rt_raster raster, rt_band band, int index) {
  *   for freeing the returned data using CPLFree()
  */
 uint8_t*
-rt_raster_to_gdal(rt_raster raster, char *srs,
+rt_raster_to_gdal(rt_raster raster, const char *srs,
        char *format, char **options, uint64_t *gdalsize) {
        GDALDriverH src_drv = NULL;
        GDALDatasetH src_ds = NULL;
@@ -5434,7 +5434,7 @@ rt_raster_gdal_drivers(uint32_t *drv_count) {
  * @return GDAL dataset using GDAL MEM driver
  */
 GDALDatasetH
-rt_raster_to_gdal_mem(rt_raster raster, char *srs,
+rt_raster_to_gdal_mem(rt_raster raster, const char *srs,
        uint32_t *bandNums, int count, GDALDriverH *rtn_drv) {
        GDALDriverH drv = NULL;
        int drv_gen = 0;
@@ -5915,8 +5915,8 @@ rt_raster_from_gdal_dataset(GDALDatasetH ds) {
  * @return the warped raster
  */
 rt_raster rt_raster_gdal_warp(
-       rt_raster raster, char *src_srs,
-       char *dst_srs,
+       rt_raster raster, const char *src_srs,
+       const char *dst_srs,
        double *scale_x, double *scale_y,
        double *ul_x, double *ul_y,
        double *skew_x, double *skew_y,
@@ -5928,6 +5928,7 @@ rt_raster rt_raster_gdal_warp(
        GDALWarpOptions *wopts = NULL;
        GDALDriverH dst_drv = NULL;
        GDALDatasetH dst_ds = NULL;
+       const char *_dst_srs = NULL;
        char *dst_options[] = {"SUBCLASS=VRTWarpedDataset", NULL};
        char **transform_opts = NULL;
        int transform_opts_len = 2;
@@ -5972,7 +5973,10 @@ rt_raster rt_raster_gdal_warp(
        RASTER_DEBUGF(4, "max_err = %f", max_err);
 
        /* dst_srs not provided, set to src_srs */
-       if (NULL == dst_srs) dst_srs = src_srs;
+       if (NULL == dst_srs)
+               _dst_srs = src_srs;
+       else
+               _dst_srs = dst_srs;
 
        /* load raster into a GDAL MEM dataset */
        src_ds = rt_raster_to_gdal_mem(raster, src_srs, NULL, 0, &src_drv);
@@ -5986,20 +5990,6 @@ rt_raster rt_raster_gdal_warp(
        }
        RASTER_DEBUG(3, "raster loaded into GDAL MEM dataset");
 
-       /* load VRT driver */
-       GDALRegister_VRT();
-       dst_drv = GDALGetDriverByName("VRT");
-       if (NULL == dst_drv) {
-               rterror("rt_raster_gdal_warp: Unable to load the output GDAL VRT driver\n");
-
-               GDALClose(src_ds);
-
-               GDALDeregisterDriver(src_drv);
-               GDALDestroyDriver(src_drv);
-
-               return NULL;
-       }
-
        /* set transform_opts */
        transform_opts = (char **) rtalloc(sizeof(char *) * (transform_opts_len + 1));
        if (NULL == transform_opts) {
@@ -6015,7 +6005,7 @@ rt_raster rt_raster_gdal_warp(
        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));
+                               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));
@@ -6038,9 +6028,9 @@ rt_raster rt_raster_gdal_warp(
                        case 1:
                                snprintf(
                                        transform_opts[i],
-                                       sizeof(char) * (strlen("DST_SRS=") + strlen(dst_srs) + 1),
+                                       sizeof(char) * (strlen("DST_SRS=") + strlen(_dst_srs) + 1),
                                        "DST_SRS=%s",
-                                       dst_srs
+                                       _dst_srs
                                );
                                break;
                        case 0:
@@ -6185,8 +6175,20 @@ rt_raster rt_raster_gdal_warp(
                for (i = 0; i < transform_opts_len; i++) rtdealloc(transform_opts[j]);
                rtdealloc(transform_opts);
 
-               GDALDeregisterDriver(dst_drv);
-               GDALDestroyDriver(dst_drv);
+               GDALDeregisterDriver(src_drv);
+               GDALDestroyDriver(src_drv);
+
+               return NULL;
+       }
+
+       /* load VRT driver */
+       GDALRegister_VRT();
+       dst_drv = GDALGetDriverByName("VRT");
+       if (NULL == dst_drv) {
+               rterror("rt_raster_gdal_warp: Unable to load the output GDAL VRT driver\n");
+
+               GDALClose(src_ds);
+
                GDALDeregisterDriver(src_drv);
                GDALDestroyDriver(src_drv);
 
@@ -6285,7 +6287,7 @@ rt_raster rt_raster_gdal_warp(
        }
 
        /* set dst srs */
-       cplerr = GDALSetProjection(dst_ds, dst_srs);
+       cplerr = GDALSetProjection(dst_ds, _dst_srs);
        if (cplerr != CE_None) {
                rterror("rt_raster_gdal_warp: Unable to set projection\n");
 
index 086bf781652b6296c3a87b739ea3c79fa5aef498..8d66717f17e51f09f5cef1b1d2692c2f5b8dbb49 100644 (file)
@@ -890,7 +890,7 @@ rt_band rt_raster_replace_band(rt_raster raster, rt_band band,
  * @return formatted GDAL raster.  the calling function is responsible
  *   for freeing the returned data using CPLFree()
  */
-uint8_t *rt_raster_to_gdal(rt_raster raster, char *srs,
+uint8_t *rt_raster_to_gdal(rt_raster raster, const char *srs,
        char *format, char **options, uint64_t *gdalsize);
 
 /**
@@ -915,7 +915,7 @@ rt_gdaldriver rt_raster_gdal_drivers(uint32_t *drv_count);
  *
  * @return GDAL dataset using GDAL MEM driver
  */
-GDALDatasetH rt_raster_to_gdal_mem(rt_raster raster, char *srs,
+GDALDatasetH rt_raster_to_gdal_mem(rt_raster raster, const char *srs,
        uint32_t *bandNums, int count, GDALDriverH *rtn_drv);
 
 /**
@@ -945,8 +945,8 @@ rt_raster rt_raster_from_gdal_dataset(GDALDatasetH ds);
  *
  * @return the warped raster
  */
-rt_raster rt_raster_gdal_warp(rt_raster raster, char *src_srs,
-       char *dst_srs,
+rt_raster rt_raster_gdal_warp(rt_raster raster, const char *src_srs,
+       const char *dst_srs,
        double *scale_x, double *scale_y,
        double *ul_x, double *ul_y,
        double *skew_x, double *skew_y,
index d8d37328a779be66c6c3cd7d9c18a13fe613f279..2f87363a45cf1ac94e3668b33f6aeb4a476d81e5 100644 (file)
@@ -97,6 +97,7 @@ static char   *chartrim(char* input, char *remove); /* for RASTER_reclass */
 static char **strsplit(const char *str, const char *delimiter, int *n); /* for RASTER_reclass */
 static char *removespaces(char *str); /* for RASTER_reclass */
 static char *trim(char* input); /* for RASTER_asGDALRaster */
+static char *getSRTextSPI(int srid);
 
 /***************************************************************
  * Some rules for returning NOTICE or ERROR...
@@ -459,6 +460,70 @@ trim(char *input) {
        return start;
 }
 
+static char*
+getSRTextSPI(int srid)
+{
+       int len = 0;
+       char *sql = NULL;
+       int spi_result;
+       TupleDesc tupdesc;
+       SPITupleTable *tuptable = NULL;
+       HeapTuple tuple;
+       char *tmp = NULL;
+       char *srs = NULL;
+
+       len = sizeof(char) * (strlen("SELECT srtext FROM spatial_ref_sys WHERE srid =  LIMIT 1") + MAX_INT_CHARLEN + 1);
+       sql = (char *) palloc(len);
+       if (NULL == sql) {
+               elog(ERROR, "getSrtextSPI: Unable to allocate memory for sql\n");
+               return NULL;
+       }
+
+       spi_result = SPI_connect();
+       if (spi_result != SPI_OK_CONNECT) {
+               elog(ERROR, "getSrtextSPI: 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);
+       spi_result = SPI_execute(sql, TRUE, 0);
+       pfree(sql);
+       if (spi_result != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
+               elog(ERROR, "getSrtextSPI: Cannot find SRID (%d) in spatial_ref_sys", srid);
+               if (SPI_tuptable) SPI_freetuptable(tuptable);
+               SPI_finish();
+               pfree(sql);
+               return NULL;
+       }
+
+       tupdesc = SPI_tuptable->tupdesc;
+       tuptable = SPI_tuptable;
+       tuple = tuptable->vals[0];
+
+       tmp = SPI_getvalue(tuple, tupdesc, 1);
+       if (NULL == tmp || !strlen(tmp)) {
+               elog(ERROR, "getSrtextSPI: Cannot find SRID (%d) in spatial_ref_sys", srid);
+               if (SPI_tuptable) SPI_freetuptable(tuptable);
+               SPI_finish();
+               return NULL;
+       }
+
+       SPI_freetuptable(tuptable);
+       SPI_finish();
+
+       len = strlen(tmp);
+       srs = (char *) palloc(sizeof(char) * (len + 1));
+       if (NULL == srs) {
+               elog(ERROR, "getSrtextSPI: Unable to allocate memory for srtext\n");
+               return NULL;
+       }
+       srs = strncpy(srs, tmp, len + 1);
+
+       return srs;
+}
+
 PG_FUNCTION_INFO_V1(RASTER_lib_version);
 Datum RASTER_lib_version(PG_FUNCTION_ARGS)
 {
@@ -4484,13 +4549,6 @@ Datum RASTER_asGDALRaster(PG_FUNCTION_ARGS)
        int srid = -1;
        char *srs = NULL;
 
-       int sqllen = 0;
-       char *sql = NULL;
-       int ret;
-       TupleDesc tupdesc;
-       SPITupleTable * tuptable = NULL;
-       HeapTuple tuple;
-
        ArrayType *array;
        Oid etype;
        Datum *e;
@@ -4607,44 +4665,16 @@ Datum RASTER_asGDALRaster(PG_FUNCTION_ARGS)
 
        /* get srs from srid */
        if (srid != SRID_UNKNOWN) {
-               sqllen = sizeof(char) * (strlen("SELECT _ST_srtext()") + MAX_INT_CHARLEN);
-               sql = (char *) palloc(sqllen);
-               if (NULL == sql) {
-                       elog(ERROR, "RASTER_asGDALRaster: Unable to allocate memory for SRID query");
-                       rt_raster_destroy(raster);
-                       PG_RETURN_NULL();
-               }
-
-               SPI_connect();
-
-               /* srs */
-               snprintf(sql, sqllen, "SELECT _ST_srtext(%d)", srid);
-               POSTGIS_RT_DEBUGF(4, "srs sql: %s", sql);
-               ret = SPI_execute(sql, TRUE, 0);
-               if (ret != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
-                       elog(ERROR, "RASTER_asGDALRaster: SRID provided is unknown");
-                       if (SPI_tuptable) SPI_freetuptable(tuptable);
-                       SPI_finish();
-                       rt_raster_destroy(raster);
-                       pfree(sql);
-                       PG_RETURN_NULL();
-               }
-               tupdesc = SPI_tuptable->tupdesc;
-               tuptable = SPI_tuptable;
-               tuple = tuptable->vals[0];
-               srs = SPI_getvalue(tuple, tupdesc, 1);
-               if (NULL == srs || !strlen(srs)) {
-                       elog(ERROR, "RASTER_asGDALRaster: SRID provided (%d) is invalid", srid);
-                       if (SPI_tuptable) SPI_freetuptable(tuptable);
-                       SPI_finish();
+               srs = getSRTextSPI(srid);
+               if (NULL == srs) {
+                       elog(ERROR, "RASTER_asGDALRaster: Could not find srtext for SRID (%d)", srid);
+                       if (NULL != options) {
+                               for (i = j - 1; i >= 0; i--) pfree(options[i]);
+                               pfree(options);
+                       }
                        rt_raster_destroy(raster);
-                       pfree(sql);
                        PG_RETURN_NULL();
                }
-               SPI_freetuptable(tuptable);
-               SPI_finish();
-               pfree(sql);
-
                POSTGIS_RT_DEBUGF(3, "RASTER_asGDALRaster: Arg 3 (srs) is %s", srs);
        }
        else
@@ -4658,6 +4688,7 @@ Datum RASTER_asGDALRaster(PG_FUNCTION_ARGS)
                for (i = j - 1; i >= 0; i--) pfree(options[i]);
                pfree(options);
        }
+       if (NULL != srs) pfree(srs);
        rt_raster_destroy(raster);
        PG_FREE_IF_COPY(pgraster, 0);
 
@@ -4871,13 +4902,6 @@ Datum RASTER_transform(PG_FUNCTION_ARGS)
        double *scale_x = NULL;
        double *scale_y = NULL;
 
-       int sqllen = 0;
-       char *sql = NULL;
-       int ret;
-       TupleDesc tupdesc;
-       SPITupleTable * tuptable = NULL;
-       HeapTuple tuple;
-
        POSTGIS_RT_DEBUG(3, "RASTER_transform: Starting");
 
        /* pgraster is null, return null */
@@ -4926,72 +4950,24 @@ Datum RASTER_transform(PG_FUNCTION_ARGS)
        POSTGIS_RT_DEBUGF(4, "max_err: %f", max_err);
 
        /* get srses from srids */
-       sqllen = sizeof(char) * (strlen("SELECT _ST_srtext()") + MAX_INT_CHARLEN);
-       sql = (char *) palloc(sqllen);
-       if (NULL == sql) {
-               elog(ERROR, "RASTER_transform: Unable to allocate memory for SRID queries");
-               rt_raster_destroy(raster);
-               PG_RETURN_NULL();
-       }
-
-       SPI_connect();
-
        /* source srs */
-       snprintf(sql, sqllen, "SELECT _ST_srtext(%d)", src_srid);
-       POSTGIS_RT_DEBUGF(4, "sourse srs sql: %s", sql);
-       ret = SPI_execute(sql, TRUE, 0);
-       if (ret != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
-               elog(ERROR, "RASTER_transform: Input raster has unknown SRID");
-               if (SPI_tuptable) SPI_freetuptable(tuptable);
-               SPI_finish();
-               rt_raster_destroy(raster);
-               pfree(sql);
-               PG_RETURN_NULL();
-       }
-       tupdesc = SPI_tuptable->tupdesc;
-       tuptable = SPI_tuptable;
-       tuple = tuptable->vals[0];
-       src_srs = SPI_getvalue(tuple, tupdesc, 1);
-       if (NULL == src_srs || !strlen(src_srs)) {
-               elog(ERROR, "RASTER_transform: Input raster has invalid SRID");
-               if (SPI_tuptable) SPI_freetuptable(tuptable);
-               SPI_finish();
+       src_srs = getSRTextSPI(src_srid);
+       if (NULL == src_srs) {
+               elog(ERROR, "RASTER_transform: Input raster has unknown SRID (%d)", src_srid);
                rt_raster_destroy(raster);
-               pfree(sql);
                PG_RETURN_NULL();
        }
-       POSTGIS_RT_DEBUGF(4, "sourse srs: %s", src_srs);
-       SPI_freetuptable(tuptable);
+       POSTGIS_RT_DEBUGF(4, "src srs: %s", src_srs);
 
        /* target srs */
-       sprintf(sql, "SELECT _ST_srtext(%d)", dst_srid);
-       POSTGIS_RT_DEBUGF(4, "destination srs sql: %s", sql);
-       ret = SPI_execute(sql, TRUE, 0);
-       if (ret != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
-               elog(ERROR, "RASTER_transform: Target SRID is unknown");
-               if (SPI_tuptable) SPI_freetuptable(tuptable);
-               SPI_finish();
-               rt_raster_destroy(raster);
-               pfree(sql);
-               PG_RETURN_NULL();
-       }
-       tupdesc = SPI_tuptable->tupdesc;
-       tuptable = SPI_tuptable;
-       tuple = tuptable->vals[0];
-       dst_srs = SPI_getvalue(tuple, tupdesc, 1);
-       if (NULL == dst_srs || !strlen(dst_srs)) {
-               elog(ERROR, "RASTER_transform: Target SRID is unknown");
-               if (SPI_tuptable) SPI_freetuptable(tuptable);
-               SPI_finish();
+       dst_srs = getSRTextSPI(dst_srid);
+       if (NULL == dst_srs) {
+               elog(ERROR, "RASTER_transform: Target SRID (%d) is unknown", dst_srid);
                rt_raster_destroy(raster);
-               pfree(sql);
+               if (NULL != src_srs) pfree(src_srs);
                PG_RETURN_NULL();
        }
-       POSTGIS_RT_DEBUGF(4, "destination srs: %s", dst_srs);
-       SPI_freetuptable(tuptable);
-
-       SPI_finish();
-       pfree(sql);
+       POSTGIS_RT_DEBUGF(4, "dst srs: %s", dst_srs);
 
        /* scale x */
        if (!PG_ARGISNULL(4)) {
@@ -5012,6 +4988,8 @@ Datum RASTER_transform(PG_FUNCTION_ARGS)
                NULL, NULL,
                alg, max_err);
        rt_raster_destroy(raster);
+       if (NULL != src_srs) pfree(src_srs);
+       if (NULL != dst_srs) pfree(dst_srs);
        if (!rast) {
                elog(ERROR, "RASTER_band: Could not create transformed raster");
                PG_RETURN_NULL();
index 3387b277d6362b534fedcc48aecdd6d8b90d946f..9da849964a093f9b4d89d1add8c3ae61cdf49264 100644 (file)
@@ -1147,35 +1147,6 @@ CREATE OR REPLACE FUNCTION st_gdaldrivers(OUT idx int, OUT short_name text, OUT
        AS 'MODULE_PATHNAME', 'RASTER_getGDALDrivers'
        LANGUAGE 'C' IMMUTABLE STRICT;
 
--- return the srtext of an srid
-CREATE OR REPLACE FUNCTION _st_srtext(q_srid integer)
-       RETURNS text
-       AS $$
-       DECLARE
-               q_srs text;
-       BEGIN
-               IF q_srid != -1 THEN
-                       SELECT
-                               CASE
-                                       WHEN length(srtext) > 0
-                                               THEN srtext
-                                       ELSE NULL
-                               END
-                       INTO q_srs
-                       FROM spatial_ref_sys
-                       WHERE srid = q_srid;
-
-                       IF NOT FOUND THEN
-                               q_srs := NULL;
-                       END IF;
-               ELSE
-                       q_srs := NULL;
-               END IF;
-
-               RETURN q_srs;
-       END;
-       $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT;
-
 -- Cannot be strict as "options" and "srid" can be NULL
 CREATE OR REPLACE FUNCTION st_asgdalraster(rast raster, format text, options text[] DEFAULT NULL, srid integer DEFAULT NULL)
        RETURNS bytea