从字节流加载栅格并设置其 CRS

Load raster from bytestream and set its CRS

我想要做的:从内存中的 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

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

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

我在“+r”模式下遇到的错误:

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

我在 'r' 模式下遇到的错误:

rasterio.errors.DatasetAttributeError: read-only attribute

有没有办法在 r+ 模式下加载字节流,以便我可以 set/modify CRS?

如果将字节包装在 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 那样远程安装文件。