[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