Skip to main content

Python library for accessing IMGW (Polish Institute of Meteorology and Water Management) public data

Project description

IMGWTools - Narzędzie do pobierania danych IMGW

Biblioteka Python i narzędzia do pobierania danych publicznych z Instytutu Meteorologii i Gospodarki Wodnej (IMGW-PIB). Dane pochodzą z serwisu IMGW Dane Publiczne.

Obsługuje również dane z modeli probabilistycznych opadów maksymalnych (PMAXTP) z serwisu IMGW Klimat.


Funkcjonalności

  • Biblioteka Python - pip install imgwtools do integracji z innymi projektami
  • CLI - narzędzie linii poleceń do pobierania danych
  • REST API - FastAPI z dokumentacją OpenAPI/Swagger
  • Web GUI - interfejs webowy z mapą interaktywną

Obsługiwane dane:

  • Aktualne dane meteorologiczne i hydrologiczne przez API IMGW
  • Historyczne dane archiwalne (ZIP/CSV)
  • Ostrzeżenia hydrologiczne i meteorologiczne
  • Dane PMAXTP (opady maksymalne prawdopodobne)
  • Lista stacji z koordynatami

Kluczowa zasada: Dane NIE są przechowywane na serwerze (domyślnie) - generowane są bezpośrednie linki do serwerów IMGW.

Opcjonalne cache'owanie (dane hydrologiczne):

  • SQLite database dla danych historycznych
  • Lazy loading - dane pobierane przy pierwszym zapytaniu
  • Włączane przez IMGW_DB_ENABLED=true

Instalacja

# Tylko biblioteka (minimalne zależności: httpx, pydantic)
pip install imgwtools

# Z CLI
pip install imgwtools[cli]

# Z REST API
pip install imgwtools[api]

# Pełna instalacja (CLI + API + DB + spatial)
pip install imgwtools[full]

# Dla deweloperów (z repozytorium)
git clone https://github.com/Daldek/IMGWTools.git
cd IMGWTools
pip install -e ".[dev]"

Użycie jako biblioteka Python

IMGWTools można używać jako biblioteki w innych projektach Python (np. HydroLOG).

Dane PMAXTP (opady maksymalne prawdopodobne)

from imgwtools import fetch_pmaxtp

# Pobierz dane dla Warszawy
result = fetch_pmaxtp(latitude=52.23, longitude=21.01, method="POT")

# Opad 15-minutowy z prawdopodobieństwem 50%
precip = result.data.get_precipitation(15, 50)
print(f"Opad 15-min, p=50%: {precip} mm")  # 13.34 mm

# Dostępne czasy trwania: 5, 10, 15, 30, 45, 60, 90, 120, 180... minut
# Dostępne prawdopodobieństwa: 1, 2, 5, 10, 20, 50... %

Aktualne dane hydrologiczne

from imgwtools import fetch_hydro_current

# Wszystkie stacje
stations = fetch_hydro_current()
print(f"Liczba stacji: {len(stations)}")

# Konkretna stacja
data = fetch_hydro_current(station_id="150160180")
print(f"Stan wody: {data[0].water_level_cm} cm")

Aktualne dane synoptyczne

from imgwtools import fetch_synop

# Wszystkie stacje synoptyczne
stations = fetch_synop()

# Po nazwie
warszawa = fetch_synop(station_name="Warszawa")
print(f"Temperatura: {warszawa[0].temperature_c}°C")

Lista stacji z koordynatami

from imgwtools import get_hydro_stations_with_coords

# Pobierz stacje z API hydro-back.imgw.pl
stations = get_hydro_stations_with_coords()
print(f"Liczba stacji: {len(stations)}")

# Filtruj stacje w stanie alarmowym
alarmed = [s for s in stations if s.water_state == "alarm"]
for s in alarmed:
    print(f"{s.name}: {s.latitude}, {s.longitude}")

Pobieranie danych archiwalnych

from imgwtools import download_hydro_data, parse_zip_file

