Skip to main content

logo

ocactivity-gen je python nástroj a konzolová aplikace pro generování estetických grafických kartogramů a vizualizací sportovních aktivit (běh, chůze, turistika, cyklistika apod.).

Dokáže zpracovat soubory Garmin FIT a GPX, extrahovat z nich metriky (vzdálenost, čas, tempo, rychlost, stoupání, klesání, tep, teplotu, kalorie, kroky) a vykreslit trasy na mapové podklady z OpenStreetMap / Mapy.com nebo jiné společně s výškovým profilem a statistikami.

Testováno na Garmin FIT souborech z hodinek, ale mělo by to fungovat i od jiných. Jen pozor na to, že ne každý FIT soubor obsahuje všechny informace. Takže výsledek se může lišit.

V případě vlastní implementace jde hodně věcí přizpůsobit na míru, ale ve výchozím nastavení jsou obrázky vždy 1440x1440 a mají levý zatmavený panel kam se vkládají statistiky.

donate
❤️ Poděkuj | Donate | Buy me a coffee ❤️


💪 Ukázky výstupu

out1 out2


🛠️ Hlavní funkce

  • Podpora Garmin FIT & GPX: Automatické vytěžování telemetrie, GPS trasy a časových dat.
  • Inteligentní vyhlazování GPX: Filtr GPS šumu pomocí 2D Kalmanova filtru.
  • Rychlá analýza dat: Adaptivní prahy pohybů a hysterézní filtr převýšení pro přesný výpočet stoupání a času v pohybu.
  • Generování výškového profilu: Graf nadmořské výšky se zvýrazněním nejnižšího a nejvyššího bodu.
  • Flexibilní mapa: Stahování a kešování mapových dlaždic (OSM / Mapy.com) s automatickým přizpůsobením zoomu.
  • Dynamic Element Stacking: Zobrazované statistiky se řadí dynamicky bez mezer i v případě, že některé metriky chybí.
  • Podpora vlastních fotek: Možnost nahradit mapu vlastním obrázkem na pozadí.
  • Vodoznak a EXIF metadata: Vkládání loga / vodoznaku a zápis autorství do EXIF/PNG metadat.
  • Export obrázku: Možnost exportovat do JPG nebo PNG.
  • Vlastní aktivita: Možnost vytvoření úplně nové aktivity podle vstupních parametrů (bez trasy, ta vyžaduje min. GPX na vstupu).

📦 Instalace

Je potřeba mít verzi Python 3.14 a vyšší!

Aplikaci lze nainstalovat přímo z PyPI přes pip. Stačí stáhnou Python install manager a poté:

pip install ocactivity-gen

Pokud bude potřeba udělat jen aktualizaci tak:

pip install --upgrade --no-cache-dir ocactivity-gen

Parametr --no-cache-dir je tam proto, aby pip nepodstrčil starší verzi z disku, ale skutečně se stáhla poslední.


🚀 Použití z příkazové řádky (CLI)

Po instalaci je ihned k dispozici příkaz ocactivity-gen.

Příklady použití:

  1. Vygenerování obrázku z FIT souboru:
ocactivity-gen -file "aktivity/zavod.fit" -name "Horský Ultra Běh 🏔️"
  1. Vygenerování z GPX souboru s vlastní fotkou na pozadí:
ocactivity-gen -file "vylet.gpx" -bg "moje_fotka.jpg" -name "Víkendová procházka" -out "vylet.png"
  1. Ruční vytvoření aktivity bez datového souboru:
ocactivity-gen -type "Běh" -distance 10500 -pace "4:45" -avgspeed "12.6" -ascent 250 -time 2980 -name "Ranní desítka"
  1. Přepsání načtených hodnot z FIT souboru a skrytí grafu a teploty:
ocactivity-gen -file "zavod.fit" -nograph -avgtemp -999 -name "Závod bez grafu a teploty"
  1. Pokud je potřeba použít jiné mapové podklady, třeba mapy.com. Je dobré změnit i cache, aby se nepoužívali staré podklady pro OSM (výchozí).
ocactivity-gen -file "activity.fit" -mapcache "mapy" -mapurl "https://api.mapy.cz/v1/maptiles/basic/256/{z}/{x}/{y}?apikey={YOUR_API_KEY}" -name "Nedělní výlet"
  1. Výstupní obrázek z FIT souboru bude v EN a bude se ukládat do cílového úložiště, takže není žádoucí, aby se soubor přepisoval. Zároveň skryjeme typ aktivity.
ocactivity-gen -file "activity.fit" -lang "EN" -out "D:/activity/track.jpg" -outtime -type " "
  1. Více příkladů v help:
ocactivity-gen -h

🎛️ Přehled parametrů CLI

Zde jsou nejčastější parametry. Pro více parametrů je potřeba se podívat do -h help.

