diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-12-15 14:50:13 -0800 |
---|---|---|
committer | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2018-01-04 15:55:11 -0700 |
commit | ef39e8c25bd8c8c70f54f579a3250f7468a2dc0b (patch) | |
tree | 3200cec867c46ea7de78e16c34ffea86cef68b8d | |
parent | 5a0ca6eee6078c50fd74dc8c137fd4c63fb495fc (diff) | |
download | qtlocation-mapboxgl-ef39e8c25bd8c8c70f54f579a3250f7468a2dc0b.tar.gz |
[core] Fix TileRange for wrapped bounds and use for CustomTileLoader instead of LatLngBounds comparisons for tiles.
-rw-r--r-- | src/mbgl/style/custom_tile_loader.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/util/tile_range.hpp | 5 | ||||
-rw-r--r-- | test/util/tile_range.test.cpp | 48 |
3 files changed, 45 insertions, 19 deletions
diff --git a/src/mbgl/style/custom_tile_loader.cpp b/src/mbgl/style/custom_tile_loader.cpp index 76248b84bd..1c587302b8 100644 --- a/src/mbgl/style/custom_tile_loader.cpp +++ b/src/mbgl/style/custom_tile_loader.cpp @@ -1,5 +1,6 @@ #include <mbgl/style/custom_tile_loader.hpp> #include <mbgl/tile/custom_geometry_tile.hpp> +#include <mbgl/util/tile_range.hpp> namespace mbgl { namespace style { @@ -79,9 +80,15 @@ void CustomTileLoader::invalidateTile(const CanonicalTileID& tileID) { } void CustomTileLoader::invalidateRegion(const LatLngBounds& bounds, Range<uint8_t> ) { + std::map<uint8_t, util::TileRange> tileRanges; + for (auto idtuple= tileCallbackMap.begin(); idtuple != tileCallbackMap.end(); idtuple++) { - const LatLngBounds tileBounds(idtuple->first); - if (tileBounds.intersects(bounds, LatLng::Wrapped) || bounds.contains(tileBounds, LatLng::Wrapped) || tileBounds.contains(bounds, LatLng::Wrapped)) { + auto zoom = idtuple->first.z; + auto tileRange = tileRanges.find(zoom); + if(tileRange == tileRanges.end()) { + tileRange = tileRanges.emplace(std::make_pair(zoom, util::TileRange::fromLatLngBounds(bounds, zoom))).first; + } + if (tileRange->second.contains(idtuple->first)) { for (auto iter = idtuple->second.begin(); iter != idtuple->second.end(); iter++) { auto actor = std::get<2>(*iter); actor.invoke(&CustomGeometryTile::invalidateTileData); diff --git a/src/mbgl/util/tile_range.hpp b/src/mbgl/util/tile_range.hpp index 2a6f6b848c..eb7d2916c5 100644 --- a/src/mbgl/util/tile_range.hpp +++ b/src/mbgl/util/tile_range.hpp @@ -28,8 +28,9 @@ public: bool contains(const CanonicalTileID& tileID) { return z == tileID.z && - tileID.x < range.max.x && - tileID.x >= range.min.x && + (range.min.x >= range.max.x ? //For wrapped bounds + tileID.x >= range.min.x || tileID.x < range.max.x : + tileID.x < range.max.x && tileID.x >= range.min.x) && tileID.y < range.max.y && tileID.y >= range.min.y; } diff --git a/test/util/tile_range.test.cpp b/test/util/tile_range.test.cpp index 477170644b..dc8ae28705 100644 --- a/test/util/tile_range.test.cpp +++ b/test/util/tile_range.test.cpp @@ -7,12 +7,13 @@ using namespace mbgl; -TEST(TileRange, Contains) { - { - auto range = util::TileRange::fromLatLngBounds(LatLngBounds::world(), 0); - EXPECT_TRUE(range.contains(CanonicalTileID(0, 0, 0))); - EXPECT_FALSE(range.contains(CanonicalTileID(10, 0, 0))); - } +TEST(TileRange, ContainsWorld) { + auto range = util::TileRange::fromLatLngBounds(LatLngBounds::world(), 0); + EXPECT_TRUE(range.contains(CanonicalTileID(0, 0, 0))); + EXPECT_FALSE(range.contains(CanonicalTileID(10, 0, 0))); +} + +TEST(TileRange, ContainsBoundsFromTile) { { const LatLngBounds bounds{ CanonicalTileID(3, 7, 0) }; auto range = util::TileRange::fromLatLngBounds(bounds, 3); @@ -21,18 +22,35 @@ TEST(TileRange, Contains) { { const LatLngBounds bounds{ CanonicalTileID(10, 162, 395) }; auto range = util::TileRange::fromLatLngBounds(bounds, 10); - EXPECT_TRUE(range.contains(CanonicalTileID(10,162,395))); + EXPECT_TRUE(range.contains(CanonicalTileID(10, 162, 395))); } +} +TEST(TileRange, ContainsIntersectingTiles) { + auto bounds = LatLngBounds::hull({ 37.6609, -122.5744 }, { 37.8271, -122.3204 }); + auto range = util::TileRange::fromLatLngBounds(bounds, 13); + EXPECT_FALSE(range.contains(CanonicalTileID(13, 1316, 3100))); + EXPECT_TRUE(range.contains(CanonicalTileID(13, 1310, 3166))); +} + +TEST(TileRange, ContainsWrappedBounds) { + auto wrappedBounds = LatLngBounds::hull({ 37.6609, 237.6796 }, { 37.8271, 237.4256 }); + auto range = util::TileRange::fromLatLngBounds(wrappedBounds, 13); + EXPECT_FALSE(range.contains(CanonicalTileID(13, 1316, 3100))); + EXPECT_TRUE(range.contains(CanonicalTileID(13, 1310, 3166))); +} + +TEST(TileRange, ContainsBoundsCrossingAntimeridian) { { - auto bounds = LatLngBounds::hull({ 37.6609, -122.5744 }, { 37.8271, -122.3204 }); - auto range = util::TileRange::fromLatLngBounds(bounds, 13); - EXPECT_FALSE(range.contains(CanonicalTileID(13,1316,3100))); - EXPECT_TRUE(range.contains(CanonicalTileID(13, 1310, 3166))); + auto cossingBounds = LatLngBounds::hull({-20.9615, -214.309}, {19.477, -155.830}); + auto range = util::TileRange::fromLatLngBounds(cossingBounds, 1); + EXPECT_TRUE(range.contains(CanonicalTileID(1, 1, 1))); + EXPECT_TRUE(range.contains(CanonicalTileID(1, 0, 0))); } { - auto wrappedBounds = LatLngBounds::hull({ 37.6609, 237.6796 }, { 37.8271, 237.4256 }); - auto range = util::TileRange::fromLatLngBounds(wrappedBounds, 13); - EXPECT_FALSE(range.contains(CanonicalTileID(13,1316,3100))); - EXPECT_TRUE(range.contains(CanonicalTileID(13, 1310, 3166))); + auto cossingBounds = LatLngBounds::hull({-20.9615, -214.309}, {19.477, -155.830}); + auto range = util::TileRange::fromLatLngBounds(cossingBounds, 6); + EXPECT_FALSE(range.contains(CanonicalTileID(6, 55, 34))); + EXPECT_FALSE(range.contains(CanonicalTileID(6, 5, 28))); + EXPECT_TRUE(range.contains(CanonicalTileID(6, 63, 28))); } } |