code: def render(self, da, level):
      xmin, xmax = self.tile_def.x_range
      ymin, ymax = self.tile_def.y_range
      extent = xmin, ymin, xmax, ymax
  
      tiles = self.tile_def.get_tiles_by_extent(extent, level)
      for t in tiles:
          x, y, z, data_extent = t
          dxmin, dymin, dxmax, dymax = data_extent
          arr = da.loc[
              {"x": slice(dxmin, dxmax), "y": slice(dymin, dymax)}
          ]
  
          if 0 in arr.shape:
              continue
  
          # flip since y tiles go down (Google map tiles
          img = fromarray(np.flip(arr.data, 0), "RGBA")
  
          if self.post_render_func:
              extras = dict(x=x, y=y, z=z)
              img = self.post_render_func(img, **extras)
  
          yield (img, x, y, z)
  
imports: from __future__ import annotations
  from io import BytesIO
  import math
  import os
  import dask
  import dask.bag
  import numpy
  from PIL.Image import fromarray
label_desc: Use image node_id 2 for calling the TileRenderer obj's underlying member method code with example usage: obj.render(da, level) without return types