Datum LWGEOM_simplify2d(PG_FUNCTION_ARGS) { GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0); double dist = PG_GETARG_FLOAT8(1); GSERIALIZED *result; int type = gserialized_get_type(geom); LWGEOM *in, *out; bool preserve_collapsed = false; /* Handle optional argument to preserve collapsed features */ if ( PG_NARGS() > 2 && ! PG_ARGISNULL(2) ) preserve_collapsed = true; /* Can't simplify points! */ if ( type == POINTTYPE || type == MULTIPOINTTYPE ) PG_RETURN_POINTER(geom); in = lwgeom_from_gserialized(geom); out = lwgeom_simplify(in, dist, preserve_collapsed); 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); }
Datum LWGEOM_simplify2d(PG_FUNCTION_ARGS) { GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *result; int type = gserialized_get_type(geom); LWGEOM *in; LWGEOM *out; double dist; if ( type == POINTTYPE || type == MULTIPOINTTYPE ) PG_RETURN_POINTER(geom); dist = PG_GETARG_FLOAT8(1); in = lwgeom_from_gserialized(geom); out = lwgeom_simplify(in, dist); 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 void test_misc_simplify(void) { LWGEOM *geom; LWGEOM *geom2d; char *wkt_out; geom = lwgeom_from_wkt("LINESTRING(0 0,0 10,0 51,50 20,30 20,7 32)", LW_PARSER_CHECK_NONE); geom2d = lwgeom_simplify(geom, 2, LW_FALSE); wkt_out = lwgeom_to_ewkt(geom2d); CU_ASSERT_STRING_EQUAL("LINESTRING(0 0,0 51,50 20,30 20,7 32)",wkt_out); lwgeom_free(geom); lwgeom_free(geom2d); lwfree(wkt_out); geom = lwgeom_from_wkt("MULTILINESTRING((0 0,0 10,0 51,50 20,30 20,7 32))", LW_PARSER_CHECK_NONE); geom2d = lwgeom_simplify(geom, 2, LW_FALSE); wkt_out = lwgeom_to_ewkt(geom2d); CU_ASSERT_STRING_EQUAL("MULTILINESTRING((0 0,0 51,50 20,30 20,7 32))",wkt_out); lwgeom_free(geom); lwgeom_free(geom2d); lwfree(wkt_out); }
static void test_lwgeom_simplify(void) { LWGEOM *l; LWGEOM *g; char *ewkt; /* Simplify but only so far... */ g = lwgeom_from_wkt("LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 10, LW_TRUE); ewkt = lwgeom_to_ewkt(l); CU_ASSERT_STRING_EQUAL(ewkt, "LINESTRING(0 0,0 0)"); lwgeom_free(g); lwgeom_free(l); lwfree(ewkt); /* Simplify but only so far... */ g = lwgeom_from_wkt("POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 10, LW_TRUE); ewkt = lwgeom_to_ewkt(l); CU_ASSERT_STRING_EQUAL(ewkt, "POLYGON((0 0,1 0,1 1,0 0))"); lwgeom_free(g); lwgeom_free(l); lwfree(ewkt); /* Simplify and collapse */ g = lwgeom_from_wkt("LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 10, LW_FALSE); CU_ASSERT_EQUAL(l, NULL); lwgeom_free(g); lwgeom_free(l); /* Simplify and collapse */ g = lwgeom_from_wkt("POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 10, LW_FALSE); CU_ASSERT_EQUAL(l, NULL); lwgeom_free(g); lwgeom_free(l); /* Not simplifiable */ g = lwgeom_from_wkt("LINESTRING(0 0, 50 1.00001, 100 0)", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 1.0, LW_FALSE); ewkt = lwgeom_to_ewkt(l); CU_ASSERT_STRING_EQUAL(ewkt, "LINESTRING(0 0,50 1.00001,100 0)"); lwgeom_free(g); lwgeom_free(l); lwfree(ewkt); /* Simplifiable */ g = lwgeom_from_wkt("LINESTRING(0 0,50 0.99999,100 0)", LW_PARSER_CHECK_NONE); l = lwgeom_simplify(g, 1.0, LW_FALSE); ewkt = lwgeom_to_ewkt(l); CU_ASSERT_STRING_EQUAL(ewkt, "LINESTRING(0 0,100 0)"); lwgeom_free(g); lwgeom_free(l); lwfree(ewkt); }
LWCOLLECTION* lwcollection_simplify(const LWCOLLECTION *igeom, double dist) { int i; LWCOLLECTION *out = lwcollection_construct_empty(igeom->type, igeom->srid, FLAGS_GET_Z(igeom->flags), FLAGS_GET_M(igeom->flags)); if( lwcollection_is_empty(igeom) ) return out; /* should we return NULL instead ? */ for( i = 0; i < igeom->ngeoms; i++ ) { LWGEOM *ngeom = lwgeom_simplify(igeom->geoms[i], dist); if ( ngeom ) out = lwcollection_add_lwgeom(out, ngeom); } return out; }
Datum LWGEOM_simplify2d(PG_FUNCTION_ARGS) { GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); GSERIALIZED *result; LWGEOM *in = lwgeom_from_gserialized(geom); LWGEOM *out; double dist = PG_GETARG_FLOAT8(1); out = lwgeom_simplify(in, dist); 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); }