Parametr Popis
-file Cesta k FIT nebo GPX souboru.
-bg Cesta k obrázku, která bude na pozadí místo mapy.
-name Název nebo popis aktivity.
-type Typ aktivity (např. "Chůze", "Běh", "Turistika", ...).
-distance Vzdálenost v metrech.
-avgspeed Průměrná rychlost v km/h (např. 7.5).
-maxspeed Maximální rychlost v km/h.
-pace Tempo v min/km (např. "4:30"). Musí být text, jinak se to bere jako m/s.
-ascent Stoupání v metrech.
-descent Klesání v metrech.
-time Čas v pohybu v sekundách.
-avghr Průměrná tepová frekvence (bpm).
-maxhr Maximální tepová frekvence (bpm).
-avgtemp Průměrná teplota (°C).
-maxtemp Maximální teplota (°C).
-kcal Spálené kalorie.
-steps Počet kroků.
-cdate Datum a čas spuštění aktivity ve formátu YYYY-MM-DD HH:MM:SS.
-fdate Datum a čas zastavení aktivity ve formátu YYYY-MM-DD HH:MM:SS.
-elapsedtime Celkový čas aktivity v sekundách včetně přestávek.
-idletime Součet času odpočinku nebo čekání v sekundách.
-nograph Vypne vykreslování grafu převýšení.
-nogpx Vypne vykreslování trasy na mapě.
-grayscale Použije na pozadí částečný (asi 25%) černobílý efekt, aby se snížila intenzita barev.
-kmstep Nastaví vzdálenost v kilometrech mezi značkami na trase.
-lang Nastaví lokalizaci popisků (CZ, EN).
-out Cílová cesta pro uložení obrázku. Může být jen adresář nebo i celá cesta včetně názvu.
-mapurl URL adresa pro mapové podklady. Výchozí je na OSM.
-mapcache Název cache adresáře, do kterého se budou ukládat mapové dlaždice. Pokud se změní URL, tak změnit i toto nebo prvně smazat cache.
-ccache Smaže mapové podklady z cache.
-outtime Přidá do názvu výstupního souboru časové razítko ve formátu YYMMDD_HHMMSS.

🔨 Nastavení trvalých parametrů

Může se stát, že bude potřeba některé parametry poslat vždy a není žádoucí je pokaždé vypisovat.

Windows

Spusťte tento příkaz v PowerShell. Následně se otevře editor, který buď bude prázdný nebo tam již něco bude.

if (!(Test-Path $PROFILE)) { New-Item -Type File -Force $PROFILE }; notepad $PROFILE

Následně na konec souboru vložte tuto funkci (kterou si upravte podle potřeby) a uložte. Tato funkce dělá to, že obalí volání aplikace a vloží vlastní parametry. Následně umožní předat parametry ze vstupu.

function ocactivity-gen {
    & ocactivity-gen.exe -lang "CZ" -mapurl "https://api.mapy.cz/v1/maptiles/outdoor/256/{z}/{x}/{y}?apikey={API_KEY}" -mapcache "mapy" -out "D:/activity.jpg" -outtime @args
}

Teď je potřeba ukončit všechny instance PowerShell a otevřít ho znovu. Nyní by se všechny nastavené parametry měli předat automaticky při zavolání. Pokud není možné ukončit všechny okna PowerShell, tak stačí v konkrétním okně napsat . $PROFILE.


🐍 Použití v kódu (pro vývojáře)

Díky modularitě lze knihovnu importovat do vlastního python skriptu:

A) Podobný styl obrázku, který je generován nativně:

  • Vlastní definice metrik (parametry aktivity).
from pyactivity import (
    ActivityGenerator,
    ActivityMetrics,
    ActivityParser,
    ElementStyle,
    ElevationGraphConfig,
    GeneratorConfig,
    GPXConfig,
    WatermarkConfig,
    create_element,
    default_viewport_callback,
    format_activity_type,
)

# Vytvoření metrik
metrics = ActivityMetrics(
    name="Nedělní procházka",
    activity_type="Chůze",
    distance=12345,  # Metry (12.3 km)
    moving_time=7173  # Sekundy (1h 59m 33s)
)

# Sestavení konfigurace a generátoru
config = GeneratorConfig(
    # Vlastní konfigurace GPX trasy (ZDE není potřeba)
    gpx=GPXConfig(),
    # Konfigurace grafu převýšení (pouze pro FIT a ZDE též není potřeba)
    elevation=ElevationGraphConfig(),
    # Vlastní konfigurace vodoznaku
    watermark=WatermarkConfig(),
    # Vykreslení prvků na obrázek
    # Název klíče musí odpovídat atributu v metrice!
    # Pokud je potřeba vlastní element, tak musí začínat prefixem: custom_
    elements={
        # Název aktivity
        "name": ElementStyle(
            is_absolute=True,
            value_pos=(360, 1180),
            value_font_size=40,
            auto_shrink=True,  # Když bude text dlouhý, tak se začne změnšovat
            value_color=(255, 255, 255, 255)
        ),
        # Typ aktivity
        "activity_type": create_element("Aktivita"),
        # Ikonka pro typ
        "custom_activity_type_marker": create_element(
            "🎯",
            is_absolute=True,
            take_pos_y_from_prev_label=True
        ),
        # Vzdálenost
        "distance": create_element("Vzdálenost"),
        # Ikonka pro vzdálenost
        "custom_distance_marker": create_element(
            "📍",
            is_absolute=True,
            take_pos_y_from_prev_label=True
        ),
        # Čas pohybu
        "moving_time": create_element("Čas"),
        # Ikonka pro čas pohybu
        "custom_moving_time_marker": create_element(
            "🕒",
            is_absolute=True,
            take_pos_y_from_prev_label=True
        )
    }
)

