Skip to content

Commit 20debb0

Browse files
committed
fix a polygon clipping edge case
Port of mapbox/geojson-vt@2ba995a
1 parent e172e9c commit 20debb0

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

include/mapbox/geojsonvt/clip.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,15 @@ class clipper {
127127

128128
slice = newSlice(line);
129129

130-
} else if (bk >= k1) { // ---|--> |
130+
} else if (bk > k1) { // ---|--> |
131131
t = calc_progress<I>(a, b, k1);
132132
slice.push_back(intersect<I>(a, b, k1, t));
133133
if (lineMetrics) slice.segStart = lineLen + segLen * t;
134134

135135
if (i == len - 2)
136136
slice.push_back(b); // last point
137137
}
138-
} else if (ak >= k2) {
138+
} else if (ak > k2) {
139139
if (bk < k1) { // <--|-----|---
140140
t = calc_progress<I>(a, b, k2);
141141
slice.push_back(intersect<I>(a, b, k2, t));
@@ -202,7 +202,7 @@ class clipper {
202202
const double bk = get<I>(b);
203203

204204
if (ak < k1) {
205-
if (bk >= k1) {
205+
if (bk > k1) {
206206
// ---|--> |
207207
slice.push_back(intersect<I>(a, b, k1, calc_progress<I>(a, b, k1)));
208208
if (bk > k2)
@@ -211,7 +211,7 @@ class clipper {
211211
else if (i == len - 2)
212212
slice.push_back(b); // last point
213213
}
214-
} else if (ak >= k2) {
214+
} else if (ak > k2) {
215215
if (bk < k2) { // | <--|---
216216
slice.push_back(intersect<I>(a, b, k2, calc_progress<I>(a, b, k2)));
217217
if (bk < k1) // <--|-----|---

test/fixtures/polygon-bug.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"type": "Polygon",
3+
"coordinates": [[
4+
[42.1875, 57.32652122521708],
5+
[47.8125, 57.32652122521708],
6+
[47.8125, 54.16243396806781],
7+
[42.1875, 54.16243396806781],
8+
[42.1875, 57.32652122521708]
9+
]]
10+
}

test/test.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,27 @@ TEST(GetTile, AntimeridianTriangle) {
243243
}
244244
}
245245

246+
TEST(GetTile, PolygonClippingBug) {
247+
const auto geojson = mapbox::geojson::parse(loadFile("test/fixtures/polygon-bug.json"));
248+
249+
Options options;
250+
options.buffer = 1024;
251+
252+
GeoJSONVT index{ geojson, options };
253+
254+
auto tile = index.getTile(5, 19, 9);
255+
ASSERT_EQ(tile.features.size(), 1);
256+
ASSERT_EQ(tile.num_points, 5);
257+
258+
const mapbox::geometry::polygon<int16_t> expected{
259+
{ {3072, 3072}, {5120, 3072}, {5120, 5120}, {3072, 5120}, {3072, 3072} }
260+
};
261+
262+
const auto actual = tile.features[0].geometry.get<mapbox::geometry::polygon<int16_t>>();
263+
264+
ASSERT_EQ(actual, expected);
265+
}
266+
246267
TEST(GetTile, Projection) {
247268
const auto geojson = mapbox::geojson::parse(loadFile("test/fixtures/linestring.json"));
248269

0 commit comments

Comments
 (0)