如果需要,可以将数据集带区读取为 numpy-masked 数组。
import rasterio
src = rasterio.open("/data/gdata/geotiff_file.tif")
blue = src.read(1, masked=True)
blue.mask
np.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()
np.True_
数据集掩膜
有时每波段的掩膜是不合适的。在这种情况下,您可以从波段(或其他辅助数据)中手动构造一个遮罩;
或者使用栅格数据集 src.dataset_mask()
功能。
这将返回一个具有由以下条件确定的gdal样式掩膜的二维数组,其优先级为:
- 如果.msk文件、数据集范围的alpha或内部掩膜存在,它将用作数据集掩膜。
- 如果带阴影节点数据值的4波段rgba,则波段4将用作数据集掩膜。
- 如果存在nodata值,请使用带掩膜的二进制或()。
- 如果不存在no data值,则返回一个包含所有有效数据的掩膜(255)
请注意,这与read_掩膜和gdal rfc15不同,因为它适用于每个数据集,而不是每个波段。
栅格文件中的节点数据表示法
nodata的存储和表示方式因数据格式和配置选项而异。 虽然栅格在阅读时为这些细节提供了一个抽象, 但在创建、操作和写入栅格数据时,了解这些差异通常很重要。
- nodata值 : src.nodata 值用于定义应掩膜哪些像素。
- 阿尔法带 :对于RGB图像,有时会提供额外的第4波段(包含gdal样式的8位掩膜)来明确定义该掩膜。
- 内部掩膜带 :gdal提供了存储额外的布尔1位掩膜的能力,该掩膜存储在数据集内部。此选项依赖于具有 GDAL_TIFF_INTERNAL_MASK=True . 否则,将从外部写入掩膜。
- 外掩膜带 :同上,但遮罩带存储在侧车中 .msk 文件(默认)。
而图像处理软件如 scikit-image , pillow 和 matplotlib 通常是:
行数定义了数据集的高度,列是数据集的宽度。
numpy提供了一种有效交换轴顺序的方法,您可以使用以下重塑函数在栅格和图像轴顺序之间进行转换:
import rasterio
from rasterio.plot import reshape_as_raster, reshape_as_image
raster = rasterio.open("/data/gdata/geotiff_file.tif").read()
raster.shape
(3, 900, 1500)
image = reshape_as_image(raster)
image.shape
(900, 1500, 3)
raster2 = reshape_as_raster(image)
raster2.shape
(3, 900, 1500)
数据集对象
栅格和 gdal 每个都有数据集对象。当然不是同一类,但也不是完全不同的类。在每种情况下,通常通过“opener”函数获取数据集对象: rasterio.open() 或 gdal.Open() .
这样,Python开发人员就可以减少读取文档的时间,数据集对象由 rasterio.open() 基于python的文件对象建模。它甚至有 close() 方法 gdal 缺少以便可以主动关闭数据集连接。
gdal 有带对象。Rasterio没有,因此也从来没有对象具有悬空的数据集指针。使用栅格,波段由一个数字索引表示,从1开始(就像gdal那样),并用作数据集方法的参数。将数据集的第一个带区读取为numpy ndarray 做这个。
with rasterio.open('/data/gdata/geotiff_file.tif') as src:
band1 = src.read(1)
src = rasterio.open('/data/gdata/geotiff_file.tif')
src.indexes
(1, 2, 3)
src.dtypes
('uint8', 'uint8', 'uint8')
src.descriptions
(None, None, None)
src.units
(None, None, None)
src = rasterio.open('/data/gdata/geotiff_file.tif')
src.transform * (0, 0)
(1868454.913, 5353126.266)
~src.transform * (101985.0, 2826915.0)
(-58882.33043333333, 84207.0422)
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('/data/gdata/geotiff_file.tif')
src.crs
CRS.from_wkt('PROJCS["Albers_Beijing54",GEOGCS["Unknown datum based upon the Krassowsky 1940 ellipsoid",DATUM["Not_specified_based_on_Krassowsky_1940_ellipsoid",SPHEROID["Krassowsky 1940",6378245,298.3,AUTHORITY["EPSG","7024"]],AUTHORITY["EPSG","6024"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",0],PARAMETER["longitude_of_center",105],PARAMETER["standard_parallel_1",25],PARAMETER["standard_parallel_2",47],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]')
这个数据无投影信息。没有转投影。
# transform(Proj(src.crs), Proj('epsg:3857'), 101985.0, 2826915.0)
src.tags()
{'AREA_OR_POINT': 'Area', 'PyramidResamplingType': 'NEAREST'}
src.tags(ns='IMAGE_STRUCTURE')
{'INTERLEAVE': 'PIXEL'}
src = rasterio.open('/data/gdata/geotiff_file.tif')
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=[[145, 146, 145, ..., 67, 43, 28], [158, 157, 155, ..., 74, 53, 35], [156, 157, 156, ..., 52, 42, 28], ..., [223, 220, 219, ..., 24, 3, 0], [222, 219, 219, ..., 76, 41, 56], [221, 218, 218, ..., 70, 64, 86]], mask=False, fill_value=np.int64(999999), dtype=uint8)