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.
Files changed (241) hide show
  1. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/PKG-INFO +2 -3
  2. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/pyproject.toml +2 -3
  3. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/__init__.py +1 -1
  4. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/colormap.py +2 -9
  5. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/stac.py +2 -1
  6. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/xarray.py +118 -71
  7. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/models.py +45 -3
  8. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/.gitignore +0 -0
  9. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/AUTHORS.txt +0 -0
  10. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/LICENSE +0 -0
  11. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/README.md +0 -0
  12. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/__init__.py +0 -0
  13. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/accent.npy +0 -0
  14. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/accent_r.npy +0 -0
  15. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/afmhot.npy +0 -0
  16. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/afmhot_r.npy +0 -0
  17. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/algae.npy +0 -0
  18. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/algae_r.npy +0 -0
  19. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/amp.npy +0 -0
  20. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/amp_r.npy +0 -0
  21. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/autumn.npy +0 -0
  22. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/autumn_r.npy +0 -0
  23. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/balance.npy +0 -0
  24. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/balance_r.npy +0 -0
  25. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/binary.npy +0 -0
  26. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/binary_r.npy +0 -0
  27. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/blues.npy +0 -0
  28. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/blues_r.npy +0 -0
  29. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bone.npy +0 -0
  30. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bone_r.npy +0 -0
  31. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brbg.npy +0 -0
  32. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brbg_r.npy +0 -0
  33. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brg.npy +0 -0
  34. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/brg_r.npy +0 -0
  35. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bugn.npy +0 -0
  36. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bugn_r.npy +0 -0
  37. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bupu.npy +0 -0
  38. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bupu_r.npy +0 -0
  39. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bwr.npy +0 -0
  40. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/bwr_r.npy +0 -0
  41. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cfastie.npy +0 -0
  42. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cividis.npy +0 -0
  43. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cividis_r.npy +0 -0
  44. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cmrmap.npy +0 -0
  45. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cmrmap_r.npy +0 -0
  46. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cool.npy +0 -0
  47. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cool_r.npy +0 -0
  48. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/coolwarm.npy +0 -0
  49. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/coolwarm_r.npy +0 -0
  50. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/copper.npy +0 -0
  51. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/copper_r.npy +0 -0
  52. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cubehelix.npy +0 -0
  53. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/cubehelix_r.npy +0 -0
  54. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/curl.npy +0 -0
  55. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/curl_r.npy +0 -0
  56. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dark2.npy +0 -0
  57. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dark2_r.npy +0 -0
  58. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/deep.npy +0 -0
  59. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/deep_r.npy +0 -0
  60. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/delta.npy +0 -0
  61. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/delta_r.npy +0 -0
  62. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dense.npy +0 -0
  63. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/dense_r.npy +0 -0
  64. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/diff.npy +0 -0
  65. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/diff_r.npy +0 -0
  66. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/flag.npy +0 -0
  67. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/flag_r.npy +0 -0
  68. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_earth.npy +0 -0
  69. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_earth_r.npy +0 -0
  70. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_gray.npy +0 -0
  71. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_gray_r.npy +0 -0
  72. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_heat.npy +0 -0
  73. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_heat_r.npy +0 -0
  74. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_ncar.npy +0 -0
  75. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_ncar_r.npy +0 -0
  76. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_rainbow.npy +0 -0
  77. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_rainbow_r.npy +0 -0
  78. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_stern.npy +0 -0
  79. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_stern_r.npy +0 -0
  80. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_yarg.npy +0 -0
  81. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gist_yarg_r.npy +0 -0
  82. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnbu.npy +0 -0
  83. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnbu_r.npy +0 -0
  84. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot.npy +0 -0
  85. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot2.npy +0 -0
  86. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot2_r.npy +0 -0
  87. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gnuplot_r.npy +0 -0
  88. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gray.npy +0 -0
  89. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/gray_r.npy +0 -0
  90. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greens.npy +0 -0
  91. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greens_r.npy +0 -0
  92. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greys.npy +0 -0
  93. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/greys_r.npy +0 -0
  94. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/haline.npy +0 -0
  95. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/haline_r.npy +0 -0
  96. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hot.npy +0 -0
  97. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hot_r.npy +0 -0
  98. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hsv.npy +0 -0
  99. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/hsv_r.npy +0 -0
  100. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ice.npy +0 -0
  101. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ice_r.npy +0 -0
  102. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/inferno.npy +0 -0
  103. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/inferno_r.npy +0 -0
  104. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/jet.npy +0 -0
  105. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/jet_r.npy +0 -0
  106. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/magma.npy +0 -0
  107. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/magma_r.npy +0 -0
  108. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/matter.npy +0 -0
  109. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/matter_r.npy +0 -0
  110. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/nipy_spectral.npy +0 -0
  111. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/nipy_spectral_r.npy +0 -0
  112. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ocean.npy +0 -0
  113. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ocean_r.npy +0 -0
  114. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oranges.npy +0 -0
  115. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oranges_r.npy +0 -0
  116. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/orrd.npy +0 -0
  117. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/orrd_r.npy +0 -0
  118. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oxy.npy +0 -0
  119. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/oxy_r.npy +0 -0
  120. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/paired.npy +0 -0
  121. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/paired_r.npy +0 -0
  122. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel1.npy +0 -0
  123. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel1_r.npy +0 -0
  124. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel2.npy +0 -0
  125. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pastel2_r.npy +0 -0
  126. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/phase.npy +0 -0
  127. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/phase_r.npy +0 -0
  128. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pink.npy +0 -0
  129. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pink_r.npy +0 -0
  130. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/piyg.npy +0 -0
  131. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/piyg_r.npy +0 -0
  132. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/plasma.npy +0 -0
  133. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/plasma_r.npy +0 -0
  134. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prgn.npy +0 -0
  135. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prgn_r.npy +0 -0
  136. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prism.npy +0 -0
  137. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/prism_r.npy +0 -0
  138. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubu.npy +0 -0
  139. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubu_r.npy +0 -0
  140. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubugn.npy +0 -0
  141. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/pubugn_r.npy +0 -0
  142. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/puor.npy +0 -0
  143. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/puor_r.npy +0 -0
  144. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purd.npy +0 -0
  145. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purd_r.npy +0 -0
  146. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purples.npy +0 -0
  147. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/purples_r.npy +0 -0
  148. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rain.npy +0 -0
  149. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rain_r.npy +0 -0
  150. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rainbow.npy +0 -0
  151. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rainbow_r.npy +0 -0
  152. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdbu.npy +0 -0
  153. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdbu_r.npy +0 -0
  154. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdgy.npy +0 -0
  155. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdgy_r.npy +0 -0
  156. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdpu.npy +0 -0
  157. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdpu_r.npy +0 -0
  158. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylbu.npy +0 -0
  159. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylbu_r.npy +0 -0
  160. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylgn.npy +0 -0
  161. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rdylgn_r.npy +0 -0
  162. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/reds.npy +0 -0
  163. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/reds_r.npy +0 -0
  164. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/rplumbo.npy +0 -0
  165. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/schwarzwald.npy +0 -0
  166. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/seismic.npy +0 -0
  167. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/seismic_r.npy +0 -0
  168. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set1.npy +0 -0
  169. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set1_r.npy +0 -0
  170. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set2.npy +0 -0
  171. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set2_r.npy +0 -0
  172. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set3.npy +0 -0
  173. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/set3_r.npy +0 -0
  174. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/solar.npy +0 -0
  175. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/solar_r.npy +0 -0
  176. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spectral.npy +0 -0
  177. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spectral_r.npy +0 -0
  178. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/speed.npy +0 -0
  179. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/speed_r.npy +0 -0
  180. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spring.npy +0 -0
  181. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/spring_r.npy +0 -0
  182. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/summer.npy +0 -0
  183. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/summer_r.npy +0 -0
  184. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab10.npy +0 -0
  185. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab10_r.npy +0 -0
  186. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20.npy +0 -0
  187. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20_r.npy +0 -0
  188. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20b.npy +0 -0
  189. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20b_r.npy +0 -0
  190. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20c.npy +0 -0
  191. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tab20c_r.npy +0 -0
  192. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tarn.npy +0 -0
  193. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tarn_r.npy +0 -0
  194. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tempo.npy +0 -0
  195. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/tempo_r.npy +0 -0
  196. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/terrain.npy +0 -0
  197. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/terrain_r.npy +0 -0
  198. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/thermal.npy +0 -0
  199. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/thermal_r.npy +0 -0
  200. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/topo.npy +0 -0
  201. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/topo_r.npy +0 -0
  202. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbid.npy +0 -0
  203. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbid_r.npy +0 -0
  204. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbo.npy +0 -0
  205. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/turbo_r.npy +0 -0
  206. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight.npy +0 -0
  207. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_r.npy +0 -0
  208. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_shifted.npy +0 -0
  209. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/twilight_shifted_r.npy +0 -0
  210. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/viridis.npy +0 -0
  211. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/viridis_r.npy +0 -0
  212. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/winter.npy +0 -0
  213. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/winter_r.npy +0 -0
  214. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/wistia.npy +0 -0
  215. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/wistia_r.npy +0 -0
  216. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgn.npy +0 -0
  217. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgn_r.npy +0 -0
  218. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgnbu.npy +0 -0
  219. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylgnbu_r.npy +0 -0
  220. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorbr.npy +0 -0
  221. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorbr_r.npy +0 -0
  222. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorrd.npy +0 -0
  223. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/cmap_data/ylorrd_r.npy +0 -0
  224. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/constants.py +0 -0
  225. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/errors.py +0 -0
  226. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/expression.py +0 -0
  227. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/__init__.py +0 -0
  228. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/base.py +0 -0
  229. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/io/rasterio.py +0 -0
  230. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/logger.py +0 -0
  231. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/__init__.py +0 -0
  232. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/__init__.py +0 -0
  233. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/base.py +0 -0
  234. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/methods/defaults.py +0 -0
  235. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/mosaic/reader.py +0 -0
  236. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/profiles.py +0 -0
  237. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/py.typed +0 -0
  238. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/reader.py +0 -0
  239. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/tasks.py +0 -0
  240. {rio_tiler-7.3.0 → rio_tiler-7.4.0}/rio_tiler/types.py +0 -0
  241. {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.0
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.3.0
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.3.0",
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.3.0"
163
+ current_version = "7.4.0"
165
164
  search = "{current_version}"
166
165
  replace = "{new_version}"
167
166
  regex = false
@@ -1,6 +1,6 @@
1
1
  """rio-tiler."""
2
2
 
3
- __version__ = "7.3.0"
3
+ __version__ = "7.4.0"
4
4
 
5
5
  from . import ( # noqa
6
6
  colormap,
@@ -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 CRS_to_uri, _validate_shape_input, get_array_statistics
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
- """Return list of `band names` in DataArray."""
122
- return [str(band) for d in self._dims for band in self.input[d].values] or [
123
- "value"
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": [(f"b{ix}", v) for ix, v in enumerate(bands, 1)],
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
- ds = self.input
202
+ da, band_names = self._sel_indexes(indexes)
203
+
165
204
  if nodata is not None:
166
- ds = ds.rio.write_nodata(nodata)
205
+ da = da.rio.write_nodata(nodata)
167
206
 
168
- data = ds.to_masked_array()
169
- data.mask |= data.data == ds.rio.nodata
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
- ds = self.input
252
+ da, band_names = self._sel_indexes(indexes)
253
+
215
254
  if nodata is not None:
216
- ds = ds.rio.write_nodata(nodata)
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
- ds = ds.rio.clip_box(
261
+ da = da.rio.clip_box(
223
262
  *tile_bounds,
224
263
  crs=dst_crs,
225
264
  auto_expand=auto_expand,
226
265
  )
227
- ds = ds.rio.reproject(
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 = ds.attrs.get("valid_min"), ds.attrs.get("valid_max")
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),) * ds.rio.count
278
+ stats = ((minv, maxv),) * da.rio.count
240
279
 
241
- arr = ds.to_masked_array()
242
- arr.mask |= arr.data == ds.rio.nodata
280
+ arr = da.to_masked_array()
281
+ arr.mask |= arr.data == da.rio.nodata
243
282
 
244
- output_bounds = ds.rio._unordered_bounds()
245
- if output_bounds[1] > output_bounds[3] and ds.rio.transform().e > 0:
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=self.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
- ds = self.input
337
+ da, band_names = self._sel_indexes(indexes)
338
+
298
339
  if nodata is not None:
299
- ds = ds.rio.write_nodata(nodata)
340
+ da = da.rio.write_nodata(nodata)
300
341
 
301
- ds = ds.rio.clip_box(
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
- ds.rio.width,
312
- ds.rio.height,
313
- *ds.rio.bounds(),
352
+ da.rio.width,
353
+ da.rio.height,
354
+ *da.rio.bounds(),
314
355
  )
315
- ds = ds.rio.reproject(
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 = ds.attrs.get("valid_min"), ds.attrs.get("valid_max")
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),) * ds.rio.count
368
+ stats = ((minv, maxv),) * da.rio.count
328
369
 
329
- arr = ds.to_masked_array()
330
- arr.mask |= arr.data == ds.rio.nodata
370
+ arr = da.to_masked_array()
371
+ arr.mask |= arr.data == da.rio.nodata
331
372
 
332
- output_bounds = ds.rio._unordered_bounds()
333
- if output_bounds[1] > output_bounds[3] and ds.rio.transform().e > 0:
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=ds.rio.bounds(),
340
- crs=ds.rio.crs,
380
+ bounds=da.rio.bounds(),
381
+ crs=da.rio.crs,
341
382
  dataset_statistics=stats,
342
- band_names=self.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
- ds = self.input
433
+ da, band_names = self._sel_indexes(indexes)
434
+
392
435
  if nodata is not None:
393
- ds = ds.rio.write_nodata(nodata)
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
- ds.rio.width,
400
- ds.rio.height,
401
- *ds.rio.bounds(),
442
+ da.rio.width,
443
+ da.rio.height,
444
+ *da.rio.bounds(),
402
445
  )
403
- ds = ds.rio.reproject(
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 = ds.attrs.get("valid_min"), ds.attrs.get("valid_max")
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),) * ds.rio.count
458
+ stats = ((minv, maxv),) * da.rio.count
416
459
 
