Datum LWGEOM_SetEffectiveArea(PG_FUNCTION_ARGS) { GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *result; int type = gserialized_get_type(geom); LWGEOM *in; LWGEOM *out; double area=0; int set_area=0; if ( type == POINTTYPE || type == MULTIPOINTTYPE ) PG_RETURN_POINTER(geom); if ( (PG_NARGS()>1) && (!PG_ARGISNULL(1)) ) area = PG_GETARG_FLOAT8(1); if ( (PG_NARGS()>2) && (!PG_ARGISNULL(2)) ) set_area = PG_GETARG_INT32(2); in = lwgeom_from_gserialized(geom); out = lwgeom_set_effective_area(in,set_area, area); if ( ! out ) PG_RETURN_NULL(); /* COMPUTE_BBOX TAINTING */ if ( in->bbox ) lwgeom_add_bbox(out); result = geometry_serialize(out); lwgeom_free(out); PG_FREE_IF_COPY(geom, 0); PG_RETURN_POINTER(result); }
static LWCOLLECTION* lwcollection_set_effective_area(const LWCOLLECTION *igeom,int set_area, double trshld) { LWDEBUG(2, "Entered lwcollection_set_effective_area"); int i; int set_m; if(set_area) set_m=1; else set_m=FLAGS_GET_M(igeom->flags); LWCOLLECTION *out = lwcollection_construct_empty(igeom->type, igeom->srid, FLAGS_GET_Z(igeom->flags), set_m); if( lwcollection_is_empty(igeom) ) return out; /* should we return NULL instead ? */ for( i = 0; i < igeom->ngeoms; i++ ) { LWGEOM *ngeom = lwgeom_set_effective_area(igeom->geoms[i],set_area,trshld); if ( ngeom ) out = lwcollection_add_lwgeom(out, ngeom); } return out; }