Skip to content

Commit

Permalink
Merge pull request #663 from ungarj/rasterio_reproject_no_in_masked_a…
Browse files Browse the repository at this point in the history
…rray

rasterio>=1.4.x reproject array type
  • Loading branch information
ungarj authored Jan 10, 2025
2 parents 2edc31c + 69a9a70 commit ea96090
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
3 changes: 3 additions & 0 deletions mapchete/io/raster/array.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,9 @@ def resample_from_array(

dst_data = np.empty(dst_shape, array.dtype)

if isinstance(array, ma.MaskedArray):
array = array.data

reproject(
array,
dst_data,
Expand Down
20 changes: 20 additions & 0 deletions test/test_io_raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,26 @@ def test_resample_from_array():
out_array = resample_from_array(in_data, in_tile.affine, out_tile)
# deprecated
resample_from_array(in_data, in_tile.affine, out_tile, nodata=-9999)
# keep 2D
in_data = (np.ones(in_tile.shape[1:]),)
out_tile = BufferedTilePyramid("geodetic").tile(6, 10, 10)
out_array = resample_from_array(in_data, in_tile.affine, out_tile, keep_2d=True)
assert out_array.shape == (256, 256)
# not keep 2D
in_data = (np.ones(in_tile.shape[1:]),)
out_tile = BufferedTilePyramid("geodetic").tile(6, 10, 10)
out_array = resample_from_array(in_data, in_tile.affine, out_tile, keep_2d=False)
assert out_array.shape == (1, 256, 256)
# Test ma.MaskedArray input
in_data = (
ma.MaskedArray(
data=np.ones(in_tile.shape[1:]),
mask=np.invert(np.ones(in_tile.shape[1:]), dtype="bool", casting="unsafe"),
),
)
out_tile = BufferedTilePyramid("geodetic").tile(6, 10, 10)
out_array = resample_from_array(in_data, in_tile.affine, out_tile)
assert out_array.shape == (1, 256, 256)
# errors
with pytest.raises(TypeError):
in_data = "invalid_type"
Expand Down

6 comments on commit ea96090

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py330100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py760100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py830100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py120100% 
   reproject.py660100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py790100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1070100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1690100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1780100% 
   open.py150100% 
   read.py750100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73070100% 

Please sign in to comment.