从字节流加载栅格并设置其 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 那样远程安装文件。
我想要做的:从内存中的 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 那样远程安装文件。