]> granicus.if.org Git - postgis/commitdiff
Removed geotransform type. Fixed rounding, so Hudson will be my friend in raster...
authorDavid Zwarg <dzwarg@azavea.com>
Wed, 8 Feb 2012 21:03:39 +0000 (21:03 +0000)
committerDavid Zwarg <dzwarg@azavea.com>
Wed, 8 Feb 2012 21:03:39 +0000 (21:03 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@9114 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_pg/rt_pg.c
raster/rt_pg/rtpostgis.sql.in.c
raster/test/regress/rt_rotation.sql
raster/test/regress/rt_rotation_expected

index 782d5a8846d4183c3fa137085f3218628a1262df..0f76302a2c15b585428ee31526a28e74b19f9def 100644 (file)
@@ -1607,32 +1607,34 @@ Datum RASTER_setGeotransform(PG_FUNCTION_ARGS)
 PG_FUNCTION_INFO_V1(RASTER_getGeotransform);
 Datum RASTER_getGeotransform(PG_FUNCTION_ARGS)
 {
-    rt_pgraster *rast ;
-    rt_raster raster ;
-    float8 imag, jmag, theta_i, theta_ij, xoffset, yoffset ;
-    TupleDesc result_tuple ; /* for returning a composite */
+    rt_pgraster *pgraster = NULL;
+    rt_raster raster = NULL;
+
+    double imag;
+    double jmag;
+    double theta_i;
+    double theta_ij;
+    double xoffset;
+    double yoffset;
+
+    TupleDesc result_tuple; /* for returning a composite */
+    bool *nulls = NULL;
+    int values_length = 6;
+    Datum values[values_length];
     HeapTuple heap_tuple ;   /* instance of the tuple to return */
-    Oid result_oid ;   /* internal code for the specific return type */
-    TypeFuncClass return_type ; /* is the return type a composite? */
-    Datum return_values[6] ;
-    bool nulls[6] ;
+    Datum result;
 
-    /* setup the return value infrastructure */
-    return_type = get_call_result_type(fcinfo, &result_oid, &result_tuple) ;
-    if (return_type != TYPEFUNC_COMPOSITE) {
-        rterror("RASTER_getGeotransform(): function returning record called in context that cannot accept type record") ;
-        PG_RETURN_NULL() ;
-    }
-    result_tuple = BlessTupleDesc(result_tuple) ;
+    POSTGIS_RT_DEBUG(3, "RASTER_getGeotransform: Starting");
 
     /* get argument */
-    if (PG_ARGISNULL(0)) PG_RETURN_NULL();
-    rast = (rt_pgraster *)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0),
-            0, sizeof(struct rt_raster_serialized_t));
+    if (PG_ARGISNULL(0))
+        PG_RETURN_NULL();
+    pgraster = (rt_pgraster *)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0), 0, sizeof(struct rt_raster_serialized_t));
 
-    raster = rt_raster_deserialize(rast, TRUE);
+    /* raster */
+    raster = rt_raster_deserialize(pgraster, TRUE);
     if (!raster) {
-        elog(ERROR, "RASTER_detGeotransform: Could not deserialize raster");
+        elog(ERROR, "RASTER_getGeotransform: Could not deserialize raster");
         PG_RETURN_NULL();
     }
 
@@ -1646,21 +1648,41 @@ Datum RASTER_getGeotransform(PG_FUNCTION_ARGS)
 
     rt_raster_destroy(raster);
 
+    /* setup the return value infrastructure */
+    if (get_call_result_type(fcinfo, NULL, &result_tuple) != TYPEFUNC_COMPOSITE) {
+        ereport(ERROR, (
+            errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+            errmsg("RASTER_getGeotransform(): function returning record called in context that cannot accept type record"
+            )
+        ));
+        PG_RETURN_NULL();
+    }
+
+    BlessTupleDesc(result_tuple);
+
+    /* get argument */
     /* prep the composite return value */
     /* construct datum array */
-    return_values[0] = Float8GetDatum(imag) ;
-    return_values[1] = Float8GetDatum(jmag) ;
-    return_values[2] = Float8GetDatum(theta_i) ;
-    return_values[3] = Float8GetDatum(theta_ij) ;
-    return_values[4] = Float8GetDatum(rt_raster_get_x_offset(raster)) ;
-    return_values[5] = Float8GetDatum(rt_raster_get_y_offset(raster)) ;
-    memset(nulls, FALSE, 6);
+    values[0] = Float8GetDatum(imag);
+    values[1] = Float8GetDatum(jmag);
+    values[2] = Float8GetDatum(theta_i);
+    values[3] = Float8GetDatum(theta_ij);
+    values[4] = Float8GetDatum(rt_raster_get_x_offset(raster));
+    values[5] = Float8GetDatum(rt_raster_get_y_offset(raster));
+
+    nulls = palloc(sizeof(bool) * values_length);
+    memset(nulls, FALSE, values_length);
 
     /* stick em on the heap */
