我该如何使用rasterio/python来使用一个shapefile对栅格进行屏蔽(mask),将多边形内的栅格像素值设置为零?

11

我正在尝试创建一个陆地遮罩,用于应用于卫星图像,将与陆地质量相交的栅格像素设置为0。

在尝试使用gdal、skimage、pyplot等工具后,我发现rasterio cookbook中提供的方法快速简便。但是,它将多边形外的像素设置为0,而我正试图做相反的操作。

如果可能,请继续使用rasterio——您无需计算地理空间坐标的像素位置或处理超出栅格范围并变为负数的剪切特征。这也很快速,对于我正在处理的原始影像文件大小非常重要。

来自此链接:https://mapbox.s3.amazonaws.com/playground/perrygeo/rasterio-docs/cookbook.html#masking-raster-with-a-polygon-feature

我的代码如下:

import fiona
import rasterio
from rasterio.tools.mask import mask

with fiona.open("/Users/Cate/UK_Mainland.shp", "r") as shapefile:
    geoms = [feature["geometry"] for feature in shapefile]

with rasterio.open("jan_clip.tif") as src:
    out_image, out_transform = mask(src, geoms, crop=True)
    out_meta = src.meta.copy()

out_meta.update({"driver": "GTiff",
                 "height": out_image.shape[1],
                 "width": out_image.shape[2],
                 "transform": out_transform})

with rasterio.open("masked2.tif", "w", **out_meta) as dest:
    dest.write(out_image)
我该如何遮盖与多边形相交的区域而不是未相交的区域?答案:

我该如何遮盖与多边形相交的区域而不是未相交的区域?

1个回答

12

rasterio.tools.mask.mask(在更新的版本中,它是rasterio.mask.mask)包括一个选项invert。当invert=True时,掩膜将应用于与您的形状重叠的像素,而不是形状外部的区域。因此,您可以将上面的行更改为:

out_image, out_transform = mask(src, geoms, invert=True)

1
裁剪和反转不能同时为True。 - lorenzori
1
@lorenzori 谢谢,没错,我已经更新了以删除裁剪。 - jdmcbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接