Читать TIFF-файл напрямую в массив numpy без сохранения на диск

Я часто скачиваю (гео) файлы TIFF, сохраняю их на временное дисковое пространство, затем читаю данные, используя растерио, чтобы получить numpy.ndarray что я могу потом проанализировать.

Например, используя этот URL для изображений NAIP:

import os
from requests import get
from rasterio import open as rasopen

req = get(url, verify=False, stream=True)
if req.status_code != 200:
    raise ValueError('Bad response from NAIP API request.')
temp = os.path.join(os.getcwd(), 'temp', 'tile.tif')
with open(temp, 'wb') as f:
    f.write(req.content)
with rasopen(temp, 'r') as src:
    array = src.read()
    profile = src.profile
os.remove(temp)    

Для других (netcdf) данных с географической сеткой я мог бы использовать xarray для получения данных из этого URL- адреса для получения данных Gridmet:

from xarray import open_dataset

xray = open_dataset(url)
variable = 'pr' # precipitation
subset = xray.loc[dict(lat=slice(north, south),
                       lon=slice(west,east))]
arr = subset.variable.values

Таким образом, получение объекта xarray работает как поток и легко попасть в ndarray, но я знаю только об этой работе над наборами данных netcdf. Есть ли способ "поток" в TIF данных к ndarray объект? В идеале это можно сделать с

with rasopen(url, 'r') as src:
    array = src.read()

как rasterio возвращает хороший объект метаданных вместе с ndarray Хотя я не получил, чтобы работать с ресурсом URL. Благодарю.

1 ответ

Решение

Да, вы можете прочитать это по памяти:

from rasterio.io import MemoryFile

with MemoryFile(data) as memfile:
    with memfile.open() as dataset:
        data_array = dataset.read()

Или прямо с URL:

with rasterio.open('https://pathto.tif') as dataset:
    print(dataset.profile)

Я не мог заставить последний работать с вашим URL, хотя вы можете попробовать первый.

Другие вопросы по тегам