From 2d59a17f98a3ea2df864fa66109460c07bef85b2 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 6 Jan 2005 13:46:41 +0000 Subject: [PATCH] Added makepolygon(geometry, geometry[]) git-svn-id: http://svn.osgeo.org/postgis/trunk@1234 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/lwgeom_functions_basic.c | 56 +++++++++++++++++++++++++++++++++ lwgeom/lwpostgis.sql.in | 10 ++++++ 2 files changed, 66 insertions(+) diff --git a/lwgeom/lwgeom_functions_basic.c b/lwgeom/lwgeom_functions_basic.c index 8f7676bba..9350f8518 100644 --- a/lwgeom/lwgeom_functions_basic.c +++ b/lwgeom/lwgeom_functions_basic.c @@ -50,6 +50,7 @@ Datum LWGEOM_makepoint(PG_FUNCTION_ARGS); Datum LWGEOM_makepoint3dm(PG_FUNCTION_ARGS); Datum LWGEOM_makeline_garray(PG_FUNCTION_ARGS); Datum LWGEOM_makeline(PG_FUNCTION_ARGS); +Datum LWGEOM_makepoly(PG_FUNCTION_ARGS); Datum LWGEOM_line_from_mpoint(PG_FUNCTION_ARGS); Datum LWGEOM_addpoint(PG_FUNCTION_ARGS); Datum LWGEOM_asEWKT(PG_FUNCTION_ARGS); @@ -2110,6 +2111,61 @@ Datum LWGEOM_makeline(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } +/* + * makepoly( GEOMETRY, GEOMETRY[] ) returns a POLYGON + * formed by the given shell and holes geometries. + */ +PG_FUNCTION_INFO_V1(LWGEOM_makepoly); +Datum LWGEOM_makepoly(PG_FUNCTION_ARGS) +{ + PG_LWGEOM *pglwg1; + ArrayType *array=NULL; + PG_LWGEOM *result=NULL; + const LWLINE *shell=NULL; + const LWLINE **holes=NULL; + LWPOLY *outpoly; + unsigned int nholes=0; + unsigned int i; + size_t offset=0; + +#ifdef DEBUG + elog(NOTICE, "LWGEOM_makepoly called"); +#endif + + /* Get input shell */ + pglwg1 = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + if ( ! TYPE_GETTYPE(pglwg1->type) == LINETYPE ) { + lwerror("Shell is not a line"); + } + shell = lwline_deserialize(SERIALIZED_FORM(pglwg1)); + + /* Get input holes if any */ + if ( PG_NARGS() > 1 ) + { + array = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); + nholes = ArrayGetNItems(ARR_NDIM(array), ARR_DIMS(array)); + holes = lwalloc(sizeof(LWLINE *)*nholes); + for (i=0; isize); + if ( TYPE_GETTYPE(g->type) != LINETYPE ) { + lwerror("Hole %d is not a line", i); + } + hole = lwline_deserialize(SERIALIZED_FORM(g)); + holes[i] = hole; + } + } + + outpoly = lwpoly_from_lwlines(shell, nholes, holes); + //lwnotice("%s", lwpoly_summary(outpoly)); + + result = pglwgeom_serialize((LWGEOM *)outpoly); + + PG_RETURN_POINTER(result); +} + // makes a polygon of the expanded features bvol - 1st point = LL 3rd=UR // 2d only. (3d might be worth adding). // create new geometry of type polygon, 1 ring, 5 points diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index cc17cb92c..2ea7579c1 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -1810,6 +1810,16 @@ CREATE AGGREGATE makeline ( finalfunc = makeline_garray ); +CREATEFUNCTION MakePolygon(geometry, geometry[]) + RETURNS geometry + AS '@MODULE_FILENAME@', 'LWGEOM_makepoly' + LANGUAGE 'C' WITH (iscachable,isstrict); + +CREATEFUNCTION MakePolygon(geometry) + RETURNS geometry + AS '@MODULE_FILENAME@', 'LWGEOM_makepoly' + LANGUAGE 'C' WITH (iscachable,isstrict); + CREATEFUNCTION polygonize_garray (geometry[]) RETURNS geometry AS '@MODULE_FILENAME@', 'GEOS_polygonize_garray' -- 2.40.0