From 48768e1bb992e5a58446a6d6f546cae4ad704243 Mon Sep 17 00:00:00 2001 From: systemed Date: Thu, 2 Jul 2026 17:08:52 +0100 Subject: [PATCH 1/2] Clamp affected tiles calculation to sane latitudes --- src/coordinates_geom.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/coordinates_geom.cpp b/src/coordinates_geom.cpp index 54344299..09b511da 100644 --- a/src/coordinates_geom.cpp +++ b/src/coordinates_geom.cpp @@ -117,13 +117,15 @@ void impl_insertIntermediateTiles(T const &points, uint baseZoom, std::unordered p2 = *it; // Calculate p2 tile, and mark it - double tileXf2 = lon2tilexf(p2.x(), baseZoom), tileYf2 = latp2tileyf(p2.y(), baseZoom); + double p2y = std::min(MaxLat, std::max(MinLat, p2.y())); + double tileXf2 = lon2tilexf(p2.x(), baseZoom), tileYf2 = latp2tileyf(p2y, baseZoom); TileCoordinate tileX2 = static_cast(tileXf2), tileY2 = static_cast(tileYf2); tileSet.insert(TileCoordinates(tileX2, tileY2)); if (it == points.begin()) continue; // first point, so no line // Calculate p1 tile - double tileXf1 = lon2tilexf(p1.x(), baseZoom), tileYf1 = latp2tileyf(p1.y(), baseZoom); + double p1y = std::min(MaxLat, std::max(MinLat, p1.y())); + double tileXf1 = lon2tilexf(p1.x(), baseZoom), tileYf1 = latp2tileyf(p1y, baseZoom); TileCoordinate tileX1 = static_cast(tileXf1), tileY1 = static_cast(tileYf1); tileSet.insert(TileCoordinates(tileX1,tileY1)); From 65156757c724c098bd7822392b34b6446fb8107b Mon Sep 17 00:00:00 2001 From: systemed Date: Thu, 2 Jul 2026 18:04:30 +0100 Subject: [PATCH 2/2] Clamp projected not raw latitude --- include/coordinates.h | 2 ++ src/coordinates_geom.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/coordinates.h b/include/coordinates.h index 1ff107b2..38390125 100644 --- a/include/coordinates.h +++ b/include/coordinates.h @@ -93,6 +93,8 @@ double rad2deg(double rad); // max/min latitudes constexpr double MaxLat = 85.0511; constexpr double MinLat = -MaxLat; +constexpr double MaxLatp = 180.0; +constexpr double MinLatp = -MaxLatp; // Project latitude (spherical Mercator) // (if calling with raw coords, remember to divide/multiply by 10000000.0) diff --git a/src/coordinates_geom.cpp b/src/coordinates_geom.cpp index 09b511da..05180d84 100644 --- a/src/coordinates_geom.cpp +++ b/src/coordinates_geom.cpp @@ -117,14 +117,14 @@ void impl_insertIntermediateTiles(T const &points, uint baseZoom, std::unordered p2 = *it; // Calculate p2 tile, and mark it - double p2y = std::min(MaxLat, std::max(MinLat, p2.y())); + double p2y = std::min(MaxLatp, std::max(MinLatp, p2.y())); double tileXf2 = lon2tilexf(p2.x(), baseZoom), tileYf2 = latp2tileyf(p2y, baseZoom); TileCoordinate tileX2 = static_cast(tileXf2), tileY2 = static_cast(tileYf2); tileSet.insert(TileCoordinates(tileX2, tileY2)); if (it == points.begin()) continue; // first point, so no line // Calculate p1 tile - double p1y = std::min(MaxLat, std::max(MinLat, p1.y())); + double p1y = std::min(MaxLatp, std::max(MinLatp, p1.y())); double tileXf1 = lon2tilexf(p1.x(), baseZoom), tileYf1 = latp2tileyf(p1y, baseZoom); TileCoordinate tileX1 = static_cast(tileXf1), tileY1 = static_cast(tileYf1); tileSet.insert(TileCoordinates(tileX1,tileY1));