正在读取数据集

数据集对象提供对栅格数据文件的读、写和写访问,并通过调用 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()  
http://farm6.staticflickr.com/5032/13938576006_b99b23271b_o_d.png

输入数据集的所有带区都可以读取为三维数据数组,而不是读取单个带区。注意,3个轴的解释是 (bands, rows, columns) . 见 图像处理软件 有关如何转换为某些软件预期的顺序的详细信息。

>>> array = src.read()
>>> array.shape
(3, 718, 791)

要读取数据集较小的块,请参阅 开窗读写 .

数据集所有带区的索引、numpy数据类型和nodata值都可以从 indexesdtypesnodatavals 属性。

>>> 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.