我想光栅化高分辨率 GeoTIFF 的较小阴影。xarray.open_rasterio
似乎是获得所需内容的正确工具datashader.transfer_functions.shade
。但是,返回的 DataArray 也有一个带,它会跳闸shade
。出现几个问题:
- 应该
xarray.open_rasterio
将当前在“带”中的值简单地作为数组中的值返回吗? - 如何检查 GeoTIFF 是否符合
xarray.open_rasterio
预期? - 是否有任何论点
xarray.open_rasterio
允许将“带”指定为“值”? - 或者应该
xarray.open_rasterio
简单地重新排序或重新标记坐标,使“band”是第三个(在“x”和“y”之后)? - 或者,如果
xarray.open_rasterio
正确解析此 GeoTIFF,是否可以shade
以一种不会将此 2D 数组与 3D 数组混淆的方式调用?
MRE:使用 Facebook 高分辨率人口地图中的 GeoTIFF,例如,从这里。下面的代码可以把它放在一个 800x800 的地图上。相反,在我终于明白为什么抱怨它在尝试为 800 个类别着色时它的参数shade
中只有(默认)22 种颜色之后,我明白坐标被理解为值。我在下面显示数组。color_key
y
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