From c787f2d04f5a029f58e0bdac2b9d9b33d3042575 Mon Sep 17 00:00:00 2001 From: patrick-zippenfenig Date: Wed, 1 Nov 2023 10:10:41 +0100 Subject: [PATCH] fix: better example --- README.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 42e2272..d2cb595 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,13 @@ This ia an API client to get weather data from the [Open-Meteo Weather API](http Instead of using JSON, the API client uses FlatBuffers to transfer data. Encoding data in FlatBuffers is more efficient for long time-series data. The schema definition files can be found on [GitHub open-meteo/sdk](https://github.com/open-meteo/sdk). +Features: +- Simple access to weather data +- Get weather data for multiple locations in one call +- Automatic retry on error +- Reduced bandwidth and fast parsing using FlatBuffers and Zero Copy +- Type annotated + ## Install ```bash @@ -25,17 +32,61 @@ import { fetchWeatherApi } from 'openmeteo'; const params = { latitude: [52.54], longitude: [13.41], - hourly: ['temperature_2m', 'precipitation'], + current: 'temperature_2m,weather_code,wind_speed_10m,wind_direction_10m', + hourly: 'temperature_2m,precipitation', + daily: 'weather_code,temperature_2m_max,temperature_2m_min' }; const url = 'https://api.open-meteo.com/v1/forecast'; const responses = await fetchWeatherApi(url, params); +// Helper function to form time range +export const range = (start: number, stop: number, step: number) => + Array.from({ length: (stop - start) / step }, (_, i) => start + i * step); + // Process first location. Add a for-loop for multiple locations or weather models const response = responses[0]; +// Attributes for timezone and location +const utcOffsetSeconds = response.utcOffsetSeconds(); +const timezone = response.timezone(); +const timezoneAbbreviation = response.timezoneAbbreviation(); +const latitude = response.latitude(); +const longitude = response.longitude(); + +const current = response.current()!; const hourly = response.hourly()!; -const temperature_2m = hourly.variables(0)!.valuesArray(); -const precipitation = hourly.variables(1)!.valuesArray(); +const daily = response.daily()!; + +// Note: The order of weather variables in the URL query and the indices below need to match! +const weatherData = { + current: { + time: new Date((Number(current.time()) + utcOffsetSeconds) * 1000), + temperature: current.variables(0)!.value(), // Current is only 1 value, therefore `.value()` + weatherCode: current.variables(1)!.value(), + windSpeed: current.variables(2)!.value(), + windDirection: current.variables(3)!.value() + }, + hourly: { + time: range(Number(hourly.time()), Number(hourly.timeEnd()), hourly.interval()).map( + (t) => new Date((t + utcOffsetSeconds) * 1000) + ), + temperature: hourly.variables(0)!.valuesArray()!, // `.valuesArray()` get an array of floats + precipitation: hourly.variables(1)!.valuesArray()!, + }, + daily: { + time: range(Number(daily.time()), Number(daily.timeEnd()), daily.interval()).map( + (t) => new Date((t + utcOffsetSeconds) * 1000) + ), + weatherCode: daily.variables(0)!.valuesArray()!, + temperatureMax: daily.variables(1)!.valuesArray()!, + temperatureMin: daily.variables(2)!.valuesArray()!, + } +}; + +// `weatherData` now contains a simple structure with arrays for datetime and weather data +for (let i = 0; i < daily.time.length; i++) { + console.log(daily.time[i].toISOString(), daily.weatherCode[i], daily.temperatureMax[i], daily.temperatureMin[i]); +} ```