docs: def raster(self, name=None, **creteria):
          """Generates a GeoRaster2 object based on the asset name(key) or a creteria(protety name and value)."""
          if name:
              asset = self.assets[name]
              if asset["type"] in raster_types:
                  __object = asset.get('__object')
                  if isinstance(__object, GeoRaster2):
                      return __object
                  else:
                      return GeoRaster2.from_assets([asset])
              else:
                  return None
  
          if creteria:
              key = next(iter(creteria))
              value = creteria[key]
          else:
              # default creteria is to return a visual raster
              key = 'product'
              value = 'visual'
  
          rasters = {k: asset for k, asset in self.assets.items() if asset['type'] in raster_types}
          raster_list = list(rasters.values())
          # if there is only a single raster in the assetes and it hase a GeoRaster object serve the object
          if len(raster_list) == 1 and isinstance(raster_list[0].get('__object'), GeoRaster2):
              return raster_list[0].get('__object')
          rasters = {k: r for k, r in rasters.items() if r[key] == value}
          raster = GeoRaster2.from_assets(rasters)
          return raster