aemet-api
Version:
Cliente TypeScript para la API de AEMET (Agencia Estatal de Meteorología)
263 lines (262 loc) • 10.1 kB
TypeScript
/**
* 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();
* ```
*/