-    heap_tuple = heap_form_tuple(result_tuple, return_values, nulls) ;
+    heap_tuple = heap_form_tuple(result_tuple, values, nulls);
+
+    /* make the tuple into a datum */
+    result = HeapTupleGetDatum(heap_tuple);
+
+    /* clean up */
+    pfree(nulls);
 
-    /* return */
-    PG_RETURN_DATUM(HeapTupleGetDatum(heap_tuple)) ;
+    PG_RETURN_DATUM(result);
 }
 
 
index 2690a0cb46393a7c354276f38df6425f21e0dac0..19f93047beae2eb01b7712c59525a1228fa97352 100644 (file)
@@ -150,16 +150,13 @@ CREATE OR REPLACE FUNCTION st_pixelheight(raster)
     AS 'MODULE_PATHNAME', 'RASTER_getPixelHeight'
     LANGUAGE 'C' IMMUTABLE STRICT;
 
-CREATE TYPE geotransform AS (
-    imag double precision,
-    jmag double precision,
-    theta_i double precision,
-    theta_ij double precision,
-    xoffset double precision,
-    yoffset double precision);
-
-CREATE OR REPLACE FUNCTION st_geotransform(raster)
-    RETURNS geotransform
+CREATE OR REPLACE FUNCTION st_geotransform(raster,
+    OUT imag double precision,
+    OUT jmag double precision,
+    OUT theta_i double precision,
+    OUT theta_ij double precision,
+    OUT xoffset double precision,
+    OUT yoffset double precision)
     AS 'MODULE_PATHNAME', 'RASTER_getGeotransform'
     LANGUAGE 'C' IMMUTABLE;
 
@@ -2309,13 +2306,6 @@ CREATE OR REPLACE FUNCTION st_setgeotransform(rast raster,
     AS 'MODULE_PATHNAME','RASTER_setGeotransform'
     LANGUAGE 'C' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_setgeotransform(rast raster, gt geotransform)
-    RETURNS raster
-    AS $$ SELECT st_setgeotransform($1, ($2).imag, ($2).jmag, 
-                    ($2).theta_i, ($2).theta_ij,
-                    ($2).xoffset, ($2).yoffset) $$
-    LANGUAGE 'sql' VOLATILE;
-
 -----------------------------------------------------------------------
 -- Raster Editors ST_SetGeoreference()
 -----------------------------------------------------------------------
index 787747a901868680782d1ee5e6fb17a2ab523a35..d070c5e52bc223abe82fb7ce6c8a961af278a245 100644 (file)
@@ -12,7 +12,7 @@
 -- st_skewx
 -----------------------------------------------------------------------
 
-SELECT id, name, skewx
+SELECT 'T1', id, name, skewx
     FROM rt_properties_test
     WHERE st_skewx(rast) != skewx;
 
@@ -20,7 +20,7 @@ SELECT id, name, skewx
 -- st_skewy
 -----------------------------------------------------------------------
 
-SELECT id, name, skewy
+SELECT 'T2', id, name, skewy
     FROM rt_properties_test
     WHERE st_skewy(rast) != skewy;
 
@@ -28,7 +28,7 @@ SELECT id, name, skewy
 -- st_setrotation
 -----------------------------------------------------------------------
 
-SELECT id, name, st_rotation(rast) as rotation
+SELECT 'T3', id, name, round(st_rotation(rast)*1000000000000) as rotation
     FROM rt_properties_test
     WHERE st_rotation(rast) != 0;
 
@@ -39,15 +39,15 @@ INSERT INTO rt_properties_test
     WHERE st_rotation(rast) != 0);
 
 UPDATE rt_properties_test
-    SET scalex = st_scalex(rast),
-        scaley = st_scaley(rast),
-        skewx = st_skewx(rast),
-        skewy = st_skewy(rast),
-        ipx = st_upperleftx(rast),
-        ipy = st_upperlefty(rast)
+    SET scalex = round(st_scalex(rast)*1000000000000),
+        scaley = round(st_scaley(rast)*1000000000000),
+        skewx = round(st_skewx(rast)*1000000000000),
+        skewy = round(st_skewy(rast)*1000000000000),
+        ipx = round(st_upperleftx(rast)*1000000000000),
+        ipy = round(st_upperlefty(rast)*1000000000000)
     WHERE id > 100;
 
