Estoy tratando de escribir una función que me ayude a construir un archivo de memoria de rasterio
y devuelva el objeto lector de conjunto de datos para poder manipularlo según sea necesario. Estoy tratando de evitar las declaraciones with
porque me gustaría permitir al usuario leer y escribir según lo consideren necesario. Hasta ahora tengo esto:
from rasterio import mask, features, warp
from rasterio.io import MemoryFile
import rasterio
import numpy as np
def create_memory_file(data, west_bound, north_bound, cellsize, driver='AAIGrid'):
# data es un array de numpy
dtype = data.dtype
shape = data.shape
transform = rasterio.transform.from_origin(west_bound, north_bound, cellsize, cellsize)
memfile = MemoryFile()
dataset = memfile.open(driver=driver, width= shape[1], height = shape[0], transform=transform, count=1, dtype = dtype)
dataset.write(data,1)
return dataset
def close_memory_file(memfile):
memfile.close()
data = np.array([[1,2,3], [4,5,6], [7,8,9]])
memfile = create_memory_file(data, 0, 2, 0.5)
memfile.read(1)
La última línea arroja un error:
Traceback (most recent call last):
File "D:/11202750-002_RA2CE/Basis/common.py", line 214, in
memfile.read(1)
File "rasterio\_io.pyx", line 209, in rasterio._io.DatasetReaderBase.read
rasterio.errors.UnsupportedOperation: not readable
Aparentemente, el memfile solo tiene permisos de escritura debido a lo siguiente:
>>> memfile
>>> memfile.mode
'w'
He probado varias combinaciones de agregar mode=r+
, permissions=r+
a mi llamada a memfile.open()
pero no lo permite.
¿Cómo puedo agregar el modo de lectura/escritura en el nivel de la declaración open
?
0 votos
¿Cuál fue exactamente tu error con "mode=r+"?
0 votos
Llamar con
dataset = memfile.open(mode='r+', driver=driver, width=shape[1], height=shape[0], transform=transform, count=1, dtype=dtype)
genera el siguiente error de tipo:TypeError: __init__() recibió múltiples valores para el argumento de palabra clave 'mode'
0 votos
No estoy seguro de que esto sea posible. La forma habitual es escribir y cerrar, luego leer. Si desea escribir nuevamente, simplemente sobrescriba el objeto del archivo de memoria.
1 votos
Es un archivo de memoria... ¿no lo pierdes una vez que se cierra?
0 votos
Tu código lanza un error diferente:
TypeError: se requiere un entero
. ¡Por favor asegúrate de que tu ejemplo muestre el problema que tienes!1 votos
No en mi computadora no lo hace. Obtengo
UnsupportedOperation: not readable
. Estoy usandorasterio 1.0.6
conPython 3.6.6 :: Anaconda, Inc.
Por favor asegúrate de estar usando estas versiones del software0 votos
@bugmenot123 Ese error solo está en versiones anteriores de rasterio. Lo vi en la versión 1.0a12 pero no en la 1.0.6.