17-18 de septiembre de 2025 | Girona
Javier Bustamante Díaz
Responsable científico
(Investigador Científico)
Ricardo Díaz-Delgado Hernández
Dr. Biología
Isabel Afán Asencio
Responsable Técnico
Dra. Biología
David Aragonés Borrego
Ingeniero Forestal
Diego García Díaz
Geógrafo
Pedro Gómez Giráldez
Dr. Ingeniería de Montes
Gabriela Patricia Romero Olivos
Geógrafa
Máquina Virtual
Características
Software
auto_download.py
protocolov2.py
productos.py
coast.py
hidroperiodo.py
utils.py
crontab
GitHub Repository
Código
Carpetas
/ori
/geo
/rad
/nor
/pro
/hyd
/data
/mongo
auto_download.py
download_landsat_scenes(username,
password,
latitude,
longitude,
days_back=15,
end_date=None,
process=True,
max_cloud_cover=100,
output_dir='path/to/save/rars')
Es donde sucede "la magia". Se trata del script que se encarga de buscar escenas nuevas para el rango de fechas seleccionado, cotejarlas con la base de datos y en caso de no estar, realizar la descarga y llamar a las clases Landsat() y Product() para procesar la escena. Si todo va bien, termina enviando un mail llamando a las funciones de utils.py
- Uso de imágenes ori en L2 (Reflectividad en superficie)
- Nuevos productos ofrecidos
- Integración con Geoportal
- Nueva metodología para la máscara de agua (NoData)
- Integramente en Python
Busqueda y descarga
Hillshade
MDT
Geo & Rad
Productos
Normalización
Escena
Landsat
Pias
PIAs Ref
FMASK
Data
No
GeoServer
ICTS
LAST
├── 20250615l9oli202_34_censo_aereo_l3.csv
├── 20250615l9oli202_34_flood.png
├── 20250615l9oli202_34_lagunas_carola.csv
├── 20250615l9oli202_34_lagunas_principales.csv
├── 20250615l9oli202_34_resumen_lagunas_carola.csv
├── 20250615l9oli202_34_resumen_lagunas.csv
├── 20250615l9oli202_34_rgb.png
└── 20250615l9oli202_34_superficie_inundada.csv
20250615l9oli202_34
{"_id": "20240815l9oli202_34",
"usgs_id": "LC92020342024228LGN01",
"tier_id": "LC09_L1TP_202034_20240815_20240815_02_T1",
"lpgs": "LPGS_16.4.0",
"category": "T1",
"Clouds": {"cloud_scene": 0.06,
"land cloud cover": 0.06,
"cloud_PN": 0 },
"Info": {
"Tecnico": "LAST-EBD Auto",
"Iniciada": {"$date": {"$numberLong": "1724690285816"}},
"Pasos": {"rad": "",
"nor": {"Normalize": "True",
"Nor-Values": {
"blue":
{"Parametros":
{"slope": 1.020172035444719,
"intercept": -0.00711237939135306,
"std": 0.016095327213406563,
"r": 0.98906989518987,
"N": 54886,
"iter": 1},
"Tipo_Area":
{"Mar": 49347,
"Embalses": 793,
"Pinar": 1564,
"Urbano-1": 575,
"Urbano-2": 944,
"Aeropuertos": 547,
"Arena": 664,
"Pastizales": 266,
"Mineria": 186}},
"Productos":
["NDVI", "NDWI", "MNDWI",
{"Flood": {
"El Rincon del Pescador": 72.72,
"Marismillas": 0.99,
"Caracoles": 0,
"FAO": 14.94,
"Marisma Occidental": 1.26,
"Marisma Oriental": 6.57,
"Entremuros": 115.29} },
"Turbidity",
"Depth" ]}
{"_id": "hidroperiodo_2023-2024",
"escenas": [
{"escena_id": "20240409l9oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 19896.300000000003},
{"escena_id": "20240503l8oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 11161.53},
{"escena_id": "20240511l9oli202_34",
"nubes_marismas": 8.31,
"ha_inundacion": 8354.789999999999},
{"escena_id": "20240527l9oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 3754.53},
{"escena_id": "20240604l8oli202_34",
"nubes_marismas": 0.06,
"ha_inundacion": 2661.84},
{"escena_id": "20240714l9oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 249.93},
{"escena_id": "20240722l8oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 215.1},
{"escena_id": "20240807l8oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 209.43},
{"escena_id": "20240815l9oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 211.76999999999998},
{"escena_id": "20231008l8oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 305.91},
{"escena_id": "20231024l8oli202_34",
"nubes_marismas": 7.69,
"ha_inundacion": 1131.8400000000001},
{"escena_id": "20231117l9oli202_34",
"nubes_marismas": 0,
"ha_inundacion": 408.51},
{"escena_id": "20231125l8oli202_34",
"nubes_marismas": 0.03,
"ha_inundacion": 421.83},
{"escena_id": "20231219l9oli202_34",
"nubes_marismas": 4.76,
"ha_inundacion": 589.5899999999999},
{"escena_id": "20231227l8oli202_34",
"nubes_marismas": 0.63,
"ha_inundacion": 512.8199999999999},
{"escena_id": "20240112l8oli202_34",
"nubes_marismas": 0.09,
"ha_inundacion": 696.69},
{"escena_id": "20240120l9oli202_34",
"nubes_marismas": 0.01,
"ha_inundacion": 1138.59},
{"escena_id": "20240221l9oli202_34",
"nubes_marismas": 7.73,
"ha_inundacion": 4288.32},
{"escena_id": "20240229l8oli202_34",
"nubes_marismas": 0.01,
"ha_inundacion": 3901.3200000000006},
{"escena_id": "20240316l8oli202_34",
"nubes_marismas": 6.05,
"ha_inundacion": 4150.98}]}
Landsat
Hidroperiodo
dtm
fmask_escena
hillshade_escena
ndvi_escena
ndwi_escena
mndwi_escena
cob_veg
ndvi_p10
ndvi_mean
fmask
mndwi
ndwi
swir1
Criterios:
Swir1 <= 0.12
slope > 8 (**embalses NDWI_scene & MNDWI_scene**)
hillshade < p30
ndvip10 > 0.3 & ndvimean > 0.5
cobveg > 75
ndvi_scene > 0.6 & dtm > 2.5
fmask_scene clouds & shadows
sum(reclass((fmask_scene, ndwi_scene, mndwi_scene)) >= 2
hidroperiodo.py
funciones:
get_escenas_values()
get_hydroperiod()
get_products()
Gini() & IRT()**
get_escenas_values() se encarga de calcular los días "que vale" cada escena del ciclo hidrológico (1 de septiembre - 31 de agosto).
get_hydroperiod() calcula el número de días que un pixel ha estado inundado o seco o ha sido NoData.
get_products() genera los rasters con los hidroperiodos y el número de días válidos del ciclo para cada pixel.
Valid days
Hydroperiod
¡Toda esta metodología es transferible a otras escenas!
Solo se necesitan una imagen de referencia y unas PIAs sobre la misma. Junto con una serie de capas auxiliares que son fácilmente obtenibles con Ndvi2Gif.