Skip to content

Commit

Permalink
fix: better example
Browse files Browse the repository at this point in the history
  • Loading branch information
patrick-zippenfenig committed Nov 1, 2023
1 parent 7a37a8d commit c787f2d
Showing 1 changed file with 54 additions and 3 deletions.
57 changes: 54 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]);
}
```


Expand Down

0 comments on commit c787f2d

Please sign in to comment.