Decodificador METAR en Python
Project description
🌦️ METAR Decoder
Decodificador de mensajes METAR (Meteorological Aerodrome Report) para procesar, validar y estructurar observaciones meteorológicas aeronáutica
Proyecto desarrollado para SENAMHI. Compatible con variantes comunes del formato METAR y con elementos no estándar frecuentes en Latinoamérica.
📋 Características
- Decodificación completa de los campos principales (estación, fecha/hora, viento, visibilidad, nubes, temperatura/rocío, presión, fenómenos, tendencias, etc.).
- Tolerante a errores: intenta corregir inconsistencias comunes.
- Salida estructurada mediante tipos de datos (
Temperature,Wind,Pressure, etc.). - Salida plana mediante
to_flat_dict()con valores simples y listas/diccionarios. - CLI incluida para decodificar desde la terminal.
- Ejemplos y pruebas incluidos.
🚀 Instalación
Opción 1: Instalación en modo desarrollo
# Clonar o descargar el proyecto
git clone https://github.com/CADV92/metar_decoder.git
cd metar_decoder
# Instalar en modo desarrollo (cambios se reflejan automáticamente)
pip install -e .
Opción 2: Instalación estándar
cd metar_decoder
pip install .
Verificar instalación
python -c "from metar_decoder import MetarDecoder; print('✅ Instalación exitosa')"
💡 Uso Básico
from metar_decoder.decoder import MetarDecoder
# Ejemplo básico
metar = "METAR SPIM 061800Z 26008KT 9999 FEW020 SCT100 25/21 Q1013 RMK"
decoder = MetarDecoder(metar)
# Diccionario estructurado
data = decoder.to_dict()
# Diccionario plano (valores simples)
flat = decoder.to_flat_dict()
# Acceder a los datos decodificados
print(flat["station"]) # 'SPIM'
print(flat["wind_speed"]) # 8
print(flat["temperature"].celsius) # 25
print(flat["visibility_desc"]) # "10 km o más"
🧰 CLI (línea de comandos)
# Decodificar un METAR directamente
python -m metar_decoder.cli "SPIM 061800Z 26008KT 9999 25/21 Q1013"
# Decodificar desde un archivo con un METAR por línea
python -m metar_decoder.cli --file metars.txt
# Ejecución directa
metar_decode "SPAY 241200Z 15005KT 2400 BR SCT008 BKN025 19/18 Q1016"
📊 Elementos Soportados
Elementos Básicos
- ✅ Identificador de estación (ICAO de 4 letras)
- ✅ Fecha y hora (formato DDHHMMZ)
- ✅ Viento (dirección, velocidad, ráfagas, variable)
- ✅ Visibilidad (metros, millas estatutas, CAVOK)
- ✅ Tiempo presente (precipitación, obscuración, etc.)
- ✅ Nubes (cobertura, altura, tipo)
- ✅ Temperatura y punto de rocío
- ✅ Presión atmosférica (QNH/altímetro)
Elementos Adicionales
- ✅ Precipitación (cantidad en las últimas horas)
- ✅ Temperaturas extremas (máxima/mínima 24h)
- ✅ Dirección variable del viento
- ✅ Elementos personalizados (PP, TX, TN)
- ✅ Breve correción de errores en mensajes metar
🔧 Estructura del Proyecto
metar_decoder/
├── metar_decoder/ # Paquete principal
│ ├── __init__.py # Inicialización del paquete
│ ├── cli.py # Modulo CLI
│ ├── decoder.py # Clase principal MetarDecoder
│ ├── datatypes.py # Clases para tipos de datos específicos
│ ├── regex_patterns.py # Patrones de expresiones regulares
│ ├── weather_utils.py # Utilidades para fenómenos meteorológicos
│ └── utils.py # Funciones utilitarias y corrección de errores
├── tests/ # Tests del paquete
│ ├── __init__.py
│ └── test_decoder.py # Tests principales
├── examples/ # Ejemplos de uso
│ ├── __init__.py
│ └── example.py # Ejemplos demostrativos
├── setup.py # Configuración de instalación
├── README.md # Este archivo
└── LICENSE # Licencia del proyecto
📖 Ejemplos Detallados
Ejemplo 1: METAR Básico
from metar_decoder import MetarDecoder
metar = "METAR SPIM 061800Z 26008KT 9999 FEW020 25/21 Q1013"
flat = MetarDecoder(metar).to_flat_dict()
print(flat["station"]) # SPIM
print(flat["datetime_utc"]) # 2023-12-06T18:00:00+00:00
print(flat["wind_desc"]) # 260° a 8 kt
print(flat["temperature"].celsius) # 25
print(flat["dew_point"].celsius) # 21
print(flat["pressure_hpa"]) # 1013
Ejemplo 2: METAR con Fenómenos Meteorológicos
metar = "METAR SPJC 121300Z 08012G18KT 2000 -RA BKN008 OVC015 18/17 Q1015"
flat = MetarDecoder(metar).to_flat_dict()
print(flat["wind_desc"])
print(flat["present_weather_desc"])
print(flat["cloud_summary"])
print(f"{flat['humidity_rel_percent']}%")
Ejemplo 3: Acceso a Datos Específicos
flat = MetarDecoder("SPIM 061800Z VRB05KT CAVOK 28/20 Q1018").to_flat_dict()
if flat.get("wind_is_variable"):
print("Viento variable")
print(f"{flat['wind_speed']} {flat['wind_units']}")
if flat.get("visibility_cavok"):
print("Condiciones CAVOK")
spread = flat["temperature"].celsius - flat["dew_point"].celsius
print(f"Spread T-Td: {spread}°C")
🏗️ Clases de Datos
Temperature
temp = Temperature("25") # Temperatura positiva
temp_neg = Temperature("M05") # Temperatura negativa (-5°C)
print(temp.celsius) # 25
Wind
wind = Wind("26015G25KT")
print(wind.direction_degrees) # 260
print(wind.speed) # 15
print(wind.gust) # 25
print(wind.units) # KT
Pressure
pressure_hpa = Pressure("1013", "Q") # hPa
pressure_inhg = Pressure("2992", "A") # inHg
print(pressure_hpa.hPa) # 1013
print(pressure_hpa.inHg) # 29.91
🔍 Corrección Automática de Errores
El sistema incluye corrección automática para errores comunes:
# Corrige errores de tipeo comunes
metar_erroneo = "SPIM 061800Z VBR08KT CAVOK 25/21 Q1013" # VBR -> VRB
decoder = MetarDecoder(metar_erroneo)
# Automáticamente corregido durante el procesamiento
🧪 Testing
Ejecutar las pruebas incluidas:
# Ejecutar todos los tests
cd metar_decoder
python tests/test_decoder.py
# O usando pytest (si está instalado)
pytest tests/
# Con cobertura (si tienes pytest-cov)
pytest tests/ --cov=metar_decoder
Ejecutar ejemplos
# Ver ejemplos de uso completos
cd metar_decoder
python examples/example.py
Tests disponibles
- TestMetarDecoder: Pruebas de decodificación completa de METAR
- TestDataTypes: Pruebas de clases de tipos de datos (Temperature, Wind, Pressure)
- TestErrorCorrection: Pruebas de corrección automática de errores
- TestExtremeCases: Pruebas de casos límite y extremos
📝 Formato de Salida
El método to_dict() retorna un diccionario con todos los campos decodificados:
{
'raw_metar': 'SPIM 061800Z 26008KT 9999 25/21 Q1013',
'station': 'SPIM',
'datetime_utc': datetime.datetime(2023, 12, 6, 18, 0),
'wind': <Wind object>,
'wind_desc': '260° a 8 kt',
'wind_dir_degrees': 260,
'wind_speed': 8,
'wind_units': 'KT',
'visibility_m': 9999,
'visibility_desc': '10 km o más',
'temperature': <Temperature object>,
'dew_point': <Temperature object>,
'pressure': <Pressure object>,
'humidity_rel_percent': 84.0,
# ... más campos según contenido del METAR
}
🐛 Debugging y Logs
Para debugging, examina el METAR procesado:
decoder = MetarDecoder(metar_string)
print(f"METAR original: {metar_string}")
print(f"METAR procesado: {decoder.fields['raw_metar']}")
print(f"Campos extraídos: {list(decoder.fields.keys())}")
🤝 Contribuciones
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-caracteristica) - Commit tus cambios (
git commit -am 'Agrega nueva característica') - Push a la rama (
git push origin feature/nueva-caracteristica) - Crea un Pull Request
📄 Licencia
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
🏢 Desarrollado para SENAMHI
Proyecto desarrollado para el Servicio Nacional de Meteorología e Hidrología del Perú (SENAMHI) para el procesamiento automatizado de datos meteorológicos aeronáuticos.
Nota: Este decodificador está diseñado para manejar variaciones específicas de METAR utilizadas en la región, incluyendo elementos no estándar y formatos personalizados.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file metar_decoder-1.0.2.tar.gz.
File metadata
- Download URL: metar_decoder-1.0.2.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ecc620ac85e935bc2401a350bd886eb63ab8c398cf4b594f9318edd94706b51
|
|
| MD5 |
f6e6cb944e795ff101ae5e579e69eb62
|
|
| BLAKE2b-256 |
034949401e88b2118275716444e6278ef541ae8a3697868574f6c8dc85a6a02c
|
File details
Details for the file metar_decoder-1.0.2-py3-none-any.whl.
File metadata
- Download URL: metar_decoder-1.0.2-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fedb8b741e0d43899c697bf935202c8af780614b32d3d9ab1b74eccd2818a15b
|
|
| MD5 |
5e7f5c6f81ef59654953320f69e3b9a4
|
|
| BLAKE2b-256 |
da40be570cf1405786903c9c311869811682174a7ba6ad9338867308ca3ebd78
|