|
| 1 | +--- |
| 2 | +jupyter: |
| 3 | + jupytext: |
| 4 | + text_representation: |
| 5 | + extension: .md |
| 6 | + format_name: markdown |
| 7 | + format_version: '1.3' |
| 8 | + jupytext_version: 1.17.1 |
| 9 | + kernelspec: |
| 10 | + display_name: Python 3 (ipykernel) |
| 11 | + language: python |
| 12 | + name: python3 |
| 13 | +--- |
| 14 | + |
| 15 | +# Configuración y Verificación del Entorno |
| 16 | + |
| 17 | +<!-- #region jupyter={"source_hidden": true} --> |
| 18 | +Necesitas conocer tus credenciales de NASA Earthdata para usar este cuaderno computacional (es decir, tu nombre de usuario y contraseña asociados). |
| 19 | + |
| 20 | +Ejecutar esta notebook te permitirá: |
| 21 | ++ Primero, construir un archivo llamado `.netrc` en la carpeta de inicio (es decir, `~/.netrc`) que contiene esas credenciales. |
| 22 | ++ Segundo, ejecutar una prueba que verifica que la configuración se haya realizado de forma correcta. |
| 23 | + |
| 24 | +La siguiente celda ejecutable define algunas funciones de Python que se utilizaran más adelante para importar las utilidades necesarias. |
| 25 | +<!-- #endregion --> |
| 26 | + |
| 27 | +```python jupyter={"source_hidden": true} |
| 28 | +from pathlib import Path |
| 29 | +from getpass import getpass |
| 30 | +import osgeo.gdal |
| 31 | +import rasterio |
| 32 | +from pystac_client import Client |
| 33 | +from warnings import filterwarnings |
| 34 | +filterwarnings("ignore") # suprimir advertencias de PySTAC |
| 35 | + |
| 36 | +# Configuración obligatoria de GDAL para acceder a datos en la nube |
| 37 | +osgeo.gdal.SetConfigOption('GDAL_HTTP_COOKIEFILE','~/.gdal_cookies.txt') |
| 38 | +osgeo.gdal.SetConfigOption('GDAL_HTTP_COOKIEJAR', '~/.gdal_cookies.txt') |
| 39 | +osgeo.gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN','EMPTY_DIR') |
| 40 | +osgeo.gdal.SetConfigOption('CPL_VSIL_CURL_ALLOWED_EXTENSIONS','TIF, TIFF') |
| 41 | + |
| 42 | +def create_netrc(PATH): |
| 43 | + """Genera un archivo netrc en la ruta indicada (PATH) solicitando al |
| 44 | + usuario que ingrese sus credenciales de forma interactiva.""" |
| 45 | + PATH.unlink(missing_ok=True) |
| 46 | + TEMPLATE = " ".join(["machine", "urs.earthdata.nasa.gov", "login", |
| 47 | + "{USERNAME}", "password", "{PASSWORD}\n"]) |
| 48 | + username = input("NASA EarthData login: ") |
| 49 | + password = getpass(prompt="NASA EarthData password: ") |
| 50 | + print('Writing .netrc file.') |
| 51 | + PATH.write_text(TEMPLATE.format(USERNAME=username, PASSWORD=password)) |
| 52 | + PATH.chmod(0o600) |
| 53 | + return None |
| 54 | + |
| 55 | +def define_options(): |
| 56 | + "Crea una URL y un diccionario de opciones necesarios para ejecutar una búsqueda con PySTAC." |
| 57 | + # Definir el área de interés (AOI) y el rango temporal |
| 58 | + livingston_tx, delta = (-95.09, 30.69), 0.1 |
| 59 | + AOI = tuple(coord + sgn*delta for sgn in (-1,+1) for coord in livingston_tx) |
| 60 | + start, stop = '2024-04-30', '2024-05-05' |
| 61 | + WINDOW = f'{start}/{stop}' |
| 62 | + URL = 'https://cmr.earthdata.nasa.gov/stac' |
| 63 | + PROVIDER = 'POCLOUD' |
| 64 | + COLLECTIONS = ["OPERA_L3_DSWX-HLS_V1_1.0"] |
| 65 | + AOI_string = f"({', '.join([f'{coord:.2f}' for coord in AOI])})" |
| 66 | + print(f"\nDefined AOI={AOI_string}\n {WINDOW=}") |
| 67 | + print(f" {COLLECTIONS=}\n {PROVIDER=}\n") |
| 68 | + return URL, PROVIDER, dict(bbox=AOI, collections=COLLECTIONS, datetime=WINDOW) |
| 69 | + |
| 70 | +def execute_search(STAC_URL, PROVIDER, opts): |
| 71 | + "Ejecuta una búsqueda STAC utilizando los parámetros requeridos" |
| 72 | + # Preparar el cliente de PySTAC |
| 73 | + catalog = Client.open(f'{STAC_URL}/{PROVIDER}/') |
| 74 | + results = list(catalog.search(**opts).items_as_dicts()) |
| 75 | + return results |
| 76 | + |
| 77 | +def process_uri(URI): |
| 78 | + "Dada una URI asociada a un archivo GeoTIFF remoto, intenta abrirlo y analizar su contenido." |
| 79 | + with rasterio.open(URI) as ds: |
| 80 | + _ = ds.profile |
| 81 | + return None |
| 82 | + |
| 83 | +def test_netrc(): |
| 84 | + """Prueba mínima para verificar las credenciales de NASA Earthdata necesarias |
| 85 | + para descargar productos de datos. Requiere un archivo .netrc en el directorio |
| 86 | + personal con credenciales válidas.""" |
| 87 | + STAC_URL, PROVIDER, opts = define_options() |
| 88 | + try: |
| 89 | + results = execute_search(STAC_URL, PROVIDER, opts) |
| 90 | + print(f"Retrieved {len(results)} search results...") |
| 91 | + test_uri = results[0]['assets']['0_B01_WTR']['href'] |
| 92 | + print(f"Search successful. Accessing test data...\n") |
| 93 | + process_uri(test_uri) |
| 94 | + except (IndexError, KeyError) as e: |
| 95 | + print(f"{results}\n") |
| 96 | + raise e |
| 97 | + except rasterio.RasterioIOError as e: |
| 98 | + print(e) |
| 99 | + raise e |
| 100 | + return None |
| 101 | +``` |
| 102 | + |
| 103 | +<!-- #region jupyter={"source_hidden": false} --> |
| 104 | +--- |
| 105 | +<!-- #endregion --> |
| 106 | + |
| 107 | +## Configuración del entorno en la nube para acceder a NASA EarthData desde Python |
| 108 | + |
| 109 | +<!-- #region jupyter={"source_hidden": true} --> |
| 110 | +Para acceder a los productos EarthData de la NASA desde programas Python o cuadernos computacionales Jupyter, es necesario guardar tus credenciales de NASA EarthData en un archivo especial llamado `.netrc`. |
| 111 | + |
| 112 | +Al ejecutar la celda de abajo: |
| 113 | ++ Se te mostrará una advertencia indicando que ejecutar el resto de esta celda sobrescribirá cualquier archivo .netrc existente. |
| 114 | ++ Se te pedirá que confirmes si deseas continuar: |
| 115 | + + En caso afirmativo, escribe `s` o `si`: se te pedirá tu nombre de usuario de *NASA Earthdata* y luego tu contraseña. Asegúrate de tenerlos listos antes de ejecutar la celda. |
| 116 | + + Si la respuesta es no, no se realizará ninguna acción. |
| 117 | + |
| 118 | +**¡Importante!** |
| 119 | ++ Elige `s` o `si` solo si te sientes cómodo con la eliminación de las credenciales almacenadas en el archivo `.netrc`. Recuerda tener disponible tu nombre de usuario y tu contraseña de NASA EarthData. |
| 120 | + |
| 121 | +<!-- #endregion --> |
| 122 | + |
| 123 | +```python jupyter={"source_hidden": true} |
| 124 | +NETRC_PATH = Path('~/.netrc').expanduser() |
| 125 | +print("Advertencia: Ejecutar el resto de esta celda sobrescribirá cualquier archivo .netrc existente.") |
| 126 | +overwrite = input("¿Confirmás que querés continuar? (S/N).") |
| 127 | +if overwrite.lower() in ['s', 'si', 'sí']: |
| 128 | + create_netrc(NETRC_PATH) |
| 129 | +else: |
| 130 | + print('Se omite la escritura del archivo .netrc.') |
| 131 | +``` |
| 132 | + |
| 133 | +<!-- #region jupyter={"source_hidden": true} --> |
| 134 | + |
| 135 | +Como alternativa, puede utilizar un editor de texto para crear el archivo`.netrc` con el siguiente contenido: |
| 136 | + |
| 137 | + ``` |
| 138 | + machine urs.earthdata.nasa.gov login USERNAME password PASSWORD |
| 139 | + ``` |
| 140 | +Por supuesto, debes reemplazar `USERNAME` y `PASSWORD` en tu archivo `.netrc` real con los detalles de tu cuenta de NASA EarthData. |
| 141 | + |
| 142 | +Una vez que el archivo `.netrc` se guarda con sus credenciales correctas, es una buena práctica restringir el acceso al mismo: |
| 143 | + |
| 144 | + ```bash |
| 145 | + $ chmod 600 ~/.netrc |
| 146 | + ``` |
| 147 | +Esto se logra en la penúltima línea de la función `create_netrc` (es decir, `PATH.chmod(0o600)`). |
| 148 | +<!-- #endregion --> |
| 149 | + |
| 150 | +<!-- #region jupyter={"source_hidden": false} --> |
| 151 | +--- |
| 152 | +<!-- #endregion --> |
| 153 | + |
| 154 | +## Verificación del Acceso a los Productos de NASA EarthData |
| 155 | + |
| 156 | +<!-- #region jupyter={"source_hidden": true} --> |
| 157 | +El archivo `.netrc` es necesario para acceder a los STAC (Catálogos de Activos Espacio-Temporales) dentro de los programas de Python que utilizan [PySTAC](https://pystac.readthedocs.io/en/stable/)). |
| 158 | + |
| 159 | +Para asegurarte de que todo funciona correctamente, ejecuta la siguiente celda de Python. Si la celda se ejecuta sin problemas, verás un mensaje que indica que las credenciales se han configurado correctamente: |
| 160 | + |
| 161 | +```bash |
| 162 | +¡Éxito! ¡Tu archivo de credenciales ~/.netrc está configurado correctamente! |
| 163 | +``` |
| 164 | +En este caso, ¡ya está! ¡Ahora tienes todo lo que necesitas para explorar los datos de observación de la Tierra provistos por la NASA a través del portal EarthData! |
| 165 | + |
| 166 | +<!-- #endregion --> |
| 167 | + |
| 168 | +<!-- #region jupyter={"source_hidden": true} --> |
| 169 | +Si, en cambio, ves el mensaje: |
| 170 | + |
| 171 | +```bash |
| 172 | +Asegurate que el archivo .netrc contiene credenciales de NASA Earthdata que existen en el directorio de inicio del usuario. |
| 173 | +``` |
| 174 | +deberás ingresar tus credenciales correctas en el archivo `~/.netrc`. Puedes hacerlo reiniciando y volviendo a ejecutar este cuaderno computacional o editando el archivo con un editor de texto. |
| 175 | + |
| 176 | +<!-- #endregion --> |
| 177 | + |
| 178 | +Entonces, ejecuta la siguiente celda para verificar la creación del archivo `~/.netrc` con las credenciales correctas: |
| 179 | + |
| 180 | +```python jupyter={"source_hidden": true} |
| 181 | +if ((not NETRC_PATH.exists()) or (NETRC_PATH.stat().st_size==0)): |
| 182 | + print("Advertencia: no existe un archivo .netrc válido; ejecuta esta celda nuevamente para crear uno con credenciales correctas.") |
| 183 | +else: |
| 184 | + try: |
| 185 | + test_netrc() |
| 186 | + print("¡Éxito! ¡Tu archivo de credenciales ~/.netrc está configurado correctamente!\n") |
| 187 | + except Exception as e: |
| 188 | + print(f"TEST FAILED.") |
| 189 | + print("\n\nAsegurate que el archivo .netrc contiene credenciales de NASA Earthdata que existen en el directorio de inicio del usuario.\n") |
| 190 | +``` |
| 191 | + |
| 192 | + |
| 193 | + |
| 194 | +<!-- #region jupyter={"source_hidden": false} --> |
| 195 | +--- |
| 196 | +<!-- #endregion --> |
0 commit comments