rio-tiler 7.3.0__tar.gz → 7.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/PKG-INFO +2 -3
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/pyproject.toml +2 -3
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/__init__.py +1 -1
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/colormap.py +2 -9
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/stac.py +2 -1
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/xarray.py +118 -71
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/models.py +45 -3
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/.gitignore +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/AUTHORS.txt +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/LICENSE +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/README.md +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/__init__.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/accent.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/accent_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/afmhot.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/afmhot_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/algae.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/algae_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/amp.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/amp_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/autumn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/autumn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/balance.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/balance_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/binary.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/binary_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/blues.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/blues_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bone.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bone_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brbg.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brbg_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brg.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brg_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bugn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bugn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bupu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bupu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bwr.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bwr_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cfastie.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cividis.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cividis_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cmrmap.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cmrmap_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cool.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cool_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/coolwarm.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/coolwarm_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/copper.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/copper_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cubehelix.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cubehelix_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/curl.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/curl_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dark2.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dark2_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/deep.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/deep_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/delta.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/delta_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dense.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dense_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/diff.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/diff_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/flag.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/flag_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_earth.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_earth_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_gray.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_gray_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_heat.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_heat_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_ncar.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_ncar_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_rainbow.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_rainbow_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_stern.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_stern_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_yarg.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_yarg_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnbu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnbu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot2.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot2_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gray.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gray_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greens.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greens_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greys.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greys_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/haline.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/haline_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hot.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hot_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hsv.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hsv_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ice.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ice_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/inferno.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/inferno_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/jet.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/jet_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/magma.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/magma_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/matter.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/matter_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/nipy_spectral.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/nipy_spectral_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ocean.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ocean_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oranges.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oranges_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/orrd.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/orrd_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oxy.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oxy_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/paired.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/paired_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel1.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel1_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel2.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel2_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/phase.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/phase_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pink.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pink_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/piyg.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/piyg_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/plasma.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/plasma_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prgn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prgn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prism.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prism_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubugn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubugn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/puor.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/puor_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purd.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purd_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purples.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purples_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rain.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rain_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rainbow.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rainbow_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdbu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdbu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdgy.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdgy_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdpu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdpu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylbu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylbu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylgn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylgn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/reds.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/reds_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rplumbo.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/schwarzwald.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/seismic.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/seismic_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set1.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set1_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set2.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set2_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set3.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set3_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/solar.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/solar_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spectral.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spectral_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/speed.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/speed_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spring.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spring_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/summer.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/summer_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab10.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab10_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20b.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20b_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20c.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20c_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tarn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tarn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tempo.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tempo_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/terrain.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/terrain_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/thermal.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/thermal_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/topo.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/topo_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbid.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbid_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbo.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbo_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_shifted.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_shifted_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/viridis.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/viridis_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/winter.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/winter_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/wistia.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/wistia_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgn.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgn_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgnbu.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgnbu_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorbr.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorbr_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorrd.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorrd_r.npy +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/constants.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/errors.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/expression.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/__init__.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/base.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/rasterio.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/logger.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/__init__.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/__init__.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/base.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/defaults.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/reader.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/profiles.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/py.typed +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/reader.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/tasks.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/types.py +0 -0
- {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rio-tiler
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.4.0
|
|
4
4
|
Summary: User friendly Rasterio plugin to read raster datasets.
|
|
5
5
|
Project-URL: Homepage, https://cogeotiff.github.io/rio-tiler/
|
|
6
6
|
Project-URL: Documentation, https://cogeotiff.github.io/rio-tiler/
|
|
@@ -54,13 +54,12 @@ Requires-Dist: attrs
|
|
|
54
54
|
Requires-Dist: cachetools
|
|
55
55
|
Requires-Dist: color-operations
|
|
56
56
|
Requires-Dist: httpx
|
|
57
|
-
Requires-Dist: importlib-resources>=1.1.0; python_version < '3.9'
|
|
58
57
|
Requires-Dist: morecantile<7.0,>=5.0
|
|
59
58
|
Requires-Dist: numexpr
|
|
60
59
|
Requires-Dist: numpy
|
|
61
60
|
Requires-Dist: pydantic~=2.0
|
|
62
61
|
Requires-Dist: pystac>=0.5.4
|
|
63
|
-
Requires-Dist: rasterio>=1.
|
|
62
|
+
Requires-Dist: rasterio>=1.4.0
|
|
64
63
|
Requires-Dist: typing-extensions
|
|
65
64
|
Provides-Extra: benchmark
|
|
66
65
|
Requires-Dist: pytest; extra == 'benchmark'
|
|
@@ -29,10 +29,9 @@ dependencies = [
|
|
|
29
29
|
"morecantile>=5.0,<7.0",
|
|
30
30
|
"pydantic~=2.0",
|
|
31
31
|
"pystac>=0.5.4",
|
|
32
|
-
"rasterio>=1.
|
|
32
|
+
"rasterio>=1.4.0",
|
|
33
33
|
"color-operations",
|
|
34
34
|
"typing-extensions",
|
|
35
|
-
"importlib_resources>=1.1.0; python_version < '3.9'",
|
|
36
35
|
]
|
|
37
36
|
|
|
38
37
|
[project.optional-dependencies]
|
|
@@ -161,7 +160,7 @@ exclude = [
|
|
|
161
160
|
max-complexity = 14
|
|
162
161
|
|
|
163
162
|
[tool.bumpversion]
|
|
164
|
-
current_version = "7.
|
|
163
|
+
current_version = "7.4.0"
|
|
165
164
|
search = "{current_version}"
|
|
166
165
|
replace = "{new_version}"
|
|
167
166
|
regex = false
|
|
@@ -5,6 +5,8 @@ import os
|
|
|
5
5
|
import pathlib
|
|
6
6
|
import re
|
|
7
7
|
import warnings
|
|
8
|
+
from importlib.resources import as_file
|
|
9
|
+
from importlib.resources import files as resources_files
|
|
8
10
|
from typing import Dict, List, Sequence, Tuple, Union
|
|
9
11
|
|
|
10
12
|
import attr
|
|
@@ -24,15 +26,6 @@ from rio_tiler.types import (
|
|
|
24
26
|
IntervalColorMapType,
|
|
25
27
|
)
|
|
26
28
|
|
|
27
|
-
try:
|
|
28
|
-
from importlib.resources import as_file
|
|
29
|
-
from importlib.resources import files as resources_files
|
|
30
|
-
except ImportError:
|
|
31
|
-
# Try backported to PY<39 `importlib_resources`.
|
|
32
|
-
from importlib_resources import as_file # type: ignore
|
|
33
|
-
from importlib_resources import files as resources_files # type: ignore
|
|
34
|
-
|
|
35
|
-
|
|
36
29
|
EMPTY_COLORMAP: GDALColorMapType = {i: (0, 0, 0, 0) for i in range(256)}
|
|
37
30
|
|
|
38
31
|
_RIO_CMAP_DIR = resources_files(__package__) / "cmap_data"
|
|
@@ -21,6 +21,7 @@ import attr
|
|
|
21
21
|
import httpx
|
|
22
22
|
import pystac
|
|
23
23
|
import rasterio
|
|
24
|
+
from affine import Affine
|
|
24
25
|
from cachetools import LRUCache, cached
|
|
25
26
|
from cachetools.keys import hashkey
|
|
26
27
|
from morecantile import TileMatrixSet
|
|
@@ -277,7 +278,7 @@ class STACReader(MultiBaseReader):
|
|
|
277
278
|
]
|
|
278
279
|
):
|
|
279
280
|
self.height, self.width = self.item.ext.proj.shape
|
|
280
|
-
self.transform = self.item.ext.proj.transform
|
|
281
|
+
self.transform = Affine(*self.item.ext.proj.transform)
|
|
281
282
|
self.bounds = array_bounds(self.height, self.width, self.transform)
|
|
282
283
|
self.crs = rasterio.crs.CRS.from_string(self.item.ext.proj.crs_string)
|
|
283
284
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import warnings
|
|
6
|
-
from typing import Any, Dict, List, Optional
|
|
6
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
7
7
|
|
|
8
8
|
import attr
|
|
9
9
|
import numpy
|
|
@@ -28,8 +28,13 @@ from rio_tiler.errors import (
|
|
|
28
28
|
from rio_tiler.io.base import BaseReader
|
|
29
29
|
from rio_tiler.models import BandStatistics, ImageData, Info, PointData
|
|
30
30
|
from rio_tiler.reader import _get_width_height
|
|
31
|
-
from rio_tiler.types import BBox, NoData, RIOResampling, WarpResampling
|
|
32
|
-
from rio_tiler.utils import
|
|
31
|
+
from rio_tiler.types import BBox, Indexes, NoData, RIOResampling, WarpResampling
|
|
32
|
+
from rio_tiler.utils import (
|
|
33
|
+
CRS_to_uri,
|
|
34
|
+
_validate_shape_input,
|
|
35
|
+
cast_to_sequence,
|
|
36
|
+
get_array_statistics,
|
|
37
|
+
)
|
|
33
38
|
|
|
34
39
|
try:
|
|
35
40
|
import xarray
|
|
@@ -105,6 +110,7 @@ class XarrayReader(BaseReader):
|
|
|
105
110
|
for d in self.input.dims
|
|
106
111
|
if d not in [self.input.rio.x_dim, self.input.rio.y_dim]
|
|
107
112
|
]
|
|
113
|
+
assert len(self._dims) in [0, 1], "Can't handle >=4D DataArray"
|
|
108
114
|
|
|
109
115
|
@property
|
|
110
116
|
def minzoom(self):
|
|
@@ -118,29 +124,38 @@ class XarrayReader(BaseReader):
|
|
|
118
124
|
|
|
119
125
|
@property
|
|
120
126
|
def band_names(self) -> List[str]:
|
|
121
|
-
"""
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
"""
|
|
128
|
+
Return list of `band descriptions` in DataArray.
|
|
129
|
+
|
|
130
|
+
`Bands` are all dimensions not defined as spatial dims by rioxarray.
|
|
131
|
+
"""
|
|
132
|
+
if not self._dims:
|
|
133
|
+
coords_name = list(self.input.coords)
|
|
134
|
+
if len(coords_name) > 3 and (coord := coords_name[2]):
|
|
135
|
+
return [str(self.input.coords[coord].data)]
|
|
136
|
+
|
|
137
|
+
return [self.input.name or "array"]
|
|
138
|
+
|
|
139
|
+
return [str(band) for d in self._dims for band in self.input[d].values]
|
|
125
140
|
|
|
126
141
|
def info(self) -> Info:
|
|
127
142
|
"""Return xarray.DataArray info."""
|
|
128
|
-
bands = [str(band) for d in self._dims for band in self.input[d].values] or [
|
|
129
|
-
"value"
|
|
130
|
-
]
|
|
131
143
|
metadata = [band.attrs for d in self._dims for band in self.input[d]] or [{}]
|
|
132
144
|
|
|
133
145
|
meta = {
|
|
134
146
|
"bounds": self.bounds,
|
|
135
147
|
"crs": CRS_to_uri(self.crs) or self.crs.to_wkt(),
|
|
136
148
|
"band_metadata": [(f"b{ix}", v) for ix, v in enumerate(metadata, 1)],
|
|
137
|
-
"band_descriptions": [
|
|
149
|
+
"band_descriptions": [
|
|
150
|
+
(f"b{ix}", v) for ix, v in enumerate(self.band_names, 1)
|
|
151
|
+
],
|
|
138
152
|
"dtype": str(self.input.dtype),
|
|
139
153
|
"nodata_type": "Nodata" if self.input.rio.nodata is not None else "None",
|
|
140
154
|
"name": self.input.name,
|
|
141
155
|
"count": self.input.rio.count,
|
|
142
156
|
"width": self.input.rio.width,
|
|
143
157
|
"height": self.input.rio.height,
|
|
158
|
+
"dimensions": self.input.dims,
|
|
144
159
|
"attrs": {
|
|
145
160
|
k: (v.tolist() if isinstance(v, (numpy.ndarray, numpy.generic)) else v)
|
|
146
161
|
for k, v in self.input.attrs.items()
|
|
@@ -149,6 +164,28 @@ class XarrayReader(BaseReader):
|
|
|
149
164
|
|
|
150
165
|
return Info(**meta)
|
|
151
166
|
|
|
167
|
+
def _sel_indexes(
|
|
168
|
+
self, indexes: Optional[Indexes] = None
|
|
169
|
+
) -> Tuple[xarray.DataArray, List[str]]:
|
|
170
|
+
"""Select `band` indexes in DataArray."""
|
|
171
|
+
da = self.input
|
|
172
|
+
band_names = self.band_names
|
|
173
|
+
if indexes := cast_to_sequence(indexes):
|
|
174
|
+
assert all(v > 0 for v in indexes), "Indexes value must be >= 1"
|
|
175
|
+
if da.ndim == 2:
|
|
176
|
+
if indexes != (1,):
|
|
177
|
+
raise ValueError(
|
|
178
|
+
f"Invalid indexes {indexes} for array of shape {da.shape}"
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return da, band_names
|
|
182
|
+
|
|
183
|
+
indexes = [idx - 1 for idx in indexes]
|
|
184
|
+
da = da[indexes]
|
|
185
|
+
band_names = [self.band_names[idx] for idx in indexes]
|
|
186
|
+
|
|
187
|
+
return da, band_names
|
|
188
|
+
|
|
152
189
|
def statistics(
|
|
153
190
|
self,
|
|
154
191
|
categorical: bool = False,
|
|
@@ -156,17 +193,19 @@ class XarrayReader(BaseReader):
|
|
|
156
193
|
percentiles: Optional[List[int]] = None,
|
|
157
194
|
hist_options: Optional[Dict] = None,
|
|
158
195
|
nodata: Optional[NoData] = None,
|
|
196
|
+
indexes: Optional[Indexes] = None,
|
|
159
197
|
**kwargs: Any,
|
|
160
198
|
) -> Dict[str, BandStatistics]:
|
|
161
199
|
"""Return statistics from a dataset."""
|
|
162
200
|
hist_options = hist_options or {}
|
|
163
201
|
|
|
164
|
-
|
|
202
|
+
da, band_names = self._sel_indexes(indexes)
|
|
203
|
+
|
|
165
204
|
if nodata is not None:
|
|
166
|
-
|
|
205
|
+
da = da.rio.write_nodata(nodata)
|
|
167
206
|
|
|
168
|
-
data =
|
|
169
|
-
data.mask |= data.data ==
|
|
207
|
+
data = da.to_masked_array()
|
|
208
|
+
data.mask |= data.data == da.rio.nodata
|
|
170
209
|
|
|
171
210
|
stats = get_array_statistics(
|
|
172
211
|
data,
|
|
@@ -176,9 +215,7 @@ class XarrayReader(BaseReader):
|
|
|
176
215
|
**hist_options,
|
|
177
216
|
)
|
|
178
217
|
|
|
179
|
-
return {
|
|
180
|
-
self.band_names[ix]: BandStatistics(**val) for ix, val in enumerate(stats)
|
|
181
|
-
}
|
|
218
|
+
return {band_names[ix]: BandStatistics(**val) for ix, val in enumerate(stats)}
|
|
182
219
|
|
|
183
220
|
def tile(
|
|
184
221
|
self,
|
|
@@ -189,6 +226,7 @@ class XarrayReader(BaseReader):
|
|
|
189
226
|
reproject_method: WarpResampling = "nearest",
|
|
190
227
|
auto_expand: bool = True,
|
|
191
228
|
nodata: Optional[NoData] = None,
|
|
229
|
+
indexes: Optional[Indexes] = None,
|
|
192
230
|
**kwargs: Any,
|
|
193
231
|
) -> ImageData:
|
|
194
232
|
"""Read a Web Map tile from a dataset.
|
|
@@ -211,20 +249,21 @@ class XarrayReader(BaseReader):
|
|
|
211
249
|
f"Tile(x={tile_x}, y={tile_y}, z={tile_z}) is outside bounds"
|
|
212
250
|
)
|
|
213
251
|
|
|
214
|
-
|
|
252
|
+
da, band_names = self._sel_indexes(indexes)
|
|
253
|
+
|
|
215
254
|
if nodata is not None:
|
|
216
|
-
|
|
255
|
+
da = da.rio.write_nodata(nodata)
|
|
217
256
|
|
|
218
257
|
tile_bounds = tuple(self.tms.xy_bounds(Tile(x=tile_x, y=tile_y, z=tile_z)))
|
|
219
258
|
dst_crs = self.tms.rasterio_crs
|
|
220
259
|
|
|
221
260
|
# Create source array by clipping the xarray dataset to extent of the tile.
|
|
222
|
-
|
|
261
|
+
da = da.rio.clip_box(
|
|
223
262
|
*tile_bounds,
|
|
224
263
|
crs=dst_crs,
|
|
225
264
|
auto_expand=auto_expand,
|
|
226
265
|
)
|
|
227
|
-
|
|
266
|
+
da = da.rio.reproject(
|
|
228
267
|
dst_crs,
|
|
229
268
|
shape=(tilesize, tilesize),
|
|
230
269
|
transform=from_bounds(*tile_bounds, height=tilesize, width=tilesize),
|
|
@@ -233,16 +272,16 @@ class XarrayReader(BaseReader):
|
|
|
233
272
|
)
|
|
234
273
|
|
|
235
274
|
# Forward valid_min/valid_max to the ImageData object
|
|
236
|
-
minv, maxv =
|
|
275
|
+
minv, maxv = da.attrs.get("valid_min"), da.attrs.get("valid_max")
|
|
237
276
|
stats = None
|
|
238
277
|
if minv is not None and maxv is not None and nodata not in [minv, maxv]:
|
|
239
|
-
stats = ((minv, maxv),) *
|
|
278
|
+
stats = ((minv, maxv),) * da.rio.count
|
|
240
279
|
|
|
241
|
-
arr =
|
|
242
|
-
arr.mask |= arr.data ==
|
|
280
|
+
arr = da.to_masked_array()
|
|
281
|
+
arr.mask |= arr.data == da.rio.nodata
|
|
243
282
|
|
|
244
|
-
output_bounds =
|
|
245
|
-
if output_bounds[1] > output_bounds[3] and
|
|
283
|
+
output_bounds = da.rio._unordered_bounds()
|
|
284
|
+
if output_bounds[1] > output_bounds[3] and da.rio.transform().e > 0:
|
|
246
285
|
yaxis = self.input.dims.index(self.input.rio.y_dim)
|
|
247
286
|
arr = numpy.flip(arr, axis=yaxis)
|
|
248
287
|
|
|
@@ -251,7 +290,7 @@ class XarrayReader(BaseReader):
|
|
|
251
290
|
bounds=tile_bounds,
|
|
252
291
|
crs=dst_crs,
|
|
253
292
|
dataset_statistics=stats,
|
|
254
|
-
band_names=
|
|
293
|
+
band_names=band_names,
|
|
255
294
|
)
|
|
256
295
|
|
|
257
296
|
def part(
|
|
@@ -262,6 +301,7 @@ class XarrayReader(BaseReader):
|
|
|
262
301
|
reproject_method: WarpResampling = "nearest",
|
|
263
302
|
auto_expand: bool = True,
|
|
264
303
|
nodata: Optional[NoData] = None,
|
|
304
|
+
indexes: Optional[Indexes] = None,
|
|
265
305
|
max_size: Optional[int] = None,
|
|
266
306
|
height: Optional[int] = None,
|
|
267
307
|
width: Optional[int] = None,
|
|
@@ -294,11 +334,12 @@ class XarrayReader(BaseReader):
|
|
|
294
334
|
|
|
295
335
|
dst_crs = dst_crs or bounds_crs
|
|
296
336
|
|
|
297
|
-
|
|
337
|
+
da, band_names = self._sel_indexes(indexes)
|
|
338
|
+
|
|
298
339
|
if nodata is not None:
|
|
299
|
-
|
|
340
|
+
da = da.rio.write_nodata(nodata)
|
|
300
341
|
|
|
301
|
-
|
|
342
|
+
da = da.rio.clip_box(
|
|
302
343
|
*bbox,
|
|
303
344
|
crs=bounds_crs,
|
|
304
345
|
auto_expand=auto_expand,
|
|
@@ -308,11 +349,11 @@ class XarrayReader(BaseReader):
|
|
|
308
349
|
dst_transform, w, h = calculate_default_transform(
|
|
309
350
|
self.crs,
|
|
310
351
|
dst_crs,
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
*
|
|
352
|
+
da.rio.width,
|
|
353
|
+
da.rio.height,
|
|
354
|
+
*da.rio.bounds(),
|
|
314
355
|
)
|
|
315
|
-
|
|
356
|
+
da = da.rio.reproject(
|
|
316
357
|
dst_crs,
|
|
317
358
|
shape=(h, w),
|
|
318
359
|
transform=dst_transform,
|
|
@@ -321,25 +362,25 @@ class XarrayReader(BaseReader):
|
|
|
321
362
|
)
|
|
322
363
|
|
|
323
364
|
# Forward valid_min/valid_max to the ImageData object
|
|
324
|
-
minv, maxv =
|
|
365
|
+
minv, maxv = da.attrs.get("valid_min"), da.attrs.get("valid_max")
|
|
325
366
|
stats = None
|
|
326
367
|
if minv is not None and maxv is not None:
|
|
327
|
-
stats = ((minv, maxv),) *
|
|
368
|
+
stats = ((minv, maxv),) * da.rio.count
|
|
328
369
|
|
|
329
|
-
arr =
|
|
330
|
-
arr.mask |= arr.data ==
|
|
370
|
+
arr = da.to_masked_array()
|
|
371
|
+
arr.mask |= arr.data == da.rio.nodata
|
|
331
372
|
|
|
332
|
-
output_bounds =
|
|
333
|
-
if output_bounds[1] > output_bounds[3] and
|
|
373
|
+
output_bounds = da.rio._unordered_bounds()
|
|
374
|
+
if output_bounds[1] > output_bounds[3] and da.rio.transform().e > 0:
|
|
334
375
|
yaxis = self.input.dims.index(self.input.rio.y_dim)
|
|
335
376
|
arr = numpy.flip(arr, axis=yaxis)
|
|
336
377
|
|
|
337
378
|
img = ImageData(
|
|
338
379
|
arr,
|
|
339
|
-
bounds=
|
|
340
|
-
crs=
|
|
380
|
+
bounds=da.rio.bounds(),
|
|
381
|
+
crs=da.rio.crs,
|
|
341
382
|
dataset_statistics=stats,
|
|
342
|
-
band_names=
|
|
383
|
+
band_names=band_names,
|
|
343
384
|
)
|
|
344
385
|
|
|
345
386
|
output_height = height or img.height
|
|
@@ -362,6 +403,7 @@ class XarrayReader(BaseReader):
|
|
|
362
403
|
height: Optional[int] = None,
|
|
363
404
|
width: Optional[int] = None,
|
|
364
405
|
nodata: Optional[NoData] = None,
|
|
406
|
+
indexes: Optional[Indexes] = None,
|
|
365
407
|
dst_crs: Optional[CRS] = None,
|
|
366
408
|
reproject_method: WarpResampling = "nearest",
|
|
367
409
|
resampling_method: RIOResampling = "nearest",
|
|
@@ -388,19 +430,20 @@ class XarrayReader(BaseReader):
|
|
|
388
430
|
UserWarning,
|
|
389
431
|
)
|
|
390
432
|
|
|
391
|
-
|
|
433
|
+
da, band_names = self._sel_indexes(indexes)
|
|
434
|
+
|
|
392
435
|
if nodata is not None:
|
|
393
|
-
|
|
436
|
+
da = da.rio.write_nodata(nodata)
|
|
394
437
|
|
|
395
438
|
if dst_crs and dst_crs != self.crs:
|
|
396
439
|
dst_transform, w, h = calculate_default_transform(
|
|
397
440
|
self.crs,
|
|
398
441
|
dst_crs,
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
*
|
|
442
|
+
da.rio.width,
|
|
443
|
+
da.rio.height,
|
|
444
|
+
*da.rio.bounds(),
|
|
402
445
|
)
|
|
403
|
-
|
|
446
|
+
da = da.rio.reproject(
|
|
404
447
|
dst_crs,
|
|
405
448
|
shape=(h, w),
|
|
406
449
|
transform=dst_transform,
|
|
@@ -409,25 +452,25 @@ class XarrayReader(BaseReader):
|
|
|
409
452
|
)
|
|
410
453
|
|
|
411
454
|
# Forward valid_min/valid_max to the ImageData object
|
|
412
|
-
minv, maxv =
|
|
455
|
+
minv, maxv = da.attrs.get("valid_min"), da.attrs.get("valid_max")
|
|
413
456
|
stats = None
|
|
414
457
|
if minv is not None and maxv is not None:
|
|
415
|
-
stats = ((minv, maxv),) *
|
|
458
|
+
stats = ((minv, maxv),) * da.rio.count
|
|
416
459
|
|
|
417
|
-
arr =
|
|
418
|
-
arr.mask |= arr.data ==
|
|
460
|
+
arr = da.to_masked_array()
|
|
461
|
+
arr.mask |= arr.data == da.rio.nodata
|
|
419
462
|
|
|
420
|
-
output_bounds =
|
|
421
|
-
if output_bounds[1] > output_bounds[3] and
|
|
463
|
+
output_bounds = da.rio._unordered_bounds()
|
|
464
|
+
if output_bounds[1] > output_bounds[3] and da.rio.transform().e > 0:
|
|
422
465
|
yaxis = self.input.dims.index(self.input.rio.y_dim)
|
|
423
466
|
arr = numpy.flip(arr, axis=yaxis)
|
|
424
467
|
|
|
425
468
|
img = ImageData(
|
|
426
469
|
arr,
|
|
427
|
-
bounds=
|
|
428
|
-
crs=
|
|
470
|
+
bounds=da.rio.bounds(),
|
|
471
|
+
crs=da.rio.crs,
|
|
429
472
|
dataset_statistics=stats,
|
|
430
|
-
band_names=
|
|
473
|
+
band_names=band_names,
|
|
431
474
|
)
|
|
432
475
|
|
|
433
476
|
output_height = height or img.height
|
|
@@ -450,6 +493,7 @@ class XarrayReader(BaseReader):
|
|
|
450
493
|
lat: float,
|
|
451
494
|
coord_crs: CRS = WGS84_CRS,
|
|
452
495
|
nodata: Optional[NoData] = None,
|
|
496
|
+
indexes: Optional[Indexes] = None,
|
|
453
497
|
**kwargs: Any,
|
|
454
498
|
) -> PointData:
|
|
455
499
|
"""Read a pixel value from a dataset.
|
|
@@ -464,32 +508,33 @@ class XarrayReader(BaseReader):
|
|
|
464
508
|
PointData
|
|
465
509
|
|
|
466
510
|
"""
|
|
467
|
-
|
|
511
|
+
da_lon, da_lat = transform_coords(coord_crs, self.crs, [lon], [lat])
|
|
468
512
|
|
|
469
513
|
if not (
|
|
470
|
-
(self.bounds[0] <
|
|
471
|
-
and (self.bounds[1] <
|
|
514
|
+
(self.bounds[0] < da_lon[0] < self.bounds[2])
|
|
515
|
+
and (self.bounds[1] < da_lat[0] < self.bounds[3])
|
|
472
516
|
):
|
|
473
517
|
raise PointOutsideBounds("Point is outside dataset bounds")
|
|
474
518
|
|
|
475
|
-
|
|
519
|
+
da, band_names = self._sel_indexes(indexes)
|
|
520
|
+
|
|
476
521
|
if nodata is not None:
|
|
477
|
-
|
|
522
|
+
da = da.rio.write_nodata(nodata)
|
|
478
523
|
|
|
479
|
-
y, x = rowcol(
|
|
524
|
+
y, x = rowcol(da.rio.transform(), da_lon, da_lat)
|
|
480
525
|
|
|
481
|
-
if
|
|
482
|
-
arr = numpy.expand_dims(
|
|
526
|
+
if da.ndim == 2:
|
|
527
|
+
arr = numpy.expand_dims(da[int(y[0]), int(x[0])].to_masked_array(), axis=0)
|
|
483
528
|
else:
|
|
484
|
-
arr =
|
|
529
|
+
arr = da[:, int(y[0]), int(x[0])].to_masked_array()
|
|
485
530
|
|
|
486
|
-
arr.mask |= arr.data ==
|
|
531
|
+
arr.mask |= arr.data == da.rio.nodata
|
|
487
532
|
|
|
488
533
|
return PointData(
|
|
489
534
|
arr,
|
|
490
535
|
coordinates=(lon, lat),
|
|
491
536
|
crs=coord_crs,
|
|
492
|
-
band_names=
|
|
537
|
+
band_names=band_names,
|
|
493
538
|
)
|
|
494
539
|
|
|
495
540
|
def feature(
|
|
@@ -500,6 +545,7 @@ class XarrayReader(BaseReader):
|
|
|
500
545
|
reproject_method: WarpResampling = "nearest",
|
|
501
546
|
auto_expand: bool = True,
|
|
502
547
|
nodata: Optional[NoData] = None,
|
|
548
|
+
indexes: Optional[Indexes] = None,
|
|
503
549
|
max_size: Optional[int] = None,
|
|
504
550
|
height: Optional[int] = None,
|
|
505
551
|
width: Optional[int] = None,
|
|
@@ -537,6 +583,7 @@ class XarrayReader(BaseReader):
|
|
|
537
583
|
dst_crs=dst_crs,
|
|
538
584
|
bounds_crs=shape_crs,
|
|
539
585
|
nodata=nodata,
|
|
586
|
+
indexes=indexes,
|
|
540
587
|
max_size=max_size,
|
|
541
588
|
width=width,
|
|
542
589
|
height=height,
|
|
@@ -14,13 +14,13 @@ from rasterio import windows
|
|
|
14
14
|
from rasterio.coords import BoundingBox
|
|
15
15
|
from rasterio.crs import CRS
|
|
16
16
|
from rasterio.dtypes import dtype_ranges
|
|
17
|
-
from rasterio.enums import ColorInterp
|
|
17
|
+
from rasterio.enums import ColorInterp, Resampling
|
|
18
18
|
from rasterio.errors import NotGeoreferencedWarning
|
|
19
19
|
from rasterio.features import rasterize
|
|
20
20
|
from rasterio.io import MemoryFile
|
|
21
21
|
from rasterio.plot import reshape_as_image
|
|
22
|
-
from rasterio.transform import from_bounds
|
|
23
|
-
from rasterio.warp import transform_geom
|
|
22
|
+
from rasterio.transform import array_bounds, from_bounds
|
|
23
|
+
from rasterio.warp import calculate_default_transform, reproject, transform_geom
|
|
24
24
|
from typing_extensions import Self
|
|
25
25
|
|
|
26
26
|
from rio_tiler.colormap import apply_cmap
|
|
@@ -34,6 +34,7 @@ from rio_tiler.types import (
|
|
|
34
34
|
IntervalTuple,
|
|
35
35
|
NumType,
|
|
36
36
|
RIOResampling,
|
|
37
|
+
WarpResampling,
|
|
37
38
|
)
|
|
38
39
|
from rio_tiler.utils import (
|
|
39
40
|
_validate_shape_input,
|
|
@@ -786,3 +787,44 @@ class ImageData:
|
|
|
786
787
|
).astype("float32")
|
|
787
788
|
|
|
788
789
|
return cover_array.sum(-1).sum(1) / (cover_scale**2)
|
|
790
|
+
|
|
791
|
+
def reproject(
|
|
792
|
+
self,
|
|
793
|
+
dst_crs: CRS,
|
|
794
|
+
resolution: Optional[Tuple[float, float]] = None,
|
|
795
|
+
reproject_method: WarpResampling = "nearest",
|
|
796
|
+
) -> "ImageData":
|
|
797
|
+
"""Reproject data and mask."""
|
|
798
|
+
dst_transform, w, h = calculate_default_transform(
|
|
799
|
+
self.crs,
|
|
800
|
+
dst_crs,
|
|
801
|
+
self.width,
|
|
802
|
+
self.height,
|
|
803
|
+
*self.bounds,
|
|
804
|
+
resolution=resolution,
|
|
805
|
+
)
|
|
806
|
+
|
|
807
|
+
destination = numpy.ma.masked_array(
|
|
808
|
+
numpy.zeros((self.count, h, w), dtype=self.array.dtype),
|
|
809
|
+
)
|
|
810
|
+
destination, _ = reproject(
|
|
811
|
+
self.array,
|
|
812
|
+
destination,
|
|
813
|
+
src_transform=self.transform,
|
|
814
|
+
src_crs=self.crs,
|
|
815
|
+
dst_transform=dst_transform,
|
|
816
|
+
dst_crs=dst_crs,
|
|
817
|
+
resampling=Resampling[reproject_method],
|
|
818
|
+
)
|
|
819
|
+
|
|
820
|
+
bounds = array_bounds(h, w, dst_transform)
|
|
821
|
+
|
|
822
|
+
return ImageData(
|
|
823
|
+
destination,
|
|
824
|
+
assets=self.assets,
|
|
825
|
+
crs=dst_crs,
|
|
826
|
+
bounds=bounds,
|
|
827
|
+
band_names=self.band_names,
|
|
828
|
+
metadata=self.metadata,
|
|
829
|
+
dataset_statistics=self.dataset_statistics,
|
|
830
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|