[postgis-commits] svn - r3659 - in spike/wktraster/rt_pg: . test

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Fri Feb 6 02:33:06 PST 2009


Author: strk
Date: 2009-02-06 02:33:06 -0800 (Fri, 06 Feb 2009)
New Revision: 3659

Added:
   spike/wktraster/rt_pg/test/bbox.sql.c
Modified:
   spike/wktraster/rt_pg/rt_pg.c
   spike/wktraster/rt_pg/rtpostgis.sql.in.c
   spike/wktraster/rt_pg/test/Makefile
Log:
Implement RASTER to BOX2D cast, and add test for it

Modified: spike/wktraster/rt_pg/rt_pg.c
===================================================================
--- spike/wktraster/rt_pg/rt_pg.c	2009-02-06 10:14:32 UTC (rev 3658)
+++ spike/wktraster/rt_pg/rt_pg.c	2009-02-06 10:33:06 UTC (rev 3659)
@@ -63,6 +63,8 @@
 /* Prototypes */
 Datum RASTER_in(PG_FUNCTION_ARGS);
 Datum RASTER_out(PG_FUNCTION_ARGS);
+Datum RASTER_to_BOX2DFLOAT4(PG_FUNCTION_ARGS);
+
 Datum RASTER_to_LWGEOM(PG_FUNCTION_ARGS);
 Datum RASTER_getSRID(PG_FUNCTION_ARGS);
 Datum RASTER_getFactor(PG_FUNCTION_ARGS);
@@ -243,6 +245,43 @@
     PG_RETURN_CSTRING(hexwkb);
 }
 
+/**
+ * Return the bounding box of this raster as a BOX2D.
+ */
+PG_FUNCTION_INFO_V1(RASTER_to_BOX2DFLOAT4);
+Datum RASTER_to_BOX2DFLOAT4(PG_FUNCTION_ARGS)
+{
+    rt_pgraster *pgraster = (rt_pgraster *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+    rt_raster raster;
+    rt_context ctx = get_rt_context(fcinfo);
+    LWPOLY* envelope;
+    BOX2DFLOAT4 *bbox = (BOX2DFLOAT4 *) palloc(sizeof(BOX2DFLOAT4));
+
+    { /* TODO: can be optimized to only detoast the header! */
+        raster = rt_raster_deserialize(ctx, pgraster);
+        if ( ! raster ) {
+            elog(ERROR, "Could not deserialize raster");
+            PG_RETURN_NULL();
+        }
+
+        elog(NOTICE, "rt_raster_deserialize returned %p", raster);
+
+        envelope = rt_raster_get_envelope(ctx, raster);
+        if ( ! envelope ) {
+            elog(ERROR, "Could not get raster's envelope");
+            PG_RETURN_NULL();
+        }
+    }
+
+    if ( ! lwpoly_compute_box2d_p(envelope, bbox) )
+    {
+        elog(ERROR, "Empty raster's envelope!");
+        PG_RETURN_NULL();
+    }
+
+    PG_RETURN_POINTER(bbox);
+}
+
 /* ---------------------------------------------------------------- */
 /*  Memory allocation / error reporting hooks                       */
 /* ---------------------------------------------------------------- */

Modified: spike/wktraster/rt_pg/rtpostgis.sql.in.c
===================================================================
--- spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-02-06 10:14:32 UTC (rev 3658)
+++ spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-02-06 10:33:06 UTC (rev 3659)
@@ -25,7 +25,7 @@
 BEGIN;
 
 -------------------------------------------------------------------
---  CHIP TYPE
+--  RASTER TYPE
 -------------------------------------------------------------------
 
 CREATEFUNCTION rt_raster_in(cstring)
@@ -46,5 +46,16 @@
 	storage = extended
 );
 
+CREATEFUNCTION rt_raster_to_box2d(raster)
+	RETURNS BOX2D 
+	AS 'MODULE_PATHNAME','RASTER_to_BOX2DFLOAT4'
+	LANGUAGE 'C' _IMMUTABLE_STRICT; 
+
+-------------------------------------------------------------------
+--  CASTS
+-------------------------------------------------------------------
+
+CREATE CAST (raster AS box2d) WITH FUNCTION rt_raster_to_box2d(raster) AS IMPLICIT;
+
 COMMIT;
 

Modified: spike/wktraster/rt_pg/test/Makefile
===================================================================
--- spike/wktraster/rt_pg/test/Makefile	2009-02-06 10:14:32 UTC (rev 3658)
+++ spike/wktraster/rt_pg/test/Makefile	2009-02-06 10:33:06 UTC (rev 3659)
@@ -10,8 +10,12 @@
 # *
 # **********************************************************************
 
-io.sql: io.sql.c
-	$(CPP) -P -C -traditional io.sql.c > io.sql
+TESTS=io.sql bbox.sql
 
+all: $(TESTS)
+
+%.sql: %.sql.c
+	$(CPP) -P -C -traditional $< > $@
+
 clean:
-	rm -f io.sql
+	rm -f $(TESTS)

Added: spike/wktraster/rt_pg/test/bbox.sql.c
===================================================================
--- spike/wktraster/rt_pg/test/bbox.sql.c	2009-02-06 10:14:32 UTC (rev 3658)
+++ spike/wktraster/rt_pg/test/bbox.sql.c	2009-02-06 10:33:06 UTC (rev 3659)
@@ -0,0 +1,49 @@
+DROP TABLE rt_test_envelope;
+
+CREATE TABLE rt_test_envelope (
+        id serial,
+	name text,
+        rast raster,
+        env box2d
+    );
+
+-- 10x20, ip:0.5,0.5 scale:2,3
+INSERT INTO rt_test_envelope 
+VALUES ( 0, '10x20, ip:0.5,0.5 scale:2,3 skew:0,0',
+(
+'01' -- little endian (uint8 ndr)
+|| 
+'0000' -- version (uint16 0)
+||
+'0000' -- nBands (uint16 0)
+||
+'0000000000000040' -- scaleX (float64 2)
+||
+'0000000000000840' -- scaleY (float64 3)
+||
+'000000000000E03F' -- ipX (float64 0.5)
+||
+'000000000000E03F' -- ipY (float64 0.5)
+||
+'0000000000000000' -- skewX (float64 0)
+||
+'0000000000000000' -- skewY (float64 0)
+||
+'0A000000' -- SRID (int32 10)
+||
+'0A00' -- width (uint16 10)
+||
+'1400' -- height (uint16 20)
+)::raster
+,'BOX(-0.5 -1,19.5 59)' -- expected envelope (20x60) == (10*2 x 20*3)
+);
+
+
+SELECT
+	id,
+	env as expected,
+	rast::box2d as obtained
+FROM rt_test_envelope
+WHERE
+	rast::box2d::text != env::text;
+


Property changes on: spike/wktraster/rt_pg/test/bbox.sql.c
___________________________________________________________________
Name: svn:mergeinfo
   + 



More information about the postgis-commits mailing list