UNPKG

aemet-api

Version:

Cliente TypeScript para la API de AEMET (Agencia Estatal de Meteorología)

263 lines (262 loc) 10.1 kB
/** * Clase principal de la API de AEMET */ import { AemetOptions, SimpleForecastResponse, ForecastResponse, ClimateValuesParams, WeatherStation, ClimateValuesResponse, WeatherByCoordinatesResponse, AlertsGeoJSON } from './lib/types'; /** * Cliente para la API de AEMET (Agencia Estatal de Meteorología) */ export declare class Aemet { private apiKey; private baseUrl; private timeout; private provinciaIndex; private municipios; /** * Inicializa un nuevo cliente de AEMET * @param apiKey - Clave API para acceder a la API de AEMET * @param options - Opciones adicionales */ constructor(apiKey: string, options?: AemetOptions); /** * Obtener la predicción simplificada para un municipio * @param municipalityCode - Código INE del municipio (5 dígitos) * @returns Predicción simplificada para los próximos 3 días */ getSimpleForecast(municipalityCode: string): Promise<SimpleForecastResponse>; /** * Obtener la predicción completa para un municipio * @param municipalityCode - Código INE del municipio (5 dígitos) * @returns Predicción completa con los datos crudos */ getForecast(municipalityCode: string): Promise<ForecastResponse>; /** * Obtener la lista de municipios disponibles * @returns Lista de municipios con sus códigos */ getMunicipalities(): Promise<any[]>; /** * Obtener la lista de provincias disponibles * @returns Lista de provincias */ getProvinces(): Promise<any[]>; /** * Obtener avisos meteorológicos para el día actual * @returns Avisos meteorológicos para hoy */ getAlertsToday(): Promise<any>; /** * Obtener avisos meteorológicos para el día siguiente * @returns Avisos meteorológicos para mañana */ getAlertsTomorrow(): Promise<any>; /** * Método privado para extraer la predicción de un día específico * @param data - Datos completos de la predicción * @param dayOffset - Offset del día (0: hoy, 1: mañana, 2: pasado mañana) * @returns Predicción simplificada para el día especificado */ private extractDayForecast; /** * Método privado para obtener el estado del cielo predominante durante el día * @param skyStates - Array de estados del cielo * @returns Valor del estado del cielo predominante */ private getPredominantSkyState; /** * Obtener todas las estaciones meteorológicas disponibles * @returns Lista de estaciones meteorológicas */ getWeatherStations(): Promise<WeatherStation[]>; /** * Normaliza coordenadas desde formato AEMET (ej: "394924N") a decimales * @param coord - Coordenada en formato AEMET * @returns - Coordenada en formato decimal */ private normalizeCoordinate; /** * Busca estaciones por nombre o provincia * @param query - Texto a buscar en el nombre o provincia de la estación * @returns Lista de estaciones filtradas */ searchWeatherStations(query: string): Promise<WeatherStation[]>; /** * Obtener valores climatológicos diarios para una estación y período específicos * @param params - Parámetros para obtener valores climatológicos * @returns Valores climatológicos diarios */ getClimateValues(params: ClimateValuesParams): Promise<ClimateValuesResponse>; /** * Obtener resumen climatológico para una estación y período * @param params - Parámetros para obtener valores climatológicos * @provincia - Nombre de la provincia autónoma para filtrar estaciones * @returns Resumen estadístico de los valores climatológicos */ getClimateSummaryByProvincia(params: ClimateValuesParams, provincia: string): Promise<any>; private calculateWindDirectionAverage; /** * Método auxiliar para calcular la media de un array de números * @param values - Array de valores numéricos * @returns Media aritmética o 0 si no hay valores */ private calculateAverage; /** * Método auxiliar para calcular la suma de un array de números * @param values - Array de valores numéricos * @returns Suma total o 0 si no hay valores */ private calculateSum; private normalizeProvince; /** * Obtener datos meteorológicos para una ubicación y hora específicas * @param latitud - Latitud de la ubicación * @param longitud - Longitud de la ubicación * @param municipalityCode - Código opcional del municipio (5 dígitos) * @returns Datos meteorológicos más cercanos a la ubicación y hora especificadas */ getWeatherByCoordinates(latitud: number, longitud: number, municipalityCode?: string): Promise<WeatherByCoordinatesResponse>; /** * Obtiene el código del municipio más cercano a las coordenadas dadas * @param latitud - Latitud del punto * @param longitud - Longitud del punto * @returns Código del municipio más cercano */ private getMunicipioCercano; /** * Calcula la distancia entre un punto y un municipio * @param latitud - Latitud del punto * @param longitud - Longitud del punto * @param codigoMunicipio - Código del municipio * @returns Distancia en kilómetros */ private calcularDistanciaMunicipio; /** * Calcular la distancia entre dos puntos geográficos usando la fórmula de Haversine * @param lat1 - Latitud del primer punto * @param lon1 - Longitud del primer punto * @param lat2 - Latitud del segundo punto * @param lon2 - Longitud del segundo punto * @returns Distancia en kilómetros */ private calcularDistancia; /** * Convertir grados a radianes * @param grados - Ángulo en grados * @returns Ángulo en radianes */ private toRad; /** * Obtiene los datos del periodo más cercano a la hora actual * @param data - Datos de predicción horaria * @returns Datos del periodo más cercano */ private getPeriodoMasCercano; /** * Obtener un resumen climatológico para una estación y período específicos * @param params - Parámetros para obtener valores climatológicos * @returns Resumen climatológico del período */ getClimateSummary(params: ClimateValuesParams): Promise<any>; /** * Obtener las alertas meteorológicas en formato GeoJSON * @returns Colección de alertas en formato GeoJSON */ getAlertsGeoJSON(): Promise<AlertsGeoJSON>; } export { AemetOptions, AlertsGeoJSON }; /** * Ejemplo de uso del nuevo endpoint de predicción horaria por municipio * * ```typescript * import { Aemet } from './aemet'; * * // Inicializar cliente con tu API key * const aemet = new Aemet('TU_API_KEY'); * * // Ejemplo 1: Obtener predicción horaria por municipio usando getClimateValues * async function ejemploPrediccionHoraria() { * try { * const params = { * startDate: '2023-09-01', * endDate: '2023-09-01', * municipalityCode: '28079' // Madrid * }; * * const resultado = await aemet.getClimateValues(params); * console.log('Datos de predicción horaria:', resultado); * console.log('Datos crudos para explorar la estructura:', resultado.rawData); * } catch (error) { * console.error('Error:', error); * } * } * * // Ejemplo 2: Obtener predicción horaria usando getWeatherByCoordinates con código de municipio * async function ejemploPrediccionPorCoordenadas() { * try { * // Las coordenadas se ignoran cuando se proporciona un código de municipio * const resultado = await aemet.getWeatherByCoordinates( * 40.4165, // latitud (se ignora si se proporciona municipalityCode) * -3.7026, // longitud (se ignora si se proporciona municipalityCode) * '28079' // Madrid * ); * * console.log('Datos meteorológicos:', resultado); * console.log('Datos crudos para explorar la estructura:', resultado.rawData); * } catch (error) { * console.error('Error:', error); * } * } * * // Ejecutar ejemplos * ejemploPrediccionHoraria(); * ejemploPrediccionPorCoordenadas(); * ``` */ /** * Ejemplo de uso del nuevo método para obtener alertas en formato GeoJSON * * ```typescript * import { Aemet, AlertsGeoJSON } from './aemet'; * import * as fs from 'fs'; * * // Inicializar cliente con tu API key * const aemet = new Aemet('TU_API_KEY'); * * // Obtener alertas meteorológicas en formato GeoJSON * async function obtenerAlertasGeoJSON() { * try { * const alertas: AlertsGeoJSON = await aemet.getAlertsGeoJSON(); * * console.log(`Se encontraron ${alertas.features.length} alertas meteorológicas`); * * // Guardar el resultado en un archivo para visualizarlo en un visor GeoJSON * fs.writeFileSync('alertas.geojson', JSON.stringify(alertas, null, 2)); * * // Mostrar información sobre las alertas * alertas.features.forEach((feature, index) => { * console.log(`Alerta ${index + 1}:`); * console.log(` Nivel: ${feature.properties.nivel}`); * console.log(` Fenómeno: ${feature.properties.fenomeno}`); * console.log(` Descripción: ${feature.properties.descripcion}`); * console.log(` Probabilidad: ${feature.properties.probabilidad}`); * console.log(` Inicio: ${feature.properties.onset}`); * console.log(` Fin: ${feature.properties.expires}`); * console.log(` Número de puntos en el polígono: ${feature.geometry.coordinates[0].length}`); * console.log(''); * }); * * // Filtrar alertas de nivel naranja o rojo * const alertasImportantes = alertas.features.filter( * feature => ['naranja', 'rojo'].includes(feature.properties.nivel) * ); * * console.log(`Hay ${alertasImportantes.length} alertas de nivel naranja o rojo`); * * } catch (error) { * console.error('Error:', error); * } * } * * // Ejecutar ejemplo * obtenerAlertasGeoJSON(); * ``` */