From: Bborie Park Date: Mon, 27 Jun 2011 21:35:14 +0000 (+0000) Subject: - wrote function getSRTextSPI to create one code for getting the srtext of a SRID... X-Git-Tag: 2.0.0alpha1~1334 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1266f72050b1d007b8e881d2c243416ae4e845a0;p=postgis - wrote function getSRTextSPI to create one code for getting the srtext of a SRID from the spatial_ref_sys table. - 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 --- diff --git a/raster/rt_core/rt_api.c b/raster/rt_core/rt_api.c index bbd540fef..a0dd7a091 100644 --- a/raster/rt_core/rt_api.c +++ b/raster/rt_core/rt_api.c @@ -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"); diff --git a/raster/rt_core/rt_api.h b/raster/rt_core/rt_api.h index 086bf7816..8d66717f1 100644 --- a/raster/rt_core/rt_api.h +++ b/raster/rt_core/rt_api.h @@ -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, diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index d8d37328a..2f87363a4 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -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(); diff --git a/raster/rt_pg/rtpostgis.sql.in.c b/raster/rt_pg/rtpostgis.sql.in.c index 3387b277d..9da849964 100644 --- a/raster/rt_pg/rtpostgis.sql.in.c +++ b/raster/rt_pg/rtpostgis.sql.in.c @@ -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