我正在使用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文件的。显然,它不会将整个文件加载到内存中,因为它不适合,而是执行某种延迟加载。我只习惯 dask 和 Dask 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/