diff --git a/rio_tiler/io/rasterio.py b/rio_tiler/io/rasterio.py index 2e2c1008..adb8e5cb 100644 --- a/rio_tiler/io/rasterio.py +++ b/rio_tiler/io/rasterio.py @@ -38,6 +38,7 @@ from rio_tiler.utils import ( CRS_to_uri, _validate_shape_input, + create_cutline, has_alpha_band, has_mask_band, ) @@ -254,6 +255,7 @@ def tile( tile_y: int, tile_z: int, tilesize: int = 256, + aoi: Optional[Dict] = None, indexes: Optional[Indexes] = None, expression: Optional[str] = None, buffer: Optional[float] = None, @@ -280,6 +282,11 @@ def tile( f"Tile(x={tile_x}, y={tile_y}, z={tile_z}) is outside bounds" ) + vrt_options = kwargs.pop("vrt_options", {}) + if aoi is not None: + cutline = create_cutline(self.dataset, aoi, geometry_crs="epsg:4326") + vrt_options.update({"cutline": cutline}) + return self.part( tuple(self.tms.xy_bounds(Tile(x=tile_x, y=tile_y, z=tile_z))), dst_crs=self.tms.rasterio_crs, @@ -290,6 +297,7 @@ def tile( indexes=indexes, expression=expression, buffer=buffer, + vrt_options=vrt_options, **kwargs, ) diff --git a/rio_tiler/reader.py b/rio_tiler/reader.py index 1006e3ca..1130b4bc 100644 --- a/rio_tiler/reader.py +++ b/rio_tiler/reader.py @@ -153,7 +153,13 @@ def read( "dtype": src_dst.dtypes[0], } - if nodata is not None: + if nodata is None: + vrt_params.update( + { + "init_dest_nodata": False + } + ) + else: vrt_params.update( { "nodata": nodata,