# Pobierz dane dobowe za 2023 rok
zip_data = download_hydro_data("dobowe", 2023)

# Parsuj dane
for station, record in parse_zip_file(zip_data, "dobowe"):
    print(f"{station.name}: {record.water_level_cm} cm ({record.measurement_date})")

Wersja asynchroniczna

import asyncio
from imgwtools import fetch_pmaxtp_async, fetch_hydro_current_async

async def main():
    # Równoległe zapytania
    pmaxtp, hydro = await asyncio.gather(
        fetch_pmaxtp_async(52.23, 21.01),
        fetch_hydro_current_async()
    )
    print(f"PMAXTP: {pmaxtp.data.get_precipitation(15, 50)} mm")
    print(f"Stacje hydro: {len(hydro)}")

asyncio.run(main())

Obsługa błędów

from imgwtools import fetch_pmaxtp, IMGWConnectionError, IMGWValidationError

try:
    result = fetch_pmaxtp(52.23, 21.01)
except IMGWValidationError as e:
    print(f"Błąd walidacji: {e}")  # np. koordynaty poza Polską
except IMGWConnectionError as e:
    print(f"Błąd połączenia: {e}")  # np. timeout, błąd serwera

Szybki start (CLI)

# Uruchom serwer API
imgw server --reload

# Pobierz dane hydrologiczne
imgw fetch hydro -i dobowe -y 2023

# Pobierz dane meteorologiczne
imgw fetch meteo -i miesieczne -s synop -y 2020-2023

# Pobierz aktualne dane z API
imgw fetch current hydro

# Pobierz dane PMAXTP
imgw fetch pmaxtp --lat 52.23 --lon 21.01

# Lista stacji
imgw list stations --type hydro

# Cache danych (wymaga IMGW_DB_ENABLED=true)
imgw db init                                   # Inicjalizacja bazy
imgw db stations --refresh                     # Pobranie listy stacji
imgw db cache --years 2020-2023 -i dobowe      # Cache danych dobowych
imgw db query -s 149180020 -y 2023 -i dobowe   # Zapytanie o dane

REST API

Po uruchomieniu serwera (imgw server):

Przykłady:

# Aktualne dane hydrologiczne
curl http://localhost:8000/api/v1/hydro/current

# Generuj URL do pobrania danych
curl "http://localhost:8000/api/v1/download/url?data_type=hydro&interval=dobowe&year=2023"

Web GUI

Po uruchomieniu serwera dostępne pod http://localhost:8000:

  • / - Dashboard
  • /download - Formularze pobierania danych
  • /stations - Lista stacji (dane pobierane z CSV IMGW)
  • /map - Mapa interaktywna (dane z API IMGW)

Każda stacja ma link do oficjalnej strony IMGW: https://hydro.imgw.pl/#/station/{type}/{id}


Struktura danych IMGW

Dane hydrologiczne (1951-obecnie)

  • dobowe: pliki miesięczne (przed 2023) lub roczne (od 2023)
  • miesieczne: pliki roczne
  • polroczne_i_roczne: pliki roczne z parametrami T, Q, H

Dane meteorologiczne (1951-obecnie)

  • 1951-2000: foldery 5-letnie, pliki roczne
  • 2001+: foldery roczne, pliki miesięczne
  • Podtypy: klimat, opad, synop

Źródła danych stacji

  • Lista stacji hydro: CSV z danepubliczne.imgw.pl (kodowanie CP1250)
  • Lista stacji meteo: CSV z danepubliczne.imgw.pl (kodowanie CP1250)
  • Współrzędne dla mapy: API danepubliczne.imgw.pl/api/data/hydro

Struktura projektu

src/imgwtools/
├── api/          # REST API (FastAPI)
├── cli/          # Narzędzie CLI (Typer)
├── core/         # Logika biznesowa
│   └── url_builder.py  # Generowanie URL-i
├── db/           # Cache SQLite (opcjonalny)
│   ├── cache_manager.py  # Lazy loading
│   ├── repository.py     # Warstwa dostępu do danych
│   └── parsers.py        # Parsery CSV z ZIP
├── web/          # Web GUI (HTMX + Jinja2)
└── config.py     # Konfiguracja

