diff --git a/tests/xmltester/XMLTester.cpp b/tests/xmltester/XMLTester.cpp index 4bd67edef3..5013e8bf96 100644 --- a/tests/xmltester/XMLTester.cpp +++ b/tests/xmltester/XMLTester.cpp @@ -45,6 +45,8 @@ #include #include #include +#include +#include #include #include #include @@ -2193,6 +2195,41 @@ XMLTester::parseTest(const tinyxml2::XMLNode* node) } } + else if(opName == "simplifydp" || opName == "simplifytp") + { + geom::Geometry* p_gT = gA; + if((opArg1 == "B" || opArg1 == "b") && gB) { + p_gT = gB; + } + + GeomPtr gRes(parseGeometry(opRes, "expected")); + gRes->normalize(); + + profile.start(); + + GeomPtr gRealRes; + double tolerance = std::atof(opArg2.c_str()); + + if (opName == "simplifydp") { + gRealRes = geos::simplify::DouglasPeuckerSimplifier::simplify(p_gT, tolerance); + } + else { + gRealRes = geos::simplify::TopologyPreservingSimplifier::simplify(p_gT, tolerance); + } + + profile.stop(); + gRealRes->normalize(); + + actual_result = printGeom(gRealRes.get()); + expected_result = printGeom(gRes.get()); + + success = gRealRes.get()->equalsExact(gRes.get(), 0.000001) ? 1 : 0; + + if(testValidOutput) { + success &= int(testValid(gRealRes.get(), "result")); + } + } + else { std::cerr << *curr_file << ":"; std::cerr << " case" << caseCount << ":"; diff --git a/tests/xmltester/tests/general/TestSimplify.xml b/tests/xmltester/tests/general/TestSimplify.xml new file mode 100644 index 0000000000..5b4dd0a6a0 --- /dev/null +++ b/tests/xmltester/tests/general/TestSimplify.xml @@ -0,0 +1,231 @@ + + Test cases for DouglasPeuckerSimplifier and TopologyPreservingSimplifier + + + + P - point + POINT(10 10) + + + POINT(10 10) + + + POINT(10 10) + + + + + mP - point with EMPTY + MULTIPOINT(EMPTY, (10 10), (20 20)) + + + MULTIPOINT((10 10), (20 20)) + + + MULTIPOINT((10 10), (20 20)) + + + + + L - empty line + LINESTRING EMPTY + + + LINESTRING EMPTY + + + LINESTRING EMPTY + + + + + L - line + LINESTRING (10 10, 20 21, 30 30) + + + LINESTRING (10 10, 30 30) + + + LINESTRING (10 10, 30 30) + + + + + L - short line + LINESTRING (0 5, 1 5, 2 5, 5 5) + + + LINESTRING (0 5, 5 5) + + + LINESTRING (0 5, 5 5) + + + + + mL - lines with constrained topology + MULTILINESTRING ((10 60, 39 50, 70 60, 90 50), (35 55, 46 55), (65 55, 75 55), (10 40, 40 30, 70 40, 90 30)) + + + MULTILINESTRING ((10 60, 90 50), (35 55, 46 55), (65 55, 75 55), (10 40, 90 30)) + + + MULTILINESTRING ((10 60, 39 50, 70 60, 90 50), (35 55, 46 55), (65 55, 75 55), (10 40, 90 30)) + + + + + mL - lines with EMPTY + MULTILINESTRING(EMPTY, (10 10, 20 21, 30 30), (10 10, 10 30, 30 30)) + + + MULTILINESTRING ((10 10, 30 30), (10 10, 10 30, 30 30)) + + + MULTILINESTRING ((10 10, 30 30), (10 10, 10 30, 30 30)) + + + + + A - polygon with flat endpoint + POLYGON ((5 1, 1 1, 1 9, 9 9, 9 1, 5 1)) + + + POLYGON ((1 1, 1 9, 9 9, 9 1, 1 1)) + + + POLYGON ((1 1, 1 9, 9 9, 9 1, 1 1)) + + + + + A - polygon with multiple flat segments around endpoint + POLYGON ((5 5, 7 5, 9 5, 9 1, 1 1, 1 5, 3 5, 5 5)) + + + POLYGON ((9 5, 9 1, 1 1, 1 5, 9 5)) + + + POLYGON ((9 5, 9 1, 1 1, 1 5, 9 5)) + + + + + A - polygon simplification + POLYGON ((10 10, 10 90, 60.5 87, 90 90, 90 10, 12 12, 10 10)) + + + POLYGON ((10 10, 10 90, 90 90, 90 10, 10 10)) + + + POLYGON ((10 10, 10 90, 90 90, 90 10, 10 10)) + + + + + A - polygon with edge collapse. + DP: polygon is split + TP: unchanged + + POLYGON ((40 240, 160 241, 280 240, 280 160, 160 240, 40 140, 40 240)) + + + MULTIPOLYGON (((40 240, 160 240, 40 140, 40 240)), ((160 240, 280 240, 280 160, 160 240))) + + + POLYGON ((40 240, 160 241, 280 240, 280 160, 160 240, 40 140, 40 240)) + + + + + A - polygon collapse for DP + POLYGON ((5 2, 9 1, 1 1, 5 2)) + + + POLYGON EMPTY + + + POLYGON ((5 2, 9 1, 1 1, 5 2)) + + + + + A - polygon with touching hole + POLYGON ((10 10, 10 90, 90 90, 90 10, 10 10), (80 20, 20 20, 20 80, 50 90, 80 80, 80 20)) + + + POLYGON ((10 10, 10 90, 90 90, 90 10, 10 10), (80 20, 20 20, 20 80, 80 80, 80 20)) + + + POLYGON ((10 10, 10 90, 90 90, 90 10, 10 10), (80 20, 20 20, 20 80, 80 80, 80 20)) + + + + + A - polygon with large hole near edge. + DP: simplified and fixed + TP: unchanged + + POLYGON ((10 10, 10 80, 50 90, 90 80, 90 10, 10 10), (80 20, 20 20, 50 90, 80 20)) + + + POLYGON ((10 10, 10 80, 45.714285714285715 80, 20 20, 80 20, 54.285714285714285 80, 90 80, 90 10, 10 10)) + + + POLYGON ((10 10, 10 80, 50 90, 90 80, 90 10, 10 10), (80 20, 20 20, 50 90, 80 20)) + + + + + A - polygon with small hole near simplified edge + DP: hole is remmoved + TP: hole is preserved + + POLYGON ((10 10, 10 80, 50 90, 90 80, 90 10, 10 10), (70 81, 30 81, 50 90, 70 81)) + + + POLYGON ((10 10, 10 80, 90 80, 90 10, 10 10)) + + + POLYGON ((10 10, 10 80, 50 90, 90 80, 90 10, 10 10), (70 81, 30 81, 50 90, 70 81)) + + + + + mA - multipolygon with EMPTY + MULTIPOLYGON (EMPTY, ((10 90, 10 10, 90 10, 50 60, 10 90)), ((70 90, 90 90, 90 70, 70 70, 70 90))) + + + MULTIPOLYGON (((10 90, 10 10, 90 10, 10 90)), ((70 90, 90 90, 90 70, 70 70, 70 90))) + + + MULTIPOLYGON (((10 90, 10 10, 90 10, 50 60, 10 90)), ((70 90, 90 90, 90 70, 70 70, 70 90))) + + + + + mA - multipolygon with small element removed + MULTIPOLYGON (((10 90, 10 10, 40 40, 90 10, 47 57, 10 90)), ((90 90, 90 85, 85 85, 85 90, 90 90))) + + + POLYGON ((10 90, 10 10, 40 40, 90 10, 10 90)) + + + MULTIPOLYGON (((10 90, 10 10, 40 40, 90 10, 10 90)), ((85 90, 90 85, 85 85, 85 90))) + + + + + GC - geometry collection + GEOMETRYCOLLECTION (POLYGON ((10 90, 10 10, 40 40, 90 10, 47 57, 10 90)), LINESTRING (30 90, 65 65, 90 30), MULTIPOINT ((80 90), (90 90))) + + + GEOMETRYCOLLECTION (POLYGON ((10 90, 10 10, 40 40, 90 10, 10 90)), LINESTRING (30 90, 90 30), MULTIPOINT ((80 90), (90 90))) + + + GEOMETRYCOLLECTION (POLYGON ((10 90, 10 10, 40 40, 90 10, 10 90)), LINESTRING (30 90, 90 30), MULTIPOINT ((80 90), (90 90))) + + + + +