From: Sandro Santilli Date: Fri, 24 Sep 2004 09:46:53 +0000 (+0000) Subject: Added box2d->geometry cast. X-Git-Tag: pgis_1_0_0RC1~382 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc45e50b228b68780ffed6e31426aaf5052e7e81;p=postgis Added box2d->geometry cast. git-svn-id: http://svn.osgeo.org/postgis/trunk@890 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/lwgeom/lwgeom_box2dfloat4.c b/lwgeom/lwgeom_box2dfloat4.c index 05f615a93..b9581c596 100644 --- a/lwgeom/lwgeom_box2dfloat4.c +++ b/lwgeom/lwgeom_box2dfloat4.c @@ -34,6 +34,7 @@ Datum BOX2DFLOAT4_ymin(PG_FUNCTION_ARGS); Datum BOX2DFLOAT4_xmax(PG_FUNCTION_ARGS); Datum BOX2DFLOAT4_ymax(PG_FUNCTION_ARGS); Datum BOX2DFLOAT4_combine(PG_FUNCTION_ARGS); +Datum BOX2DFLOAT4_to_LWGEOM(PG_FUNCTION_ARGS); @@ -415,3 +416,39 @@ Datum BOX2DFLOAT4_combine(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } +PG_FUNCTION_INFO_V1(BOX2DFLOAT4_to_LWGEOM); +Datum BOX2DFLOAT4_to_LWGEOM(PG_FUNCTION_ARGS) +{ + BOX2DFLOAT4 *box = (BOX2DFLOAT4 *)PG_GETARG_POINTER(0); + POINT2D *pts = palloc(sizeof(POINT2D)*5); + POINTARRAY *pa[1]; + LWPOLY *poly; + int wantbbox = 0; + LWGEOM *result; + char *ser; + + // Assign coordinates to POINT2D array + pts[0].x = box->xmin; pts[0].y = box->ymin; + pts[1].x = box->xmin; pts[1].y = box->ymax; + pts[2].x = box->xmax; pts[2].y = box->ymax; + pts[3].x = box->xmax; pts[3].y = box->ymin; + pts[4].x = box->xmin; pts[4].y = box->ymin; + + // Construct point array + pa[0] = palloc(sizeof(POINTARRAY)); + pa[0]->serialized_pointlist = (char *)pts; + pa[0]->ndims = 2; + pa[0]->npoints = 5; + + // Construct polygon + poly = lwpoly_construct(2, -1, 1, pa); + + // Serialize polygon + ser = lwpoly_serialize(poly); + + // Construct LWGEOM + result = LWGEOM_construct(ser, -1, wantbbox); + + PG_RETURN_POINTER(result); +} + diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index dbdb2e014..29d67754c 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -2698,6 +2698,11 @@ CREATEFUNCTION box3dtobox(box3d) AS 'SELECT box($1)' LANGUAGE 'SQL' WITH (isstrict,iscachable); +CREATEFUNCTION geometry(box2d) + RETURNS geometry + AS '@MODULE_FILENAME@','BOX2DFLOAT4_to_LWGEOM' + LANGUAGE 'C' WITH (isstrict,iscachable); + CREATEFUNCTION geometry(box3d) RETURNS geometry AS '@MODULE_FILENAME@','BOX3D_to_LWGEOM' @@ -2730,6 +2735,7 @@ CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT; CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS IMPLICIT; CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT; CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT; +CREATE CAST (box2d AS geometry) WITH FUNCTION geometry(box2d) AS IMPLICIT; CREATE CAST (box3d AS box) WITH FUNCTION box(box3d) AS IMPLICIT; CREATE CAST (box3d AS geometry) WITH FUNCTION geometry(box3d) AS IMPLICIT; CREATE CAST (text AS geometry) WITH FUNCTION geometry(text) AS IMPLICIT;