Сохранить изображение в S3, используя gdal - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю над проектом, в котором мне нужно сохранить изображение на S3 с помощью библиотеки Python Gdal. Более конкретно, я получаю массив np, представляющий это изображение, и я хочу отправить его в мое хранилище S3.

Как я должен это сделать? Я тихий новичок, и я не смог найти ответ на сайте Гдала.

Помощь будет оценена.

1 Ответ

0 голосов
/ 08 ноября 2018

У вас есть два варианта

Я предполагаю, что вы установили свои учетные данные AWS на своем компьютере, так как это использует boto3. Если нет, то я думаю, что это выходит за рамки этого вопроса.

Самое простое - сохранить набор данных в файл на диске и затем загрузить его

Я предполагаю, что у вас нет набора данных на диске? Если у вас уже есть файл tif с вашим набором данных, вы можете просто проигнорировать часть createcopy

import boto3

# If you only have your dataset in memory, save your dataset in a tif file on disk
driver = gdal.GetDriverByName('GTiff')
driver.CreateCopy('path_to_tif_file.tif', your_dataset)

s3 = boto3.client('s3')
s3.upload_file('path_to_tif_file.tif', 'bucket_name', 'path_on_s3.tif')

Если вы предпочитаете не сохранять файл TIF на диске

Вы также можете загрузить набор данных непосредственно на S3, однако это немного сложнее

import boto3

def put_tif_from_gdal_mem_dataset(key, dataset, bucket_name):
    # Load the dataset into the virtual filesystem
    temp_name = '/vsimem/current.tif'
    tiff_driver = gdal.GetDriverByName('GTiff')
    tiff_driver.CreateCopy(temp_name, dataset)
    # Read the raw data from the virtual filesystem
    f = gdal.VSIFOpenL(temp_name, 'rb')
    gdal.VSIFSeekL(f, 0, 2)  # seek to end
    size = gdal.VSIFTellL(f)
    gdal.VSIFSeekL(f, 0, 0)  # seek to beginning
    data = gdal.VSIFReadL(1, size, f)
    gdal.VSIFCloseL(f)
    # Upload the raw data to s3
    s3.put_object(Key=key, Bucket=bucket_name, Body=data, ContentLength=size)
    gdal.Unlink(temp_name)

put_tif_from_gdal_mem_dataset('path_on_s3.tif', your_dataset, 'bucket_name')
...