diff --git a/src/geom/CoordinateSequence.cpp b/src/geom/CoordinateSequence.cpp index a0ff679449..00d8a95da3 100644 --- a/src/geom/CoordinateSequence.cpp +++ b/src/geom/CoordinateSequence.cpp @@ -174,6 +174,22 @@ CoordinateSequence::add(const CoordinateSequence& cs) add(cs, 0, cs.size() - 1); } +void +CoordinateSequence::add(const CoordinateSequence& cs, std::size_t from, std::size_t to, bool allowRepeated) +{ + if (allowRepeated) { + add(cs, from, to); + return; + } + for (size_t i = from; i <= to; i++) { + if (size() == 0 || ! cs.getAt(i).equals2D( back())) { + add(cs, i, i); + } + } +} + +/* +//-- this code has a bug in it (fails to add last coordinate in some cases) void CoordinateSequence::add(const CoordinateSequence& cs, std::size_t from, std::size_t to, bool allowRepeated) { @@ -217,6 +233,7 @@ CoordinateSequence::add(const CoordinateSequence& cs, std::size_t from, std::siz add(cs, first, to); } } +//*/ void CoordinateSequence::add(const CoordinateSequence& cs, bool allowRepeated) { diff --git a/src/noding/SegmentNodeList.cpp b/src/noding/SegmentNodeList.cpp index 962f4a7c30..a68c206186 100644 --- a/src/noding/SegmentNodeList.cpp +++ b/src/noding/SegmentNodeList.cpp @@ -37,6 +37,7 @@ #if GEOS_DEBUG #include #endif +#include // using namespace geos::geom; @@ -312,8 +313,11 @@ SegmentNodeList::getSplitCoordinates() void SegmentNodeList::addEdgeCoordinates(const SegmentNode* ei0, const SegmentNode* ei1, CoordinateSequence& coordList) const { auto pts = createSplitEdgePts(ei0, ei1); +//std::cout << std::endl << std::setprecision(16) << "addEdgeCoordinates: " << *pts << std::endl; // Append pts to coordList coordList.add(*pts, false); +//std::cout << "updated coord list: " << std::setprecision(16) << coordList << std::endl; + } diff --git a/tests/unit/operation/overlayng/PrecisionReducerTest.cpp b/tests/unit/operation/overlayng/PrecisionReducerTest.cpp index 3b3f4f7ebb..7d9dc6ea0c 100644 --- a/tests/unit/operation/overlayng/PrecisionReducerTest.cpp +++ b/tests/unit/operation/overlayng/PrecisionReducerTest.cpp @@ -27,11 +27,11 @@ struct test_precisionreducer_data { WKTWriter w; void - checkReduce(const std::string& wkt, double gridSize, const std::string& wkt_expected) + checkReduce(const std::string& wkt, double scale, const std::string& wkt_expected) { std::unique_ptr geom = r.read(wkt); std::unique_ptr expected = r.read(wkt_expected); - PrecisionModel pm(1.0/gridSize); + PrecisionModel pm(scale); std::unique_ptr result = PrecisionReducer::reducePrecision(geom.get(), &pm); ensure_equals_geometry(result.get(), expected.get()); } @@ -142,7 +142,7 @@ template<> void object::test<11> () { checkReduce("LINESTRING(-3 6, 9 1)", - 2, "LINESTRING (-2 6, 10 2)"); + 0.5, "LINESTRING (-2 6, 10 2)"); } // testCollapsedLine @@ -170,9 +170,18 @@ void object::test<14> () { checkReduce("POLYGON ((2 1, 3 1, 3 2, 2 1))", // checkReduce("POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 1, 1 1), (1 2, 1 3, 2 3, 1 2), (2 3, 3 3, 3 2, 2 3))", - 1.0/10, "POLYGON ((2 1, 3 1, 3 2, 2 1))"); + 10, "POLYGON ((2 1, 3 1, 3 2, 2 1))"); } +// see https://github.com/libgeos/geos/issues/811 +template<> +template<> +void object::test<15> () +{ + checkReduce("POLYGON ((127.117461568 34.562519572, 127.117483252 34.5624884690001, 127.117603304 34.562319127, 127.117607152 34.562312309, 127.117607012 34.562312359, 127.117254733 34.5621607510001, 127.117746661 34.5620659730001, 127.117603496 34.5623196400001, 127.117484065 34.562488982, 127.117462315 34.562520066, 127.117245225 34.562385186, 127.117461568 34.562519572))", + 100000, + "POLYGON ((127.11775 34.56207, 127.11725 34.56216, 127.11761 34.56231, 127.11775 34.56207))"); +} } // namespace tut