From 0f04d0ff60329d3b57cdf96f29ccad0d803cf46a Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 27 Oct 2004 15:40:48 +0000 Subject: [PATCH] Added MakeBox2D, MakeBox3D implementation and documentation. git-svn-id: http://svn.osgeo.org/postgis/trunk@1056 b70326c6-7e19-0410-871a-916f4a2858ee --- doc/postgis.xml | 16 ++++++++++++++++ lwgeom/lwgeom_box2dfloat4.c | 30 ++++++++++++++++++++++++++++++ lwgeom/lwgeom_box3d.c | 33 +++++++++++++++++++++++++++++++++ lwgeom/lwgeom_pg.h | 2 ++ lwgeom/lwpostgis.sql.in | 10 ++++++++++ 5 files changed, 91 insertions(+) diff --git a/doc/postgis.xml b/doc/postgis.xml index 612bc98d0..4c6cfb97a 100644 --- a/doc/postgis.xml +++ b/doc/postgis.xml @@ -3691,6 +3691,22 @@ FROM geometry_table; + + MakeBox2D(<LL>, <UR>) + + + Creates a BOX2D defined by the given point geometries. + + + + + MakeBox3D(<LLB>, <URT>) + + + Creates a BOX3D defined by the given point geometries. + + + MakeLine(geometry set) diff --git a/lwgeom/lwgeom_box2dfloat4.c b/lwgeom/lwgeom_box2dfloat4.c index 3ebd58ceb..237ead61c 100644 --- a/lwgeom/lwgeom_box2dfloat4.c +++ b/lwgeom/lwgeom_box2dfloat4.c @@ -432,3 +432,33 @@ Datum BOX2DFLOAT4_to_LWGEOM(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } +PG_FUNCTION_INFO_V1(BOX2DFLOAT4_construct); +Datum BOX2DFLOAT4_construct(PG_FUNCTION_ARGS) +{ + PG_LWGEOM *min = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + PG_LWGEOM *max = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); + BOX2DFLOAT4 *result = palloc(sizeof(BOX2DFLOAT4)); + LWGEOM *minpoint, *maxpoint; + POINT2D minp, maxp; + + minpoint = lwgeom_deserialize(SERIALIZED_FORM(min)); + maxpoint = lwgeom_deserialize(SERIALIZED_FORM(max)); + + if ( TYPE_GETTYPE(minpoint->type) != POINTTYPE || + TYPE_GETTYPE(maxpoint->type) != POINTTYPE ) + { + elog(ERROR, "BOX2DFLOAT4_construct: args must be points"); + PG_RETURN_NULL(); + } + getPoint2d_p(((LWPOINT *)minpoint)->point, 0, &minp); + getPoint2d_p(((LWPOINT *)maxpoint)->point, 0, &maxp); + + result->xmax = maxp.x; + result->ymax = maxp.y; + + result->xmin = minp.x; + result->ymin = minp.y; + + PG_RETURN_POINTER(result); +} + diff --git a/lwgeom/lwgeom_box3d.c b/lwgeom/lwgeom_box3d.c index 972be7dd7..69472d42c 100644 --- a/lwgeom/lwgeom_box3d.c +++ b/lwgeom/lwgeom_box3d.c @@ -325,6 +325,39 @@ Datum BOX3D_combine(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } +PG_FUNCTION_INFO_V1(BOX3D_construct); +Datum BOX3D_construct(PG_FUNCTION_ARGS) +{ + PG_LWGEOM *min = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + PG_LWGEOM *max = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); + BOX3D *result = palloc(sizeof(BOX3D)); + LWGEOM *minpoint, *maxpoint; + POINT3DZ minp, maxp; + + minpoint = lwgeom_deserialize(SERIALIZED_FORM(min)); + maxpoint = lwgeom_deserialize(SERIALIZED_FORM(max)); + + if ( TYPE_GETTYPE(minpoint->type) != POINTTYPE || + TYPE_GETTYPE(maxpoint->type) != POINTTYPE ) + { + elog(ERROR, "BOX2DFLOAT4_construct: args must be points"); + PG_RETURN_NULL(); + } + + getPoint3dz_p(((LWPOINT *)minpoint)->point, 0, &minp); + getPoint3dz_p(((LWPOINT *)maxpoint)->point, 0, &maxp); + + result->xmax = maxp.x; + result->ymax = maxp.y; + result->zmax = maxp.z; + + result->xmin = minp.x; + result->ymin = minp.y; + result->zmin = minp.z; + + PG_RETURN_POINTER(result); +} + //min(a,b) double LWGEOM_Mind(double a, double b) { diff --git a/lwgeom/lwgeom_pg.h b/lwgeom/lwgeom_pg.h index 35f6d2ff9..382cf68db 100644 --- a/lwgeom/lwgeom_pg.h +++ b/lwgeom/lwgeom_pg.h @@ -37,6 +37,8 @@ Datum BOX2D_intersects(PG_FUNCTION_ARGS); Datum BOX2D_union(PG_FUNCTION_ARGS); Datum LWGEOM_same(PG_FUNCTION_ARGS); +Datum BOX3D_construct(PG_FUNCTION_ARGS); +Datum BOX2DFLOAT4_ymin(PG_FUNCTION_ARGS); #endif // !defined _LWGEOM_PG_H 1 diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index 2963c4f47..89a004f88 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -1672,6 +1672,16 @@ CREATEFUNCTION makePointM(float8, float8, float8) AS '@MODULE_FILENAME@', 'LWGEOM_makepoint3dm' LANGUAGE 'C' WITH (iscachable,isstrict); +CREATEFUNCTION makeBox2d(geometry, geometry) + RETURNS box2d + AS '@MODULE_FILENAME@', 'BOX2DFLOAT4_construct' + LANGUAGE 'C' WITH (iscachable,isstrict); + +CREATEFUNCTION makeBox3d(geometry, geometry) + RETURNS box3d + AS '@MODULE_FILENAME@', 'BOX3D_construct' + LANGUAGE 'C' WITH (iscachable,isstrict); + CREATEFUNCTION makeline_garray (geometry[]) RETURNS geometry AS '@MODULE_FILENAME@', 'LWGEOM_makeline_garray' -- 2.40.0