def METHOD_NAME(self, udims, source_coordinates, source_data, eval_coordinates, output_data):
    """
    {interpolator_interpolate}
    """
    # TODO: handle when udims does not contain both lat and lon
    # if the source data has more dims than just lat/lon is asked, loop over those dims and run the interpolation
    # on those grids
    if len(source_data.dims) > 2:
        keep_dims = ["lat", "lon"]
        return self._loop_helper(
            self.METHOD_NAME, keep_dims, udims, source_coordinates, source_data, eval_coordinates, output_data
        )
    with rasterio.Env():
        src_transform = transform.Affine.from_gdal(*source_coordinates.geotransform)
        src_crs = rasterio.crs.CRS.from_proj4(source_coordinates.crs)
        # Need to make sure array is c-contiguous
        source = np.ascontiguousarray(source_data.data)
        dst_transform = transform.Affine.from_gdal(*eval_coordinates.geotransform)
        dst_crs = rasterio.crs.CRS.from_proj4(eval_coordinates.crs)
        # Need to make sure array is c-contiguous
        if not output_data.data.flags["C_CONTIGUOUS"]:
            destination = np.ascontiguousarray(output_data.data)
        else:
            destination = output_data.data
        reproject(
            source,
            np.atleast_2d(destination.squeeze()),  # Needed for legacy compatibility
            src_transform=src_transform,
            src_crs=src_crs,
            src_nodata=np.nan,
            dst_transform=dst_transform,
            dst_crs=dst_crs,
            dst_nodata=np.nan,
            resampling=getattr(Resampling, self.method),
        )
        output_data.data[:] = destination
    return output_data