data/             # Metadane + baza SQLite (gdy włączona)
docker/           # Konfiguracja Docker
tests/            # Testy

Docker

cd docker
docker-compose up -d

Cache bazy danych (opcjonalny)

Dla częstych zapytań o dane historyczne można włączyć lokalną bazę SQLite.

Konfiguracja

# W pliku .env lub zmiennych środowiskowych
IMGW_DB_ENABLED=true
IMGW_DB_PATH=./data/imgw_hydro.db  # domyślna ścieżka

Użycie

# Inicjalizacja bazy
imgw db init

# Pobranie listy stacji (1300+ stacji)
imgw db stations --refresh

# Cache danych dla zakresu lat
imgw db cache --years 2020-2023 --interval dobowe

# Zapytanie o dane dla stacji
imgw db query --station 149180020 --years 2020-2023 --interval dobowe

# Export do CSV
imgw db query --station 149180020 --years 2023 --output dane.csv

# Status bazy (rozmiar, liczba rekordów)
imgw db status

# Optymalizacja bazy
imgw db vacuum

Obsługiwane interwały

Interwał Opis Parametry
dobowe Dane dzienne -
miesieczne Dane miesięczne (min/mean/max) -
polroczne Dane półroczne/roczne --param H/Q/T

Lazy loading

Dane są automatycznie pobierane z IMGW przy pierwszym zapytaniu i cache'owane lokalnie. Kolejne zapytania korzystają z cache.


Testy

Projekt zawiera kompleksowe testy jednostkowe dla publicznego API.

Uruchamianie testów

# Wszystkie testy
pytest

# Z pokryciem kodu
pytest --cov=imgwtools

# Verbose
pytest -v

Struktura testów

tests/
├── conftest.py              # Wspólne fixtures
├── unit/
│   ├── test_models.py       # Modele danych (17 testów)
│   ├── test_fetch.py        # Funkcje pobierania (19 testów)
│   ├── test_stations.py     # Funkcje stacji (17 testów)
│   └── test_urls.py         # Budowanie URL-i (22 testy)
└── integration/             # Testy integracyjne (TODO)

Pokrycie

Moduł Pokrycie
models.py 89%
exceptions.py 100%
urls.py 100%
stations.py 59%
fetch.py 45%

Łącznie: 75 testów


Dokumentacja

  • CLAUDE.md - Instrukcje dla Claude Code
  • ARCHITECTURE.md - Architektura systemu
  • PRD.md - Wymagania produktu

Problemy i wsparcie

Zgłoś problemy w sekcji Issues.


Licencja

Projekt udostępniony na licencji MIT. Szczegóły w pliku LICENSE.


Autor

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

imgwtools-2.0.1.tar.gz (1.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

imgwtools-2.0.1-py3-none-any.whl (90.2 kB view details)

Uploaded Python 3

File details

Details for the file imgwtools-2.0.1.tar.gz.

File metadata

  • Download URL: imgwtools-2.0.1.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for imgwtools-2.0.1.tar.gz
Algorithm Hash digest
SHA256 5ecf3b38b33ece9a76317802e0ed267a00252a8db604ef6abfaf53a255103dc4
MD5 a014d0a39128f23e4dfb25c0078855f1
BLAKE2b-256 51b9d935ac6fc383c5629dee15634d7b0e746ebfac8a9fc56ff5d0a441723fbe

See more details on using hashes here.

File details

Details for the file imgwtools-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: imgwtools-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 90.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for imgwtools-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c53f55faf2c9cb320f601312e5ded25d03877e196370e2f9244aa0d45293ddc4
MD5 056c153463fcfcb3884970f43f4f3fc9
BLAKE2b-256 ebb4450976cd03cabaa4f7700aadaa0381f78534df2d49f1e067d666b1e72dde

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page