From 14116eb3e55edf3972ade0f6d75b53ef25a98dfd Mon Sep 17 00:00:00 2001 From: doug Date: Thu, 21 May 2026 18:51:09 -0500 Subject: [PATCH] Write rings in opposite order since Y axis is inverted (relative to Boost) for vector tiles. This ensures the tiles will pass checks in strict renderes such as ESRI --- src/tile_worker.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/tile_worker.cpp b/src/tile_worker.cpp index b61c1ea4..7e894332 100644 --- a/src/tile_worker.cpp +++ b/src/tile_worker.cpp @@ -192,15 +192,18 @@ bool writeRing( bool firstPoint = true; fbuilder.add_ring(points); - for (const Point& point : ring) { - pair xy = std::make_pair(point.get<0>(), point.get<1>()); + for (auto it = ring.rbegin(); it != ring.rend(); ++it) { + const Point& point = *it; - if (firstPoint || xy != lastXy) { - firstPoint = false; - lastXy = xy; - fbuilder.set_point(xy.first, xy.second); - } - } + pair xy = + std::make_pair(point.get<0>(), point.get<1>()); + + if (firstPoint || xy != lastXy) { + firstPoint = false; + lastXy = xy; + fbuilder.set_point(xy.first, xy.second); + } + } return true; } @@ -229,6 +232,8 @@ void writeMultiPolygon( if (geom::is_empty(current)) return; + geom::correct(current); + geom::validity_failure_type failure; if (verbose && !geom::is_valid(current, failure)) { cout << "output multipolygon has " << boost_validity_error(failure) << endl;