如何使用rasterio/python使用shapefile屏蔽栅格,将多边形内的栅格像素设置为零?

Cat*_*ate 7 python mask raster clip rasterio

我正在尝试创建一个应用于卫星图像的地面遮罩,它将光栅中与地面质量相交的像素设置为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)
Run Code Online (Sandbox Code Playgroud)

如何遮盖与多边形相交的区域而不是那些不与多边形相交的区域?

jdm*_*cbr 5

rasterio.tools.mask.mask(在最新版本中为rasterio.mask.mask)包括一个option invertinvert=True设为时,遮罩将应用于与您的形状重叠的像素,而不是形状以外的区域。因此,您可以将上面的行更改为:

out_image, out_transform = mask(src, geoms, crop=True, invert=True)
Run Code Online (Sandbox Code Playgroud)