]> granicus.if.org Git - postgis/commitdiff
Instead of using spatial reference text in WKT format, use PROJ.4 format when possibl...
authorBborie Park <bkpark at ucdavis.edu>
Sat, 24 Dec 2011 01:14:16 +0000 (01:14 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Sat, 24 Dec 2011 01:14:16 +0000 (01:14 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@8537 b70326c6-7e19-0410-871a-916f4a2858ee

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

index c2b55f4dbbfe364b014befd0131434ac3eb7e4cf..0c0a7195a98e69470a6ca77b85c1bc6fc1d0024a 100644 (file)
@@ -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) {
index 3245304c27ae59a4ebe28d73a2c835cfe84c1577..d661bd271cbb992bdef0ff16906d16f5536b863c 100644 (file)
@@ -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
 */
index 67b0d85450d0d8aca57a481f5f89968abadcc691..cd20cb3d415645966c4ce5a523d3e56ab3a909b3 100644 (file)
@@ -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);