python-xarray - xarray 如何使用 open_rasterio 加载和索引大型 GeoTIFF 文件?

标签 python-xarray

我正在使用xarray包来加载和访问大型GeoTIFF文件(> 50GB)的数据,并且它工作完美。

import xarray as xr
img = xr.open_rasterio("path/to/large_geo_tiff.tif")
pixel_value = img[0,1225, 4321]
print("The pixel value is: ", pixel_value.values.item())

但是,我想知道xarray实际上是如何加载大型GeoTIFF文件的。显然,它不会将整个文件加载到内存中,因为它不适合,而是执行某种延迟加载。我只习惯 daskDask Arrays,它们将数据分割成 block ,并且只需将相应的 block 加载到内存中即可轻松访问像素。 但是函数 open_rasterio 的签名如下所示

xarray.open_rasterio(文件名,parse_coordinates=None,chunks=None,cache=None,lock=None)

由于我没有定义 block ,因此img不应该被分块。所以我的问题是,调用 pixel_value = img[0,1225, 4321] 时会发生什么,以及 xarray 如何快速访问给定位置的像素值?

我期待任何反馈。

最佳答案

xarray相比,dask_image在读取tiff文件方面似乎不太聪明

提供的 GeoTIFF 不是平铺,但我刚刚检查了 tiff 文件格式,如下所示

TIFF File: '/Users/jan/Desktop/ms-project/processed/metashape/export/untiled.tif'
                       Mode: 'r'
    Current Image Directory: 1
           Number Of Strips: 1336
                SubFileType: Tiff.SubFileType.Default
                Photometric: Tiff.Photometric.RGB
                ImageLength: 42746
                 ImageWidth: 35366
               RowsPerStrip: 32
              BitsPerSample: 8
                Compression: Tiff.Compression.LZW
               SampleFormat: Tiff.SampleFormat.UInt
            SamplesPerPixel: 3
        PlanarConfiguration: Tiff.PlanarConfiguration.Chunky
                Orientation: Tiff.Orientation.TopLeft

重要的是 tif stripped ,其中每个 strip 都是连续行位图图像数据的单独集合,这使得随机访问变得更加容易,并且xarray似乎通过以下方式利用了剥离图像:只是加载所需的数据 - 我只是通过加载 GeoTIFF 调用 xarray.open_rasterio 使用的名为 rasterio

的后端模块来检查这一点
>>> import rasterio
>>> ortho = rasterio.open("./orthomosaic.tif")
>>> ortho.is_tiled
False
>>> ortho.block_shapes
[(32, 248489), (32, 248489), (32, 248489)]
另一方面,

dask_image 不会利用这些条纹,而是将整个图像加载到一个 block 中,因此耗尽内存 - 即使您编写 >平铺 tif 文件dask_image不会考虑这一点

>>> import dask_image.imread
>>> ortho = dask_image.imread.imread("./orthomosaic.tif")
>>> ortho
dask.array<from-value, shape=(1, 104700, 248489, 3), dtype=uint8, chunksize=(1, 104700, 248489, 3), chunktype=numpy.ndarray>

关于python-xarray - xarray 如何使用 open_rasterio 加载和索引大型 GeoTIFF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62287964/

相关文章:

python - 抑制 xarray.DataArray.plot 中的标签

python - 如何将数组中的零转换为Nan?

python - 如果我只有 netcdf3 工具,如何读取 netcdf4 数据?

python - 从 Xarray 中的 `xr.Dataset` 获取值(点、向量、数组等)? ( python 3)

python - 从 netCDF 中提取位置和跨时间范围的值

python - 从 2D lat/lon 矩阵转换为 1D lat/lon 数组

python-xarray: xarray.Dataset.keep?

python-xarray - xarray.apply_ufunc() 与 GroupBy : unexpected number of dimensions

python - 遍历 xarray。 DataArray 第一维及其坐标

numpy - xarray 或 dask 真的支持内存映射吗?