-SELECT id, scalex, scaley, skewx, skewy, st_rotation(rast)
+SELECT 'T4', id, scalex, scaley, skewx, skewy, st_rotation(rast)
     FROM rt_properties_test
     WHERE id > 100;
 
@@ -56,15 +56,16 @@ UPDATE rt_properties_test
     WHERE id > 100;
 
 UPDATE rt_properties_test
-    SET scalex = st_scalex(rast),
-        scaley = st_scaley(rast),
-        skewx = st_skewx(rast),
-        skewy = st_skewy(rast),
-        ipx = st_upperleftx(rast),
-        ipy = st_upperlefty(rast)
+    SET scalex = round(st_scalex(rast)*1000000000000),
+        scaley = round(st_scaley(rast)*1000000000000),
+        skewx = round(st_skewx(rast)*1000000000000),
+        skewy = round(st_skewy(rast)*1000000000000),
+        ipx = round(st_upperleftx(rast)*1000000000000),
+        ipy = round(st_upperlefty(rast)*1000000000000)
     WHERE id > 100;
 
-SELECT id, scalex, scaley, skewx, skewy, st_rotation(rast)
+SELECT 'T5', id, scalex, scaley, skewx, skewy, 
+    round(st_rotation(rast)*1000000000000)
     FROM rt_properties_test
     WHERE id > 100;
 
@@ -73,15 +74,16 @@ UPDATE rt_properties_test
     WHERE id > 100;
 
 UPDATE rt_properties_test
-    SET scalex = st_scalex(rast),
-        scaley = st_scaley(rast),
-        skewx = st_skewx(rast),
-        skewy = st_skewy(rast),
-        ipx = st_upperleftx(rast),
-        ipy = st_upperlefty(rast)
+    SET scalex = round(st_scalex(rast)*1000000000000),
+        scaley = round(st_scaley(rast)*1000000000000),
+        skewx = round(st_skewx(rast)*1000000000000),
+        skewy = round(st_skewy(rast)*1000000000000),
+        ipx = round(st_upperleftx(rast)*1000000000000),
+        ipy = round(st_upperlefty(rast)*1000000000000)
     WHERE id > 100;
 
-SELECT id, scalex, scaley, skewx, skewy, st_rotation(rast)
+SELECT 'T6', id, scalex, scaley, skewx, skewy, 
+    round(st_rotation(rast)*1000000000000)
     FROM rt_properties_test
     WHERE id > 100;
 
index 903a6c04b3e36d94075833eae3a2d206c5930984..89fd90e8994bfb27d19850619b9bc5812a7e544c 100644 (file)
@@ -1,8 +1,8 @@
-4|1x1, ip:7.5,2.5 scale:5,5 skew:1,1, srid:-1, width:1, height:1|-0.19739555984988
-5|1x1, ip:7.5,2.5 scale:5,5 skew:3,7, srid:-1, width:1, height:1|-0.950546840812075
-104|5.09901951359278|4.70678724331642|1.96116135138184|-0|0
-105|8.60232526704263|0.464990554975281|5.81238193719096|-0|0
-104|3.60555127546399|1.9414506867883|4.71495166791445|-3.60555127546399|0.785398163397448
-105|6.08276253029822|-3.78117670802321|4.43877265724465|-6.08276253029822|0.785398163397448
-104|4.41588043316392|3.09561664722963|4.0518091728751|-2.54950975679639|0.523598775598298
-105|7.44983221287567|-2.50349733546706|5.26616569159282|-4.30116263352131|0.523598775598299
+T3|4|1x1, ip:7.5,2.5 scale:5,5 skew:1,1, srid:-1, width:1, height:1|-197395559850
+T3|5|1x1, ip:7.5,2.5 scale:5,5 skew:3,7, srid:-1, width:1, height:1|-950546840812
+T4|104|5099019513593|4706787243316|1961161351382|-0|0
+T4|105|8602325267043|464990554975|5812381937191|-0|0
+T5|104|3605551275464|1941450686788|4714951667914|-3605551275464|785398163397
+T5|105|6082762530298|-3781176708023|4438772657245|-6082762530298|785398163397
+T6|104|4415880433164|3095616647230|4051809172875|-2549509756796|523598775598
+T6|105|7449832212876|-2503497335467|5266165691593|-4301162633521|523598775598