目录

上一个主题

10.3. 命令行用户指南

下一个主题

10.5. 使用 RasterIO 作图

关注公众号


常见问题

  1. Windows下的安装说明
  2. Jupyter免费在线实验环境
  3. 勘误与补充


10.4. NumPy 掩膜

如果需要,可以将数据集带区读取为 numpy-masked 数组。

>>> import rasterio
>>> src = rasterio.open("RGB.byte.tiff")
>>> blue = src.read(1, masked=True)
>>> blue.mask
False

如前所述,此掩膜与gdal波段掩膜相反。要获得符合GDAL RFC 15的面罩,请执行以下操作:

>>> msk = (~blue.mask * 255).astype('uint8')

对于任何整数值,都可以依赖此栅格标识。 N .

>>> N = 1
>>> (~src.read(N, masked=True).mask * 255 == src.read_masks(N)).all()
True

10.4.1. 数据集掩膜

有时每波段的掩膜是不合适的。在这种情况下,您可以从组件带(或其他辅助数据)中手动构造一个遮罩。 or 使用栅格数据集 src.dataset_mask() 功能。这将返回一个具有由以下条件确定的gdal样式掩膜的二维数组,其优先级为:

如果.msk文件、数据集范围的alpha或内部掩膜存在,它将用作数据集掩膜。

如果带阴影节点数据值的4波段rgba,则波段4将用作数据集掩膜。

如果存在nodata值,请使用带掩膜的二进制或()。

如果不存在no data值,则返回一个包含所有有效数据的掩膜(255)

请注意,这与read_掩膜和gdal rfc15不同,因为它适用于每个数据集,而不是每个频带。

10.4.2. 栅格文件中的节点数据表示法

nodata的存储和表示方式因数据格式和配置选项而异。虽然栅格在阅读时为这些细节提供了一个抽象,但在创建、操作和写入栅格数据时,了解这些差异通常很重要。

nodata值 : src.nodata 值用于定义应掩膜哪些像素。

阿尔法带 :对于RGB图像,有时会提供额外的第4波段(包含gdal样式的8位掩膜)来明确定义该掩膜。

内部掩膜带 :gdal提供了存储额外的布尔1位掩膜的能力,该掩膜存储在数据集内部。此选项依赖于具有 GDAL_TIFF_INTERNAL_MASK=True . 否则,将从外部写入掩膜。

外掩膜带 :同上,但遮罩带存储在侧车中 .msk 文件(默认)。

互操作性的解读

10.4.3. 图像处理软件

一些Python图像处理软件包对数组的组织方式与栅格不同。三维数组的解释 rasterio 是:

(bands, rows, columns)

而图像处理软件如 scikit-image , pillow 和 matplotlib 通常是:

(rows, columns, bands)

行数定义了数据集的高度,列是数据集的宽度。

numpy提供了一种有效交换轴顺序的方法,您可以使用以下重塑函数在栅格和图像轴顺序之间进行转换:

>>> import rasterio
>>> from rasterio.plot import reshape_as_raster, reshape_as_image
>>>
>>> raster = rasterio.open("RGB.byte.tiff").read()
>>> raster.shape
(1, 7801, 7651)
>>> image = reshape_as_image(raster)
>>> image.shape
(7801, 7651, 1)
>>> raster2 = reshape_as_raster(image)
>>> raster2.shape
(1, 7801, 7651)

数据集对象

栅格和 gdal 每个都有数据集对象。当然不是同一类,但也不是完全不同的类。在每种情况下,通常通过“opener”函数获取数据集对象: rasterio.open() 或 gdal.Open() .

这样,Python开发人员就可以减少读取文档的时间,数据集对象由 rasterio.open() 基于python的文件对象建模。它甚至有 close() 方法 gdal 缺少以便可以主动关闭数据集连接。

gdal 有带对象。Rasterio没有,因此也从来没有对象具有悬空的数据集指针。使用栅格,波段由一个数字索引表示,从1开始(就像gdal那样),并用作数据集方法的参数。将数据集的第一个带区读取为numpy ndarray 做这个。

>>> with rasterio.open('444.tiff') as src:
>>>     band1 = src.read(1)
>>> src = rasterio.open('444.tiff')
>>> src.indexes
(1,)
>>> src.dtypes
('uint16',)
>>> src.descriptions
(None,)
>>> src.units
(None,)

10.4.4. GeoTransform

这个 transform Rasterio数据集对象的属性与 GeoTransform 一个gdal数据集的属性,但Rasterio的功能更强大。它不仅是仿射变换矩阵元素的数组,而且是 Afine 并且有许多方便的方法。例如,任何栅格元素左上角的空间坐标都是数据集的 transform 矩阵和 (column, row) 元素的索引。

>>> src = rasterio.open('RGB.byte.tiff')
>>> src.transform * (0, 0)
(394185.0, 3469215.0)
>>> ~src.transform * (101985.0, 2826915.0)
(-9740.0, 21410.0)
>>> from rasterio.transform import Affine
>>> Affine.from_gdal(101985.0, 300.0379266750948, 0.0,
>>>                   2826915.0, 0.0, -300.041782729805).to_gdal()
(101985.0, 300.0379266750948, 0.0, 2826915.0, 0.0, -300.041782729805)
>>> from pyproj import Proj, transform
>>> src = rasterio.open('RGB.byte.tiff')
>>> transform(Proj(src.crs), Proj('+init=epsg:3857'), 101985.0, 2826915.0)
(13251622.469196176, 2938035.238323653)

10.4.5. 标签

gdal元数据项在栅格中称为“标记”。给定gdal元数据命名空间的标记集表示为dict。

>>> src.tags()
{'AREA_OR_POINT': 'Point'}
>>> src.tags(ns='IMAGE_STRUCTURE')
{'COMPRESSION': 'DEFLATE', 'INTERLEAVE': 'BAND'}

10.4.6. 有效数据掩膜

Rasterio为每个数据集提供一个数组,用与gdal相同的指标表示其有效的数据掩膜: 0 对于无效数据和 255 以获取有效数据。

>>> src = rasterio.open('RGB.byte.tiff')
>>> src.dataset_mask()
array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       ...,
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
>>> src.read(1, masked=True)
masked_array(
  data=[[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],
  mask=False,
  fill_value=999999,
  dtype=uint16)