Skip to main content

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

  1. Fork el proyecto
  2. Crea una rama para tu feature (git checkout -b feature/nueva-caracteristica)
  3. Commit tus cambios (git commit -am 'Agrega nueva característica')
  4. Push a la rama (git push origin feature/nueva-caracteristica)
  5. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

metar_decoder-1.0.2.tar.gz (23.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

metar_decoder-1.0.2-py3-none-any.whl (20.2 kB view details)

Uploaded Python 3

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

Hashes for metar_decoder-1.0.2.tar.gz
Algorithm Hash digest
SHA256 1ecc620ac85e935bc2401a350bd886eb63ab8c398cf4b594f9318edd94706b51
MD5 f6e6cb944e795ff101ae5e579e69eb62
BLAKE2b-256 034949401e88b2118275716444e6278ef541ae8a3697868574f6c8dc85a6a02c

See more details on using hashes here.

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

Hashes for metar_decoder-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fedb8b741e0d43899c697bf935202c8af780614b32d3d9ab1b74eccd2818a15b
MD5 5e7f5c6f81ef59654953320f69e3b9a4
BLAKE2b-256 da40be570cf1405786903c9c311869811682174a7ba6ad9338867308ca3ebd78

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page