# Uložení obrázku
generator = ActivityGenerator(metrics=metrics, config=config)
generator.save(output_path="vystup.jpg", quality=90)

B) Načtení vlastního FIT souboru:

  • Bude použit stejný kód jako v bodě (A), ale musí se udělat několik úprav.
  • Celý objekt s metrikami se vytvoří z FIT souboru, takže není ho potřeba vytvářet ručně.
Přidání mapování typu aktivity:

Protože FIT soubor má vlastní typy, tak se hodnoty musí přemapovat na vlastní název.

ACTIVITY_MAPPING: dict[str | None, str] = {
    "walk": "Chůze",
    "walking": "Chůze",
    "run": "Běh",
    "running": "Běh"
}
Načtení FIT souboru a metrik:

Místo vytvoření vlastních metrik je načteme z FIT souboru.

# Načtení FIT souboru a těžba dat
fit_file = Path("activity.fit")
fit_data = ActivityParser().parse_fit(fit_file)

# Získání metrik s možností je přepsat
metrics = fit_data.metrics
metrics.name = "Název aktivity"  # FIT neobsahuje název
Úprava konfigurace - GeneratorConfig:

Do GeneratorConfig přidáme následující konfiguraci. Pro ukázku obsahuje více věcí, které lze taky nastavit.

# Obecná konfigurace
edge_vignette=False,  # Okraje obrázku nebudou mít gradient
elevation_graph_enabled=True,  # Vygeneruje graf převýšení
# Konfigurace GPX trasy
gpx=GPXConfig(
    gpx_enabled=True,  # Povolí vykreslení trasy
    gpx_path=fit_file,  # Může být GPX i FIT
    gpx_points=fit_data.gpx_points,  # Musí být vždy vyplněno
    gpx_points_with_elev=fit_data.gpx_points_with_elev,  # Tohle pouze pro FIT, protože GPX nemá převýšení
    # Pokud se generuje i graf převýšení, tak je dobré použít vlastní viewport, aby trasa nezasahovala do grafu
    viewport=default_viewport_callback,
    show_start_finish=True,  # Vykreslí začátek a konec trasy
    show_km_markers=True  # Vykreslí kilometrové značky na trase
),
# Konfigurace grafu převýšení (pouze pro FIT)
elevation=ElevationGraphConfig(
    show_bubble_interval=True,  # Značky každých N-km
    show_bubble_extreme=True  # Značka na nejvyšším a nejnižším místě
),
Úprava activity_type v elements:

Aby bylo možné použít vlastní mapování pro typ aktivity, tak musíme přidat mapper.

"activity_type": create_element(
    "Aktivita",
    formatter=lambda _cfg, _met, val: format_activity_type(val, ACTIVITY_MAPPING),
),

Celkové toho nastavení je mnoho. Tady je použit pouze nutný výčet a nějaké nice-to-have. Často je možné nastavit vše, od pozice, barvy, různých hodnot. Stačí projít konfigurační objekty.

Metadata

Release files for ocactivity-gen 1.0.15

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ocactivity-gen 1.0.15
File Size Uploaded Provenance
ocactivity_gen-1.0.15.tar.gz 12.4 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ocactivity-gen 1.0.15
File Interpreter ABI Platform
ocactivity_gen-1.0.15-py3-none-any.whl Python 3 none any Details

Total release size: 24.9 MB

Release files / ocactivity_gen-1.0.15.tar.gz

Download URL ocactivity_gen-1.0.15.tar.gz
Size 12.4 MB
Tags Source
SHA-256 checksum
How to use checksums
3749b3e6787f0a7321b1bed7929e0e2044a90ab972c76f7a182a907076f01803
BLAKE2b-256 checksum
How to use checksums
81365e07d3d6f0b356b09136d32843d783229c4e9dafd390a4e08da6bbd02789
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release files / ocactivity_gen-1.0.15-py3-none-any.whl

Download URL ocactivity_gen-1.0.15-py3-none-any.whl
Size 12.5 MB
Tags Python 3
SHA-256 checksum
How to use checksums
593a15df55b254e8336045a29198a9c0f6a364ea466d77aa4ebf5129b8763ad0
BLAKE2b-256 checksum
How to use checksums
1cba03d3f734473d61608d979f3e63a90147d83bf9e8a426d8b401ab8d0526b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Security for ocactivity-gen 1.0.15

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page