如何解决 xarray.open_rasterio 解析问题?
How to troubleshoot xarray.open_rasterio parsing?
我想栅格化高分辨率 GeoTIFF 的较小阴影。 xarray.open_rasterio
似乎是获得 datashader.transfer_functions.shade
所需的正确工具。但是,returned DataArray 也有一个波段,它向上跳闸 shade
。出现几个问题:
- 应该
xarray.open_rasterio
return当前的值"band"
简单地作为数组中的值?
- 如何检查
GeoTIFF 看起来像
xarray.open_rasterio
期望的那样?
- 有没有
xarray.open_rasterio
的参数允许 "band" 的规范
作为 "value"?
- 或者
xarray.open_rasterio
应该简单地重新排序或重新标记坐标,使 "band" 成为第三个坐标(在 "x" 和 "y" 之后)?
- 或者如果
xarray.open_rasterio
解析了这个 GeoTIFF
正确地,可以用一种不会混淆它的方式调用 shade
2D 数组与 3D 数组?
MRE:使用来自 Facebook 高分辨率人口地图的 GeoTIFF,例如来自 here。下面的代码可以将其放在 800x800 地图上。相反,在我终于理解为什么 shade
抱怨它试图为 800 个类别着色时它的 color_key
参数中只有(默认)22 种颜色之后,我理解了 y
坐标by shade
为值。我在下面显示数组。
import rasterio
from rasterio.mask import mask
import os
import datashader as ds
from datashader import transfer_functions as tf
import xarray as xr
from matplotlib.cm import viridis
data_path = 'SOME_PATH/'
file_name = 'HUN_women_of_reproductive_age_15_49.tif' # reproductive women, e.g.
file_path = os.path.join(data_path, file_name)
da = xr.open_rasterio(file_path)
cvs = ds.Canvas(plot_width=800, plot_height=800)
img = tf.shade(cvs.raster(da), cmap=viridis)
这会失败,因为 da
数组如下所示:
<xarray.DataArray (band: 1, y: 10240, x: 24320)> array([[[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan],
...,
[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan]]]) Coordinates: * band (band) int64 1 * y (y) float64 48.59 48.59 48.59 48.59 ... 45.75
45.75 45.75 45.75 * x (x) float64 16.13 16.14 16.14 16.14 ... 22.89 22.89 22.89 22.89 Attributes:
transform: (0.000277777777778, 0.0, 16.13486111111111, 0.0, -0.00027...
crs: +init=epsg:4326
res: (0.000277777777778, 0.000277777777778)
is_tiled: 1
nodatavals: (nan,)
scales: (1.0,)
offsets: (0.0,)
descriptions: ('Population Count',)
AREA_OR_POINT: Area
cvs.raster() 接受一个 layer
参数来指定您想要光栅化提供的哪个波段;也许这会有所帮助?
img = tf.shade(cvs.raster(da,layer=1), cmap=viridis)
无论如何,请注意 datashader.transfer_functions.shade 不会光栅化其输入;这是通过调用 Canvas(这里特别是 cvs.raster)来完成的。 shade 只是将已经光栅化的数组转换为彩色像素。
我想栅格化高分辨率 GeoTIFF 的较小阴影。 xarray.open_rasterio
似乎是获得 datashader.transfer_functions.shade
所需的正确工具。但是,returned DataArray 也有一个波段,它向上跳闸 shade
。出现几个问题:
- 应该
xarray.open_rasterio
return当前的值"band" 简单地作为数组中的值? - 如何检查
GeoTIFF 看起来像
xarray.open_rasterio
期望的那样? - 有没有
xarray.open_rasterio
的参数允许 "band" 的规范 作为 "value"? - 或者
xarray.open_rasterio
应该简单地重新排序或重新标记坐标,使 "band" 成为第三个坐标(在 "x" 和 "y" 之后)? - 或者如果
xarray.open_rasterio
解析了这个 GeoTIFF 正确地,可以用一种不会混淆它的方式调用shade
2D 数组与 3D 数组?
MRE:使用来自 Facebook 高分辨率人口地图的 GeoTIFF,例如来自 here。下面的代码可以将其放在 800x800 地图上。相反,在我终于理解为什么 shade
抱怨它试图为 800 个类别着色时它的 color_key
参数中只有(默认)22 种颜色之后,我理解了 y
坐标by shade
为值。我在下面显示数组。
import rasterio
from rasterio.mask import mask
import os
import datashader as ds
from datashader import transfer_functions as tf
import xarray as xr
from matplotlib.cm import viridis
data_path = 'SOME_PATH/'
file_name = 'HUN_women_of_reproductive_age_15_49.tif' # reproductive women, e.g.
file_path = os.path.join(data_path, file_name)
da = xr.open_rasterio(file_path)
cvs = ds.Canvas(plot_width=800, plot_height=800)
img = tf.shade(cvs.raster(da), cmap=viridis)
这会失败,因为 da
数组如下所示:
<xarray.DataArray (band: 1, y: 10240, x: 24320)> array([[[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan],
...,
[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan]]]) Coordinates: * band (band) int64 1 * y (y) float64 48.59 48.59 48.59 48.59 ... 45.75
45.75 45.75 45.75 * x (x) float64 16.13 16.14 16.14 16.14 ... 22.89 22.89 22.89 22.89 Attributes:
transform: (0.000277777777778, 0.0, 16.13486111111111, 0.0, -0.00027...
crs: +init=epsg:4326
res: (0.000277777777778, 0.000277777777778)
is_tiled: 1
nodatavals: (nan,)
scales: (1.0,)
offsets: (0.0,)
descriptions: ('Population Count',)
AREA_OR_POINT: Area
cvs.raster() 接受一个 layer
参数来指定您想要光栅化提供的哪个波段;也许这会有所帮助?
img = tf.shade(cvs.raster(da,layer=1), cmap=viridis)
无论如何,请注意 datashader.transfer_functions.shade 不会光栅化其输入;这是通过调用 Canvas(这里特别是 cvs.raster)来完成的。 shade 只是将已经光栅化的数组转换为彩色像素。