From af8bb4eaa7334f6419e9b47c61eb9d0547ca1226 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 9 Jan 2012 18:01:15 +0000 Subject: [PATCH] Change lwgeom_is_empty to return spatial emptiness (#671) git-svn-id: http://svn.osgeo.org/postgis/trunk@8725 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/cunit/cu_libgeom.c | 43 ++++++++++++++++++++++++++++++++++++ liblwgeom/lwcollection.c | 7 +++++- regress/dump_expected | 2 +- regress/tickets_expected | 2 +- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/liblwgeom/cunit/cu_libgeom.c b/liblwgeom/cunit/cu_libgeom.c index 50bd27e16..ad16ad8f1 100644 --- a/liblwgeom/cunit/cu_libgeom.c +++ b/liblwgeom/cunit/cu_libgeom.c @@ -693,6 +693,48 @@ static void test_lwgeom_force_clockwise(void) lwgeom_free(geom); } +/* + * Test lwgeom_is_empty + */ +static void test_lwgeom_is_empty(void) +{ + LWGEOM *geom; + char *in_ewkt, *out_ewkt; + + geom = lwgeom_from_wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))", LW_PARSER_CHECK_NONE); + CU_ASSERT( !lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POINT EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("LINESTRING EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POLYGON EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOINT EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTILINESTRING EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOLYGON EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY, POINT EMPTY, LINESTRING EMPTY, POLYGON EMPTY, MULTIPOINT EMPTY, MULTILINESTRING EMPTY, MULTIPOLYGON EMPTY, GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_is_empty(geom) ); + lwgeom_free(geom); + +} + /* ** Used by test harness to register the tests in this file. @@ -715,6 +757,7 @@ CU_TestInfo libgeom_tests[] = PG_TEST(test_lwgeom_clone), PG_TEST(test_lwgeom_force_clockwise), PG_TEST(test_lwgeom_calculate_gbox), + PG_TEST(test_lwgeom_is_empty), CU_TEST_INFO_NULL }; CU_SuiteInfo libgeom_suite = {"libgeom", NULL, NULL, libgeom_tests}; diff --git a/liblwgeom/lwcollection.c b/liblwgeom/lwcollection.c index f451f5aae..8b7c2a4cc 100644 --- a/liblwgeom/lwcollection.c +++ b/liblwgeom/lwcollection.c @@ -457,9 +457,14 @@ lwcollection_force_dims(const LWCOLLECTION *col, int hasz, int hasm) int lwcollection_is_empty(const LWCOLLECTION *col) { + int i; if ( (col->ngeoms == 0) || (!col->geoms) ) return LW_TRUE; - return LW_FALSE; + for( i = 0; i < col->ngeoms; i++ ) + { + if ( ! lwgeom_is_empty(col->geoms[i]) ) return LW_FALSE; + } + return LW_TRUE; } diff --git a/regress/dump_expected b/regress/dump_expected index 9f8738033..97aba4af4 100644 --- a/regress/dump_expected +++ b/regress/dump_expected @@ -15,4 +15,4 @@ t9|{3}|POLYGON((0 0,0 1,1 1,0 0)) t9|{4}|POLYGON((0 0,0 9,9 9,9 0,0 0),(5 5,5 6,6 6,5 5)) t9|{5,1}|POLYGON((0 0,0 9,9 9,9 0,0 0),(5 5,5 6,6 6,5 5)) t10|0 -t11|3 +t11|0 diff --git a/regress/tickets_expected b/regress/tickets_expected index b2533b991..704edf461 100644 --- a/regress/tickets_expected +++ b/regress/tickets_expected @@ -101,7 +101,7 @@ NOTICE: IllegalArgumentException: Invalid number of points in LinearRing found #683|0103000020E610000000000000 #684|0103000020E610000000000000 #685|0103000020E610000000000000 -#686|0107000020E610000002000000010300000000000000011100000000000000 +#686|0107000020E610000000000000 #687|f #689|f #690 -- 2.40.0