std::vector<TileID> OfflineTilePyramidRegionDefinition::tileCover(SourceType type, uint16_t tileSize, const SourceInfo& info) const { double minZ = std::max<double>(coveringZoomLevel(minZoom, type, tileSize), info.minZoom); double maxZ = std::min<double>(coveringZoomLevel(maxZoom, type, tileSize), info.maxZoom); assert(minZ >= 0); assert(maxZ >= 0); assert(minZ < std::numeric_limits<uint8_t>::max()); assert(maxZ < std::numeric_limits<uint8_t>::max()); std::vector<TileID> result; for (uint8_t z = minZ; z <= maxZ; z++) { for (const auto& tile : mbgl::tileCover(bounds, z, z)) { result.push_back(tile.normalized()); } } return result; }
std::forward_list<Tile::ID> Source::coveringTiles(const TransformState& state) const { int32_t z = coveringZoomLevel(state); if (z < info.min_zoom) return {{}}; if (z > info.max_zoom) z = info.max_zoom; // Map four viewport corners to pixel coordinates box points = state.cornersToBox(z); const vec2<double>& center = points.center; std::forward_list<Tile::ID> covering_tiles = Tile::cover(z, points); covering_tiles.sort([¢er](const Tile::ID& a, const Tile::ID& b) { // Sorts by distance from the box center return std::fabs(a.x - center.x) + std::fabs(a.y - center.y) < std::fabs(b.x - center.x) + std::fabs(b.y - center.y); }); return covering_tiles; }