diff --git a/include/mapbox/geojsonvt/clip.hpp b/include/mapbox/geojsonvt/clip.hpp index 3e4d451..07884e9 100644 --- a/include/mapbox/geojsonvt/clip.hpp +++ b/include/mapbox/geojsonvt/clip.hpp @@ -127,7 +127,7 @@ class clipper { slice = newSlice(line); - } else if (bk >= k1) { // ---|--> | + } else if (bk > k1) { // ---|--> | t = calc_progress(a, b, k1); slice.push_back(intersect(a, b, k1, t)); if (lineMetrics) slice.segStart = lineLen + segLen * t; @@ -135,7 +135,7 @@ class clipper { if (i == len - 2) slice.push_back(b); // last point } - } else if (ak >= k2) { + } else if (ak > k2) { if (bk < k1) { // <--|-----|--- t = calc_progress(a, b, k2); slice.push_back(intersect(a, b, k2, t)); @@ -202,7 +202,7 @@ class clipper { const double bk = get(b); if (ak < k1) { - if (bk >= k1) { + if (bk > k1) { // ---|--> | slice.push_back(intersect(a, b, k1, calc_progress(a, b, k1))); if (bk > k2) @@ -211,7 +211,7 @@ class clipper { else if (i == len - 2) slice.push_back(b); // last point } - } else if (ak >= k2) { + } else if (ak > k2) { if (bk < k2) { // | <--|--- slice.push_back(intersect(a, b, k2, calc_progress(a, b, k2))); if (bk < k1) // <--|-----|--- diff --git a/test/fixtures/polygon-bug.json b/test/fixtures/polygon-bug.json new file mode 100644 index 0000000..f3ea87b --- /dev/null +++ b/test/fixtures/polygon-bug.json @@ -0,0 +1,10 @@ +{ + "type": "Polygon", + "coordinates": [[ + [42.1875, 57.32652122521708], + [47.8125, 57.32652122521708], + [47.8125, 54.16243396806781], + [42.1875, 54.16243396806781], + [42.1875, 57.32652122521708] + ]] +} diff --git a/test/test.cpp b/test/test.cpp index 0b1dffd..883797a 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -243,6 +243,27 @@ TEST(GetTile, AntimeridianTriangle) { } } +TEST(GetTile, PolygonClippingBug) { + const auto geojson = mapbox::geojson::parse(loadFile("test/fixtures/polygon-bug.json")); + + Options options; + options.buffer = 1024; + + GeoJSONVT index{ geojson, options }; + + auto tile = index.getTile(5, 19, 9); + ASSERT_EQ(tile.features.size(), 1); + ASSERT_EQ(tile.num_points, 5); + + const mapbox::geometry::polygon expected{ + { {3072, 3072}, {5120, 3072}, {5120, 5120}, {3072, 5120}, {3072, 3072} } + }; + + const auto actual = tile.features[0].geometry.get>(); + + ASSERT_EQ(actual, expected); +} + TEST(GetTile, Projection) { const auto geojson = mapbox::geojson::parse(loadFile("test/fixtures/linestring.json"));