使用 rasterio 屏蔽/裁剪光栅会导致 AttributeError

Posted

技术标签:

【中文标题】使用 rasterio 屏蔽/裁剪光栅会导致 AttributeError【英文标题】:Using rasterio to mask/crop a raster results in AttributeError 【发布时间】:2021-04-06 09:54:10 【问题描述】:

我正在尝试使用rasteriomask 光栅。根据mask documentation,我需要在'r'模式下加载一个光栅文件,我已经这样做了:

file = rasterio.open('/data/corine2018_100m/test.tif')
print(file)
<open DatasetReader name='/data/corine2018_100m/test.tif' mode='r'>

我还需要一个shapes,它是一个可迭代的类似 GeoJSON 的对象。我让 GeoJSON 从 Django PolygonField() 序列化了一个 Polygon 对象并将其添加到列表中(我对文档的“可迭代对象”的解释):

obj = newJob.objects.create(job_loc="SRID=4326;POLYGON ((0.9063720703125029 52.32023207609735, 0.8239746093749998 52.10819209746323, 1.170043945312496 52.14191683166823, 1.170043945312496 52.31351619974807, 0.9063720703125029 52.32023207609735))")

poly = [obj.job_loc.geojson]
print(poly)
[' "type": "Polygon", "coordinates": [ [ [ 0.906372070312503, 52.320232076097348 ], [ 0.823974609375, 52.108192097463231 ], [ 1.170043945312496, 52.141916831668233 ], [ 1.170043945312496, 52.313516199748072 ], [ 0.906372070312503, 52.320232076097348 ] ] ] ']

print(type(poly))
<class 'list'>

然后我尝试使用以下掩码:

masked_band, masked_transform = rasterio.mask.mask(file, poly, crop=True)

但是,我得到了错误:

AttributeError: 'str' object has no attribute 'get'

我已经尝试过following this(即将我的 JSON 添加到列表中),但我仍然收到错误消息。有人可以帮我掩盖这个栅格吗?

【问题讨论】:

【参考方案1】:

问题在于,在您的示例中,您有一个字符串列表,您需要将字符串转换为字典,例如使用 json.loads(str)

如果您将poly = [obj.job_loc.geojson] 更改为poly = [json.loads(obj.job_loc.geojson)],那么您将获得一个字典列表。

【讨论】:

以上是关于使用 rasterio 屏蔽/裁剪光栅会导致 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

为啥聚合/裁剪后我的光栅文件大小会增加?

无法使用 rasterio.mask 剪辑图像

使用带有 Python 的 GDAL 裁剪光栅文件

使用 Polygon 裁剪光栅文件并使用相同的文件名写入输出

使用 sf::st_crop() 和 raster::crop() 裁剪光栅堆栈时出错

软件光栅器实现(裁剪)