]> granicus.if.org Git - postgis/commitdiff
Added MakeBox2D, MakeBox3D implementation and documentation.
authorSandro Santilli <strk@keybit.net>
Wed, 27 Oct 2004 15:40:48 +0000 (15:40 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 27 Oct 2004 15:40:48 +0000 (15:40 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@1056 b70326c6-7e19-0410-871a-916f4a2858ee

doc/postgis.xml
lwgeom/lwgeom_box2dfloat4.c
lwgeom/lwgeom_box3d.c
lwgeom/lwgeom_pg.h
lwgeom/lwpostgis.sql.in

index 612bc98d0ac661026100340350b4c326e7d87e46..4c6cfb97a2f7f3f6e606fb94b72ac7ac2eda2a28 100644 (file)
@@ -3691,6 +3691,22 @@ FROM geometry_table;</literallayout>
                  </listitem>
                </varlistentry>
 
+               <varlistentry>
+                 <term>MakeBox2D(&lt;LL&gt;, &lt;UR&gt;)</term>
+
+                 <listitem>
+                   <para>Creates a BOX2D defined by the given point geometries.</para>
+                 </listitem>
+               </varlistentry>
+
+               <varlistentry>
+                 <term>MakeBox3D(&lt;LLB&gt;, &lt;URT&gt;)</term>
+
+                 <listitem>
+                   <para>Creates a BOX3D defined by the given point geometries.</para>
+                 </listitem>
+               </varlistentry>
+
                <varlistentry>
                  <term>MakeLine(geometry set)</term>
 
index 3ebd58cebeacff785841262533ddd6af6d883c0f..237ead61cfbe32b71ad2ee753af66410d3048ee9 100644 (file)
@@ -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);
+}
+
index 972be7dd79db14a5ac82413047dc69e6a7ae8e42..69472d42ccfef3464d48cecd824ef92aa6b758ec 100644 (file)
@@ -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)
 {
index 35f6d2ff934e76ff033099cb5d32e9c6666b9720..382cf68db0edf309433dd00f6da51b27d1dcaa19 100644 (file)
@@ -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
index 2963c4f479e4a605bed87f04e90163f9ab524c61..89a004f88cc1b106012309111791a3236cf35b18 100644 (file)
@@ -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'