Skip to content

Instantly share code, notes, and snippets.

@Vindaar
Last active December 22, 2022 16:39
Show Gist options
  • Save Vindaar/1e50a8515e87058033de30b2ceb92fa5 to your computer and use it in GitHub Desktop.
Save Vindaar/1e50a8515e87058033de30b2ceb92fa5 to your computer and use it in GitHub Desktop.
Wind speed and angles linear interpolation
{"type":"Feature","geometry":{"type":"Point","coordinates":[18.9276,69.69,100]},"properties":{"meta":{"updated_at":"2022-12-22T14:42:02Z","units":{"air_pressure_at_sea_level":"hPa","air_temperature":"celsius","cloud_area_fraction":"%","precipitation_amount":"mm","relative_humidity":"%","wind_from_direction":"degrees","wind_speed":"m/s"}},"timeseries":[{"time":"2022-12-22T14:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":986.2,"air_temperature":-2.1,"cloud_area_fraction":86.7,"relative_humidity":81.6,"wind_from_direction":184.4,"wind_speed":6.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.2}}}},{"time":"2022-12-22T15:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":985.9,"air_temperature":-1.9,"cloud_area_fraction":84.9,"relative_humidity":80.7,"wind_from_direction":187.0,"wind_speed":6.8}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.9}}}},{"time":"2022-12-22T16:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":985.6,"air_temperature":-1.8,"cloud_area_fraction":91.0,"relative_humidity":81.9,"wind_from_direction":181.1,"wind_speed":5.7}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_night"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.7}}}},{"time":"2022-12-22T17:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":985.1,"air_temperature":-1.6,"cloud_area_fraction":93.2,"relative_humidity":82.4,"wind_from_direction":179.2,"wind_speed":5.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_night"}},"next_1_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":0.3}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.5}}}},{"time":"2022-12-22T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":984.7,"air_temperature":-1.4,"cloud_area_fraction":99.8,"relative_humidity":82.7,"wind_from_direction":178.0,"wind_speed":6.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_night"}},"next_1_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":0.6}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.2}}}},{"time":"2022-12-22T19:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":984.0,"air_temperature":-1.3,"cloud_area_fraction":97.4,"relative_humidity":82.0,"wind_from_direction":177.1,"wind_speed":6.5}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_night"}},"next_1_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":0.3}},"next_6_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.7}}}},{"time":"2022-12-22T20:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.8,"air_temperature":-1.0,"cloud_area_fraction":99.3,"relative_humidity":82.2,"wind_from_direction":181.7,"wind_speed":7.5}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-22T21:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.9,"air_temperature":-1.0,"cloud_area_fraction":81.3,"relative_humidity":82.2,"wind_from_direction":187.6,"wind_speed":7.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-22T22:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":984.0,"air_temperature":-1.1,"cloud_area_fraction":39.9,"relative_humidity":83.1,"wind_from_direction":181.6,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-22T23:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.8,"air_temperature":-1.7,"cloud_area_fraction":26.3,"relative_humidity":84.8,"wind_from_direction":177.2,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.6,"air_temperature":-3.0,"cloud_area_fraction":34.1,"relative_humidity":87.8,"wind_from_direction":183.7,"wind_speed":2.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T01:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.5,"air_temperature":-3.4,"cloud_area_fraction":35.2,"relative_humidity":91.3,"wind_from_direction":220.6,"wind_speed":1.9}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T02:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.4,"air_temperature":-3.5,"cloud_area_fraction":28.8,"relative_humidity":88.6,"wind_from_direction":172.0,"wind_speed":1.8}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T03:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.0,"air_temperature":-4.0,"cloud_area_fraction":32.5,"relative_humidity":85.1,"wind_from_direction":146.1,"wind_speed":0.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T04:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.8,"air_temperature":-3.6,"cloud_area_fraction":73.7,"relative_humidity":80.9,"wind_from_direction":151.5,"wind_speed":0.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T05:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.1,"air_temperature":-2.5,"cloud_area_fraction":84.9,"relative_humidity":88.6,"wind_from_direction":6.2,"wind_speed":1.5}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":981.8,"air_temperature":-1.9,"cloud_area_fraction":85.9,"relative_humidity":87.4,"wind_from_direction":14.2,"wind_speed":3.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T07:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":981.9,"air_temperature":-1.2,"cloud_area_fraction":94.4,"relative_humidity":84.6,"wind_from_direction":20.1,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T08:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.1,"air_temperature":-1.1,"cloud_area_fraction":97.1,"relative_humidity":82.8,"wind_from_direction":9.2,"wind_speed":2.7}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_night"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T09:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.3,"air_temperature":-1.4,"cloud_area_fraction":96.6,"relative_humidity":84.0,"wind_from_direction":17.5,"wind_speed":2.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T10:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.4,"air_temperature":-1.7,"cloud_area_fraction":94.8,"relative_humidity":84.6,"wind_from_direction":11.3,"wind_speed":2.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T11:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.4,"air_temperature":-2.0,"cloud_area_fraction":82.4,"relative_humidity":86.3,"wind_from_direction":8.2,"wind_speed":2.6}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_polartwilight"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.4,"air_temperature":-2.7,"cloud_area_fraction":72.9,"relative_humidity":85.1,"wind_from_direction":4.0,"wind_speed":2.3}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_polartwilight"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-23T13:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.6,"air_temperature":-2.9,"cloud_area_fraction":71.8,"relative_humidity":80.8,"wind_from_direction":2.9,"wind_speed":1.8}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_polartwilight"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnowshowers_polartwilight"},"details":{"precipitation_amount":0.7}}}},{"time":"2022-12-23T14:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.9,"air_temperature":-3.6,"cloud_area_fraction":33.8,"relative_humidity":79.9,"wind_from_direction":37.8,"wind_speed":1.4}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.8}}}},{"time":"2022-12-23T15:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.1,"air_temperature":-5.0,"cloud_area_fraction":12.8,"relative_humidity":79.4,"wind_from_direction":137.1,"wind_speed":1.6}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.9}}}},{"time":"2022-12-23T16:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.1,"air_temperature":-5.9,"cloud_area_fraction":15.7,"relative_humidity":86.0,"wind_from_direction":155.1,"wind_speed":1.6}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.1}}}},{"time":"2022-12-23T17:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.9,"air_temperature":-6.3,"cloud_area_fraction":7.8,"relative_humidity":88.6,"wind_from_direction":190.2,"wind_speed":1.8}},"next_12_hours":{"summary":{"symbol_code":"lightsnowshowers_day"}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.2}}}},{"time":"2022-12-23T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":982.8,"air_temperature":-6.4,"cloud_area_fraction":8.4,"relative_humidity":88.3,"wind_from_direction":206.3,"wind_speed":2.1}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"snowshowers_night"},"details":{"precipitation_amount":1.2}}}},{"time":"2022-12-23T19:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.0,"air_temperature":-6.1,"cloud_area_fraction":23.5,"relative_humidity":90.9,"wind_from_direction":206.1,"wind_speed":2.8}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.6}}}},{"time":"2022-12-23T20:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.0,"air_temperature":-5.0,"cloud_area_fraction":58.3,"relative_humidity":89.4,"wind_from_direction":202.4,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnowshowers_night"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.7}}}},{"time":"2022-12-23T21:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.1,"air_temperature":-4.1,"cloud_area_fraction":91.9,"relative_humidity":89.1,"wind_from_direction":207.9,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.7}}}},{"time":"2022-12-23T22:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.3,"air_temperature":-2.7,"cloud_area_fraction":99.8,"relative_humidity":85.8,"wind_from_direction":203.7,"wind_speed":3.7}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.6}}}},{"time":"2022-12-23T23:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.5,"air_temperature":-1.5,"cloud_area_fraction":100.0,"relative_humidity":83.0,"wind_from_direction":196.5,"wind_speed":3.8}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.5}}}},{"time":"2022-12-24T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":983.8,"air_temperature":-1.2,"cloud_area_fraction":100.0,"relative_humidity":83.4,"wind_from_direction":198.7,"wind_speed":2.8}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.1}}}},{"time":"2022-12-24T01:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":984.3,"air_temperature":-1.5,"cloud_area_fraction":99.9,"relative_humidity":85.7,"wind_from_direction":222.3,"wind_speed":1.7}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.2}}}},{"time":"2022-12-24T02:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":984.8,"air_temperature":-1.6,"cloud_area_fraction":97.3,"relative_humidity":88.0,"wind_from_direction":242.6,"wind_speed":1.1}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.3}}}},{"time":"2022-12-24T03:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":985.4,"air_temperature":-2.1,"cloud_area_fraction":97.9,"relative_humidity":88.6,"wind_from_direction":232.5,"wind_speed":1.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":1.3}}}},{"time":"2022-12-24T04:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":986.0,"air_temperature":-2.5,"cloud_area_fraction":99.0,"relative_humidity":88.0,"wind_from_direction":49.9,"wind_speed":1.5}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.8}}}},{"time":"2022-12-24T05:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":986.5,"air_temperature":-2.1,"cloud_area_fraction":99.3,"relative_humidity":86.7,"wind_from_direction":112.0,"wind_speed":1.3}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.1}}}},{"time":"2022-12-24T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":987.1,"air_temperature":-1.6,"cloud_area_fraction":99.2,"relative_humidity":85.8,"wind_from_direction":127.1,"wind_speed":1.9}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.4}}}},{"time":"2022-12-24T07:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":987.6,"air_temperature":-1.6,"cloud_area_fraction":92.9,"relative_humidity":83.8,"wind_from_direction":164.5,"wind_speed":1.2}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.4}}}},{"time":"2022-12-24T08:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":988.0,"air_temperature":-1.4,"cloud_area_fraction":98.9,"relative_humidity":85.5,"wind_from_direction":184.4,"wind_speed":2.4}},"next_1_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":0.4}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.3}}}},{"time":"2022-12-24T09:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":988.5,"air_temperature":-0.8,"cloud_area_fraction":100.0,"relative_humidity":90.5,"wind_from_direction":184.3,"wind_speed":3.5}},"next_1_hours":{"summary":{"symbol_code":"heavysnow"},"details":{"precipitation_amount":1.0}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.8}}}},{"time":"2022-12-24T10:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":989.5,"air_temperature":-0.7,"cloud_area_fraction":99.4,"relative_humidity":92.8,"wind_from_direction":189.1,"wind_speed":1.9}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.9}}}},{"time":"2022-12-24T11:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":990.1,"air_temperature":-0.7,"cloud_area_fraction":97.4,"relative_humidity":94.6,"wind_from_direction":191.5,"wind_speed":3.4}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.7}}}},{"time":"2022-12-24T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":991.0,"air_temperature":-0.6,"cloud_area_fraction":98.6,"relative_humidity":94.2,"wind_from_direction":198.4,"wind_speed":1.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.6}}}},{"time":"2022-12-24T13:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":991.9,"air_temperature":-0.7,"cloud_area_fraction":93.1,"relative_humidity":95.5,"wind_from_direction":194.8,"wind_speed":1.5}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-24T14:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":992.8,"air_temperature":-1.4,"cloud_area_fraction":87.1,"relative_humidity":92.6,"wind_from_direction":185.2,"wind_speed":0.6}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-24T15:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":993.8,"air_temperature":-1.3,"cloud_area_fraction":87.9,"relative_humidity":88.2,"wind_from_direction":54.6,"wind_speed":1.7}},"next_1_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.1}}}},{"time":"2022-12-24T16:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.7,"air_temperature":-0.2,"cloud_area_fraction":96.4,"relative_humidity":87.5,"wind_from_direction":358.8,"wind_speed":5.8}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-24T17:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":995.3,"air_temperature":0.2,"cloud_area_fraction":96.5,"relative_humidity":86.5,"wind_from_direction":30.0,"wind_speed":2.9}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-24T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":995.8,"air_temperature":0.0,"cloud_area_fraction":98.8,"relative_humidity":87.8,"wind_from_direction":354.1,"wind_speed":4.6}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-25T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1003.5,"air_temperature":-0.7,"cloud_area_fraction":99.2,"relative_humidity":85.5,"wind_from_direction":193.5,"wind_speed":2.1}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.5}}}},{"time":"2022-12-25T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1004.7,"air_temperature":-0.4,"cloud_area_fraction":100.0,"relative_humidity":86.8,"wind_from_direction":171.2,"wind_speed":2.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-25T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1008.5,"air_temperature":-0.7,"cloud_area_fraction":98.8,"relative_humidity":84.1,"wind_from_direction":163.5,"wind_speed":3.8}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-25T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1012.2,"air_temperature":-2.7,"cloud_area_fraction":99.2,"relative_humidity":83.9,"wind_from_direction":131.7,"wind_speed":3.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-26T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1009.8,"air_temperature":-4.0,"cloud_area_fraction":100.0,"relative_humidity":81.2,"wind_from_direction":125.6,"wind_speed":2.8}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-26T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1003.4,"air_temperature":-4.6,"cloud_area_fraction":100.0,"relative_humidity":78.3,"wind_from_direction":130.1,"wind_speed":4.0}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-26T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1002.1,"air_temperature":-4.3,"cloud_area_fraction":100.0,"relative_humidity":77.5,"wind_from_direction":135.8,"wind_speed":4.3}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-26T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":999.4,"air_temperature":-4.1,"cloud_area_fraction":100.0,"relative_humidity":78.6,"wind_from_direction":134.0,"wind_speed":4.0}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-27T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":999.4,"air_temperature":-4.5,"cloud_area_fraction":93.0,"relative_humidity":80.0,"wind_from_direction":132.5,"wind_speed":4.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-27T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":996.8,"air_temperature":-4.6,"cloud_area_fraction":91.4,"relative_humidity":79.2,"wind_from_direction":128.7,"wind_speed":4.1}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-27T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":996.0,"air_temperature":-1.2,"cloud_area_fraction":100.0,"relative_humidity":80.9,"wind_from_direction":143.8,"wind_speed":4.8}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-27T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":997.7,"air_temperature":-1.5,"cloud_area_fraction":100.0,"relative_humidity":80.8,"wind_from_direction":149.2,"wind_speed":4.6}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-28T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":997.0,"air_temperature":-2.0,"cloud_area_fraction":100.0,"relative_humidity":81.6,"wind_from_direction":152.8,"wind_speed":4.7}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"lightsnow"},"details":{"precipitation_amount":0.5}}}},{"time":"2022-12-28T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":997.3,"air_temperature":-1.5,"cloud_area_fraction":100.0,"relative_humidity":86.3,"wind_from_direction":177.5,"wind_speed":4.8}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-28T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.8,"air_temperature":-2.4,"cloud_area_fraction":99.2,"relative_humidity":78.8,"wind_from_direction":133.0,"wind_speed":5.2}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-28T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":988.4,"air_temperature":-2.4,"cloud_area_fraction":100.0,"relative_humidity":79.5,"wind_from_direction":141.5,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-29T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":987.5,"air_temperature":-1.3,"cloud_area_fraction":100.0,"relative_humidity":80.3,"wind_from_direction":144.3,"wind_speed":4.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-29T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":991.8,"air_temperature":-2.6,"cloud_area_fraction":96.5,"relative_humidity":78.7,"wind_from_direction":146.7,"wind_speed":4.2}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-29T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":987.1,"air_temperature":-0.1,"cloud_area_fraction":100.0,"relative_humidity":82.2,"wind_from_direction":148.9,"wind_speed":5.2}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-29T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":988.7,"air_temperature":-0.2,"cloud_area_fraction":100.0,"relative_humidity":83.2,"wind_from_direction":146.2,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_6_hours":{"summary":{"symbol_code":"heavysnow"},"details":{"precipitation_amount":5.2}}}},{"time":"2022-12-30T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":989.9,"air_temperature":-0.2,"cloud_area_fraction":100.0,"relative_humidity":84.8,"wind_from_direction":194.2,"wind_speed":3.7}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":2.0}}}},{"time":"2022-12-30T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.7,"air_temperature":-0.5,"cloud_area_fraction":100.0,"relative_humidity":82.9,"wind_from_direction":211.3,"wind_speed":5.2}},"next_12_hours":{"summary":{"symbol_code":"cloudy"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-30T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.1,"air_temperature":-0.1,"cloud_area_fraction":90.6,"relative_humidity":79.7,"wind_from_direction":146.8,"wind_speed":4.3}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-30T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":990.7,"air_temperature":-1.1,"cloud_area_fraction":100.0,"relative_humidity":83.4,"wind_from_direction":155.6,"wind_speed":4.8}},"next_12_hours":{"summary":{"symbol_code":"snow"}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.4}}}},{"time":"2022-12-31T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":990.4,"air_temperature":0.0,"cloud_area_fraction":100.0,"relative_humidity":83.1,"wind_from_direction":228.9,"wind_speed":5.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.6}}}},{"time":"2022-12-31T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.0,"air_temperature":0.0,"cloud_area_fraction":100.0,"relative_humidity":85.0,"wind_from_direction":229.8,"wind_speed":4.2}},"next_12_hours":{"summary":{"symbol_code":"lightsnow"}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2022-12-31T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":996.8,"air_temperature":0.0,"cloud_area_fraction":100.0,"relative_humidity":83.3,"wind_from_direction":149.8,"wind_speed":4.6}},"next_6_hours":{"summary":{"symbol_code":"snow"},"details":{"precipitation_amount":1.6}}}},{"time":"2022-12-31T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":998.9,"air_temperature":0.7,"cloud_area_fraction":100.0,"relative_humidity":87.0,"wind_from_direction":231.8,"wind_speed":5.5}}}}]}}
import ggplotnim, unchained, sequtils, numericalnim, ginger
import std / [json, times, math]
# Weather data from:
# https://api.met.no/weatherapi/locationforecast/2.0/#!/data/get_compact
# for altitude: 100
# and lat/long: 69.6899724,18.9276432
proc toCartesian(winds: seq[m•s⁻¹], angles: seq[Degree]): (seq[float], seq[float]) =
# treat (wind, angle) as polar coordinates and convert to cartesian
result[0] = newSeq[float](winds.len)
result[1] = newSeq[float](winds.len)
for i in 0 ..< winds.len:
result[0][i] = winds[i].float * cos(angles[i].to(Radian).float)
result[1][i] = winds[i].float * sin(angles[i].to(Radian).float)
proc toPolar(xs, ys: seq[float]): (seq[m•s⁻¹], seq[Degree]) =
# convert our cartesian back to (wind, angle) pairs
result[0] = newSeq[m•s⁻¹](xs.len)
result[1] = newSeq[Degree](xs.len)
for i in 0 ..< result[0].len:
let
x = xs[i]
y = ys[i]
result[0][i] = sqrt( x*x + y*y ).m•s⁻¹
let deg = arctan2(y, x).Radian.to(Degree)
if deg < 0.0: # fix up mismatch between arctan return in -π to π -> 0 to 2π
result[1][i] = 360.° + deg
else:
result[1][i] = deg
proc plotWind(winds, wFine: seq[m•s⁻¹], angles, aFine: seq[Degree],
ts, tgrid: seq[float]) =
# remove units, ggplotnim currently no support yet :(
proc stripUnits[T](s: seq[T]): seq[float] = s.mapIt(it.float)
# DF for the original data
let df = toDf({ "time" : ts,
"wind" : winds.stripUnits(),
"angles" : angles.stripUnits() })
# DF for the interpolated data
let dfF = toDf({ "time" : tgrid,
"wind" : wFine.stripUnits(),
"angles" : aFine.stripUnits() })
# first plot: time against wind, colored by angle
ggplot(df, aes("time", "wind", color = "angles")) +
geom_point() + # original as points
geom_line(data = dfF) + # draw interpolated as a line
scale_x_date(isTimestamp = true,
formatString = "YYYY-MM-dd HH:mm",
dateSpacing = initDuration(days = 1),
dateAlgo = dtaAddDuration) +
xlab("time", margin = 3.0, rotate = -45.0, alignTo = "right") +
margin(bottom = 3.5) +
ggsave("/tmp/weather_wind.pdf", width = 800, height = 600)
# second plot: time against angles, colored by wind
ggplot(df, aes("time", "angles", color = "wind")) +
geom_point() +
geom_line(data = dfF) +
scale_x_date(isTimestamp = true,
formatString = "YYYY-MM-dd HH:mm",
dateSpacing = initDuration(days = 1),
dateAlgo = dtaAddDuration) +
xlab("time", margin = 3.0, rotate = -45.0, alignTo = "right") +
margin(bottom = 3.5) +
ggsave("/tmp/weather_angles.pdf", width = 800, height = 600)
# parse all data
let data = parseJson(readFile("/tmp/weather.json"))
let ar = data["properties"]["timeseries"]
var t = newSeq[float]()
var winds = newSeq[m•s⁻¹]()
var angles = newSeq[Degree]()
for x in ar:
let el = x["time"].getStr.parseTime("YYYY-MM-dd'T'HH:mm:ss'Z'", local()).toUnix.float
t.add el
echo x
winds.add x["data"]["instant"]["details"]["wind_speed"].getFloat.m•s⁻¹
angles.add x["data"]["instant"]["details"]["wind_from_direction"].getFloat.°
# convert wind & angle data to polar
let (xs, ys) = toCartesian(winds, angles)
# interpolate each independently using 1D
let xInterp = newLinear1D(t, xs)
let yInterp = newLinear1D(t, ys)
# on a 1000 element time grid
let tgrid = linspace(t[0], t[^1], 1000)
# do actual interpolation
let xfine = tgrid.mapIt(xInterp.eval(it))
let yfine = tgrid.mapIt(yInterp.eval(it))
# and back to polar
let (wFine, aFine) = toPolar(xfine, yfine)
# plot it
plotWind(winds, wFine, angles, aFine, t, tgrid)
@Vindaar
Copy link
Author

Vindaar commented Dec 22, 2022

weather_wind

weather_angles

@Vindaar
Copy link
Author

Vindaar commented Dec 22, 2022

Why is gist too stupid to keep the files in at the top in the order I want?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment