1 votos

Leer archivos con Python GDAL utilizando VSIGS

Esta pregunta es algo similar a esta otra: ¿Cómo acceder eficientemente a archivos con GDAL desde un bucket S3 usando VSIS3? , excepto que estoy intentando acceder a archivos bucket desde Google Cloud Storage, con Python. Estoy usando GDAL 2.3.1, por lo que debería ser capaz de utilizar el comando Controlador virtual VSIGS .

Según el ejemplo que encontré, parece que este simple trozo de código debería funcionar:

from osgeo import gdal

ds = gdal.Open('/vsigs/my_bucket/image.tif') # doesn't work
ds = gdal.Open('gs://my_bucket/image.tif') # doesn't work either

Pero sigo recibiendo un error de "archivo no encontrado", así que parece que GDAL no entiende que estoy intentando abrir un archivo GCS. ¿Qué me falta?

Notas:

  • gcloud está correctamente instalado y configurado en mi ordenador (el archivo comando gsutil ls gs://earthengine-public/ funciona correctamente).
  • Estoy trabajando dentro de un entorno virtual de Python, por lo que podría ser el problema allí.

2voto

Shawn Umansky Puntos 91

Rasterio añadió soporte para urls gcs en la versión 1.0.15. Si está trabajando con una versión reciente, ahora puede utilizar lo siguiente:

import rasterio
import os

#can also set these as a normal env var outside of python
os.environ['GS_SECRET_ACCESS_KEY'] = ''
os.environ['GS_ACCESS_KEY_ID'] = ''

#url should look like gs://...
with rasterio.open(url) as src:
    print(src.width, src.height)

Esto es conveniente, ya que ya no es necesario envolver las solicitudes rasterio en el env.

También puede autenticar a través de otros métodos gcs (por ejemplo, establecer GOOGLE_APPLICATION_CREDENTIALS variable para el servicio de credenciales de cuenta json), sin embargo, estos métodos actualmente no funcionan a menos que haya instalado rasterio de una distribución de origen ( pip install rasterio --no-binary rasterio ) debido a incompatibilidades con la versión de gdal.

1voto

ArMoraer Puntos 338

Siguiendo la sugerencia de @metasequoia, voy a publicar la solución que he encontrado para este problema. Esto en realidad no responde a la pregunta, ya que se basa en rasterio en lugar de GDAL, pero podría ayudar a otras personas.

Este ejemplo mínimo me ha funcionado (con rasterio 1.0.1):

import rasterio

gs_access_key= "..."
gs_secret_access_key = "..."
url = 'bucket/image.tif'

with rasterio.Env(GS_SECRET_ACCESS_KEY=gs_secret_access_key, GS_ACCESS_KEY_ID=gs_access_key):
    with rasterio.open('/vsigs/{}'.format(url)) as src:
        print(src.width, src.height)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X