417
- arr = ds.to_masked_array()
418
- arr.mask |= arr.data == ds.rio.nodata
460
+ arr = da.to_masked_array()
461
+ arr.mask |= arr.data == da.rio.nodata
419
462
 
420
- output_bounds = ds.rio._unordered_bounds()
421
- if output_bounds[1] > output_bounds[3] and ds.rio.transform().e > 0:
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=ds.rio.bounds(),
428
- crs=ds.rio.crs,
470
+ bounds=da.rio.bounds(),
471
+ crs=da.rio.crs,
429
472
  dataset_statistics=stats,
430
- band_names=self.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
- ds_lon, ds_lat = transform_coords(coord_crs, self.crs, [lon], [lat])
511
+ da_lon, da_lat = transform_coords(coord_crs, self.crs, [lon], [lat])
468
512
 
469
513
  if not (
470
- (self.bounds[0] < ds_lon[0] < self.bounds[2])
471
- and (self.bounds[1] < ds_lat[0] < self.bounds[3])
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
- ds = self.input
519
+ da, band_names = self._sel_indexes(indexes)
520
+
476
521
  if nodata is not None:
477
- ds = ds.rio.write_nodata(nodata)
522
+ da = da.rio.write_nodata(nodata)
478
523
 
479
- y, x = rowcol(ds.rio.transform(), ds_lon, ds_lat)
524
+ y, x = rowcol(da.rio.transform(), da_lon, da_lat)
480
525
 
481
- if ds.ndim == 2:
482
- arr = numpy.expand_dims(ds[int(y[0]), int(x[0])].to_masked_array(), axis=0)
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 = ds[:, int(y[0]), int(x[0])].to_masked_array()
529
+ arr = da[:, int(y[0]), int(x[0])].to_masked_array()
485
530
 
486
- arr.mask |= arr.data == ds.rio.nodata
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=self.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