docs: def reproject(self, dst_crs=None, resolution=None, dimensions=None,
                    src_bounds=None, dst_bounds=None, target_aligned_pixels=False,
                    resampling=Resampling.cubic, creation_options=None, **kwargs):
          """Return re-projected raster to new raster.
  
          Parameters
          ------------
          dst_crs: rasterio.crs.CRS, optional
              Target coordinate reference system.
          resolution: tuple (x resolution, y resolution) or float, optional
              Target resolution, in units of target coordinate reference
              system.
          dimensions: tuple (width, height), optional
              Output size in pixels and lines.
          src_bounds: tuple (xmin, ymin, xmax, ymax), optional
              Georeferenced extent of output (in source georeferenced units).
          dst_bounds: tuple (xmin, ymin, xmax, ymax), optional
              Georeferenced extent of output (in destination georeferenced units).
          target_aligned_pixels: bool, optional
              Align the output bounds based on the resolution.
              Default is `False`.
          resampling: rasterio.enums.Resampling
              Reprojection resampling method. Default is `cubic`.
          creation_options: dict, optional
              Custom creation options.
          kwargs: optional
              Additional arguments passed to transformation function.
  
          Returns
          ---------
          out: GeoRaster2
          """
          if self._image is None and self._filename is not None:
              # image is not loaded yet
              with tempfile.NamedTemporaryFile(suffix='.tif', delete=False) as tf:
                  warp(self._filename, tf.name, dst_crs=dst_crs, resolution=resolution,
                       dimensions=dimensions, creation_options=creation_options,
                       src_bounds=src_bounds, dst_bounds=dst_bounds,
                       target_aligned_pixels=target_aligned_pixels,
                       resampling=resampling, **kwargs)
  
              new_raster = self.__class__(filename=tf.name, temporary=True,
                                          band_names=self.band_names)
          else:
              # image is loaded already
              # SimpleNamespace is handy to hold the properties that calc_transform expects, see
              # https://docs.python.org/3/library/types.html#types.SimpleNamespace
              src = SimpleNamespace(width=self.width, height=self.height, transform=self.transform, crs=self.crs,
                                    bounds=BoundingBox(*self.footprint().get_bounds(self.crs)),
                                    gcps=None)
              dst_crs, dst_transform, dst_width, dst_height = calc_transform(
                  src, dst_crs=dst_crs, resolution=resolution, dimensions=dimensions,
                  target_aligned_pixels=target_aligned_pixels,
                  src_bounds=src_bounds, dst_bounds=dst_bounds)
              new_raster = self._reproject(dst_width, dst_height, dst_transform,
                                           dst_crs=dst_crs, resampling=resampling)
  
          return new_raster