如何排除xarray.open_rasterio解析故障?

2024-04-27 10:49:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想光栅化高分辨率geotiff的小阴影xarray.open_rasterio似乎是获得datashader.transfer_functions.shade所需的正确工具。但是,返回的DataArray也有一个频带,它向上跳shade。出现了几个问题:

  1. 是否应xarray.open_rasterio返回当前在“band”中的值 只是作为数组中的值
  2. 怎样才能检查 GeoTIFF看起来像xarray.open_rasterio所期望的那样
  3. 有吗 xarray.open_rasterio的参数允许指定“band” 作为“价值”
  4. 或者xarray.open_rasterio是否应该简单地重新排序或重新标记坐标,使“band”成为第三个坐标(在“x”和“y”之后)
  5. 或者如果xarray.open_rasterio解析了这个GeoTIFF 正确地说,一个调用shade的方法是否不会混淆这一点 二维阵列与三维阵列

MRE:使用来自Facebook高分辨率人口地图的GeoTIFF,例如来自here。下面的代码可以将其放在800x800地图上。相反,在我最终理解了为什么shade在试图给800个类别着色时,它的color_key参数中只有(默认)22种颜色后,我理解了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

Tags: pathfromimportbandas数组opennan
1条回答
网友
1楼 · 发布于 2024-04-27 10:49:10

cvs.raster()接受一个layer参数,以指定要光栅化的所提供的带区;也许这会有帮助

img = tf.shade(cvs.raster(da,layer=1), cmap=viridis)

在任何情况下,请注意datashader.transfer_functions.shade不会光栅化其输入;这是通过调用Canvas来完成的(这里特别是cvs.graster)。shade只是将已经光栅化的数组转换为彩色像素

相关问题 更多 >