【问题标题】:Load raster from bytestream and set its CRS从字节流加载栅格并设置其 CRS
【发布时间】:2022-05-04 17:50:56
【问题描述】:

我想要做的:从内存中的 s3 存储桶加载栅格并将其 CRS 设置为 4326(它没有设置 crs)

到目前为止我所拥有的:

import boto3
import rasterio
from rasterio.crs import CRS

bucket = 'my bucket'
key = 'my_key'
s3 = boto3.client('s3')
file_byte_string = s3.get_object(Bucket=bucket,Key=key)['Body'].read()
with rasterio.open(BytesIO(file_byte_string), mode='r+') as ds:
  crs = CRS({"init": "epsg:4326"}) 
  ds.crs = crs

我在这里找到了构建我的代码的方法

Set CRS for a file read with rasterio

如果我给它一个本地文件的路径它可以工作,但它不适用于字节流。

当我使用 '+r' 模式时出现的错误:

rasterio.errors.PathError: invalid path '<_io.BytesIO object at 0x7fb4503ca4d0>'

当我使用“r”模式时出现的错误:

rasterio.errors.DatasetAttributeError: read-only attribute

有没有办法以 r+ 模式加载字节流,以便我可以设置/修改 CRS?

【问题讨论】:

  • 你解决了吗?我现在也在处理同样的问题
  • 很遗憾没有。
  • 我通过在目标文件上声明ds.crs = crs 解决了这个问题。这不是一个聪明的解决方法
  • 总比没有好:)

标签: python amazon-s3 rasterio bytestream


【解决方案1】:

如果您将字节包装在NamedTemporaryFile 中,您可以实现此目的。 in the docs 解释了这个和一些替代方案。

import boto3
import rasterio
from rasterio.crs import CRS
import tempfile

bucket = 'asdf'
key = 'asdf'


s3 = boto3.client('s3')
file_byte_string = s3.get_object(Bucket=bucket,Key=key)['Body'].read()

with tempfile.NamedTemporaryFile() as tmpfile:
    tmpfile.write(file_byte_string)
    with rasterio.open(tmpfile.name, "r+") as ds:
         crs = CRS({"init": "epsg:4326"}) 
         ds.crs = crs

这种方法的一个重要限制是您必须将整个文件从 S3 下载到内存中,而不是像 this 这样远程挂载文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2021-03-31
    • 2021-08-07
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多