正在读取数据集¶
数据集对象提供对栅格数据文件的读、写和写访问,并通过调用 rasterio.open()
. 这个函数模仿了python的内置 open()
它返回的数据集对象是模仿python file
物体。
>>> import rasterio
>>> src = rasterio.open('tests/data/RGB.byte.tif')
>>> src
<open DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
>>> src.name
'tests/data/RGB.byte.tif'
>>> src.mode
'r'
>>> src.closed
False
如果你试图进入一条不存在的道路, rasterio.open()
做同样的事 open()
,立即引发异常。
>>> open('/lol/wut.tif')
Traceback (most recent call last):
...
FileNotFoundError: [Errno 2] No such file or directory: '/lol/wut.tif'
>>> rasterio.open('/lol/wut.tif')
Traceback (most recent call last):
...
rasterio.errors.RasterioIOError: No such file or directory
数据集通常有一个或多个带(或层)。按照gdal约定,这些索引从数字1开始。文件的第一个波段可以这样读取:
>>> array = src.read(1)
>>> array.shape
(718, 791)
返回的对象是二维numpy ndarray。该数组在python提示下的表示是一个摘要;用于测试的rasterio geotiff文件在角中有0个值,但在其他地方有非零的值。
>>> from matplotlib import pyplot
>>> pyplot.imshow(array, cmap='pink')
<matplotlib.image.AxesImage object at 0x...>
>>> pyplot.show()

输入数据集的所有带区都可以读取为三维数据数组,而不是读取单个带区。注意,3个轴的解释是 (bands, rows, columns)
. 见 图像处理软件 有关如何转换为某些软件预期的顺序的详细信息。
>>> array = src.read()
>>> array.shape
(3, 718, 791)
要读取数据集较小的块,请参阅 开窗读写 .
数据集所有带区的索引、numpy数据类型和nodata值都可以从 indexes
, dtypes
和 nodatavals
属性。
>>> for i, dtype, nodataval in zip(src.indexes, src.dtypes, src.nodatavals):
... print(i, dtype, nodataval)
...
1 uint8 0.0
2 uint8 0.0
3 uint8 0.0
若要关闭数据集,请调用 close()
方法。
>>> src.close()
>>> src
<closed DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
关闭后,无法再读取数据。
>>> src.read(1)
Traceback (most recent call last):
...
ValueError: can't read closed raster file
这与Python的行为相同 file
.
>>> f = open('README.rst')
>>> f.close()
>>> f.read()
Traceback (most recent call last):
...
ValueError: I/O operation on closed file.
像 Python 一样 file
对象可以,栅格数据集可以管理使用 with
声明。这可以确保关闭文件,不管块中可能出现什么异常。
>>> with rasterio.open('tests/data/RGB.byte.tif', 'r') as one:
... with rasterio.open('tests/data/RGB.byte.tif', 'r') as two:
... print(two)
... print(one)
... raise Exception("an error occurred")
...
<open DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
<open DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
Exception: an error occurred
>>> print(two)
<closed DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
>>> print(one)
<closed DatasetReader name='tests/data/RGB.byte.tif' mode='r'>
特定于格式的数据集读取选项可以作为关键字参数传递。例如,要关闭除TIFF文件的键和标记之外的所有类型的geotiff georeference,请通过 GEOREF_SOURCES='INTERNAL' .
>>> with rasterio.open('tests/data/RGB.byte.tif', GEOREF_SOURCES='INTERNAL') as dataset:
... # .aux.xml, .tab, .tfw sidecar files will be ignored.