Geograficzne systemy informacji przestrzennej · II stopień planowania przestrzennego

Jak liczyć dostępność transportową w QGIS?

Od izochrony z jednego przystanku do odpowiedzi, ilu uczniów ma szkołę w zasięgu transportu publicznego w wakacje, a ilu we wrześniu. Wszystko wyklikane, bez wiersza poleceń.

1 algorytm
zamiast 12 ręcznych kroków w R, OpenTripPlanner, PyQGIS i QGIS. Silnik, dane i analiza w jednym oknie wtyczki.
01 Na start

Materiały do zajęć

Na samym początku instalujecie obie wtyczki i uruchamiacie pobieranie silników. Pobieranie trwa w tle, kiedy opowiadam o metodzie.

Start i instalacja
Czym jest OTP
Od skryptu w R do wtyczki
Czas obsługi transportem
Ćwiczenie 1: izochrony
R5: każde miejsce
Ćwiczenie 2: wakacje a szkoła
Skąd dane i mapy
Podsumowanie
1
Wybierz miasto

Jedno z 15 miast z indeksu nagrań GTFS. Duże sieci (Warszawa, GZM) liczą się najdłużej.

2
Zainstaluj wtyczki

Wtyczki → Zarządzaj wtyczkami, wyszukaj easy-OTP i Easy-R5. Obie są w repozytorium wtyczek QGIS.

3
Pobierz dane

Cztery archiwa z paczki danych: OSM, granice, GUS i rozkłady P50 (rozkład z 16.09 jest potrzebny już w ćwiczeniu 1). Archiwa .7z otworzysz 7-Zipem.

4
Uruchom pobieranie silników

easy-OTP → Setup i Easy-R5 → Setup. Gdyby nie ruszyło, silniki awaryjne ma prowadzący na pendrivie.

ElblągGdańskGZM (41 gmin)KielceKrakówŁódźLublinPoznańPrzemyślRadomRybnikRzeszówSuwałkiSzczecinWarszawa
02 OpenTripPlanner

Planer podróży, który można zapytać o całe miasto

OpenTripPlanner (OTP) to otwarty, multimodalny silnik wyszukiwania tras. Połączony z mapą OpenStreetMap i rozkładem jazdy GTFS działa jak Google Maps albo jakdojade.pl: znajduje trasę transportem publicznym od drzwi do drzwi, z dojściem, czekaniem i przesiadkami.

W Norwegii, Finlandii i Islandii OTP jest krajowym planerem podróży. Działa też w Portland, Nowym Jorku i Los Angeles. W Polsce na razie tylko w Poznaniu. OTP nie ma interfejsu graficznego do analiz: obsługuje się go zapytaniami, np. ze skryptu.

Trasa transportem publicznym wyznaczona w planerze OTP: dojście, przejazd, przesiadka
Podstawowe zastosowanie OTP: wyszukanie jednej trasy, tak jak w aplikacji z rozkładem jazdy.

Jakich danych potrzebuje

GTFS.zip

Rozkład jazdy w standardzie Google: przystanki, linie, kursy i kalendarz. Publikują go przewoźnicy, za darmo. Na zajęciach bierzemy go z gtfs-dashboard.

map.osm.pbf

Sieć ulic i chodników z OpenStreetMap. Po niej liczone jest dojście do przystanku i przesiadki. Wyciągi województw są na Geofabrik, dokładnie przycięte obszary w OSM by the Slice.

Strona Geofabrik z wyciągami OpenStreetMap
Geofabrik: gotowe wyciągi OSM dla krajów i regionów.
Logo serwisu OSM by the Slice
OSM by the Slice: wyciąg przycięty do narysowanego obszaru.

Czym różni się od innych wtyczek QGIS

Wtyczki Valhalla, ORS Tools czy QNEAT3 liczą trasy piesze, rowerowe i samochodowe. Izochron transportu publicznego nie dają, bo nie znają rozkładu jazdy. OTP zna: wie, że na tramwaj czeka się 6 minut, a ostatni autobus odjeżdża o 23:10.

A
Bufor mierzy odległość

Okrąg 500 m wokół przystanku zakłada, że idzie się w linii prostej i że autobus czeka.

B
Izochrona mierzy czas

Realna droga po ulicach i realny rozkład jazdy. Pieszo i rowerem liczona algorytmem A*, transportem zbiorowym A* z heurystyką Tung-Chew.

Okrąg 500 m wokół punktu i izochrona 6 minut pieszo, która wypełnia tylko część okręgu
Okrąg 500 m i izochrona 6 min pieszo.
Okrąg 1000 m wokół punktu i izochrona 12 minut pieszo, która wypełnia tylko część okręgu
Okrąg 1000 m i izochrona 12 min. Procent: jaka część okręgu jest naprawdę osiągalna.
03 Od skryptu w R do wtyczki

Zaczęło się od kilku linijek w R

Pierwsze analizy robiłem w RStudio pakietem otpr: skrypt wysyła zapytanie do serwera OTP, a wynik trafia do QGIS jako warstwa.

RStudio ze skryptem otpr generującym izochronę
Skrypt: punkt startowy, tryb TRANSIT, progi 15, 30 i 45 min, data i godzina.
Izochrony dojazdu transportem publicznym w Łodzi
Wynik w QGIS: izochrony dojazdu transportem publicznym.

Z każdego heksa na kampus: pętla zapytań

Siatka heksagonów, z każdego centroidu jedno zapytanie o trasę na kampus Politechniki Łódzkiej. Z odpowiedzi OTP biorę nie tylko czas, ale też czekanie, dojście do przystanku i liczbę przesiadek. Wada: pętla zapytań po kolei trwała ponad 5 minut.

Siatka heksagonalna na Łodzi
Siatka heksagonów i ich centroidy.
Skrypt R z pętlą zapytań do OTP
Pętla: jedno zapytanie na heks.
Dwie mapy Łodzi na heksach: czas dojazdu z Politechniki Łódzkiej i liczba przesiadek
Czas dojazdu na Politechnikę Łódzką (z lewej) i liczba potrzebnych przesiadek (z prawej).

Powierzchnia czasu podróży: jedna sekunda zamiast 5 minut

OTP umie sam policzyć raster, w którym każda komórka ma czas dojazdu z punktu w minutach, od 1 do 120 (ten limit jest wpisany na sztywno w OTP 1.5). To jedno zapytanie zamiast tysięcy, więc trwa około sekundy. Na takich powierzchniach opiera się cała reszta.

Skrypt R tworzący powierzchnię czasu podróży
Zapytanie o powierzchnię czasu podróży.
Raster czasu podróży od centrum, od czerwonego (blisko) do zielonego (daleko)
Wynik: raster czasu dojazdu, minuta w każdej komórce.

Jeden do wielu, wiele do wielu

Zapytanie z jednego punktu do 2700 celów i zapytanie z 30 punktów do 30 celów to ta sama operacja w różnej skali. Liczba zapytań rośnie bardzo szybko, dlatego bez automatyzacji się nie obejdzie.

Połączenia z jednego punktu do wielu celów na mapie heksów
Jeden do wielu
Siatka połączeń wiele do wielu
Wiele do wielu

Ile Żabek jest w 10 minut pieszo?

To przykład miary dostępności kumulatywnej: dla każdego miejsca liczymy, ile celów da się osiągnąć w zadanym czasie. Algorytm ma dwa kroki:

  1. Powierzchnia dla każdego sklepu

    Dla każdej Żabki OTP liczy pieszą powierzchnię czasu dojścia (raster jak wyżej). Na filmie widać te powierzchnie jedna po drugiej.

  2. Zliczenie w każdej komórce

    Dla każdej komórki siatki sprawdzamy wszystkie powierzchnie i liczymy, w ilu czas dojścia jest ≤ 10 min. Wynik 12 znaczy: z tego miejsca w 10 minut dojdziesz do 12 różnych Żabek.

Pieszo pora dnia nie ma znaczenia, więc wystarczy jeden moment i wiele punktów. W analizie temporalnej (następna sekcja) jest odwrotnie: jeden punkt i wiele momentów. We wtyczce ten algorytm to Run service coverage.

Krok 1: powierzchnia czasu dojścia od każdego sklepu, jedna po drugiej.
Mapa liczby sklepów osiągalnych w 10 minut pieszo
Krok 2: liczba Żabek w zasięgu 10 min w każdym kwadracie.
04 Analiza w czasie

Jak policzyć czas obsługi transportem?

Zwykła izochrona to jeden moment, np. 7:00 rano. Pieszo i rowerem to wystarcza, ale rozkład jazdy zmienia się co minutę: o 7:05 autobus może właśnie odjechać, a o 22:00 jeździć co pół godziny. Dlatego pytamy inaczej: przez ile godzin w ciągu doby z danego miejsca da się dojechać do celu w 30 minut? Tę liczbę godzin nazywam czasem obsługi.

  1. Powierzchnia co minutę

    Od 6:00 do 22:00 co minutę jedna powierzchnia czasu podróży do celu (np. kampusu). To 961 rastrów.

  2. Stos rastrów

    Wszystkie powierzchnie składamy w jeden wirtualny raster: każda warstwa to jedna minuta doby.

  3. Zliczenie minut

    Dla każdej komórki liczymy, w ilu warstwach czas dojazdu jest ≤ 30 min. Wynik w minutach dzielimy przez 60: to czas obsługi w godzinach.

  4. Klasy obsługi

    12–16 h: stała, 6–12 h: regularna, 3–6 h: okresowa, 0–3 h: epizodyczna. Wynik przenosimy na siatkę heksów.

  5. Nakładka ludności

    Dane GUS NSP 2021 z obwodów spisowych przeliczamy na heksy. Wtedy widać nie tylko gdzie, ale też ile osób ma dobrą obsługę.

961
powierzchni czasu, 6:00–22:00 co 1 min
800 m
maksymalne dojście do przystanku
1,3 m/s
prędkość chodu (4,68 km/h)
Zasięg 30 min w ciągu doby w czterech miastach. Każda klatka to jedna minuta, czyli jedna z 961 powierzchni.

Pierwsza wersja: 12 kroków ręcznie

W badaniu do artykułu każdy krok był osobno: pozyskanie OSM i GTFS, siatka, start serwera OTP, pętla zapytań w R, wirtualny raster w QGIS, zliczanie skryptem PyQGIS, klasyfikacja, nakładka GUS i mapa. Trzeba było znać R, Pythona i konfigurację OTP.

Schemat 12 kroków analizy temporalnej: od siatki heksagonalnej do wizualizacji
Proces ręczny: R, OpenTripPlanner, PyQGIS i QGIS.
Model QGIS przenoszący ludność z obwodów spisowych na heksy
Nakładka ludności zrobiona modelarzem graficznym QGIS.

Wynik: dostępność kampusów w 6 miastach

Warszawa, Poznań, Kraków, Łódź, Wrocław, Gdańsk. Kolej wiąże się z wyższą i stabilniejszą dostępnością, widać wyraźną różnicę między centrum a peryferiami.

Mapa Łodzi: klasy obsługi w 30 min do Uniwersytetu Łódzkiego i liczba osób w wieku studenckim w heksach
Uniwersytet Łódzki: klasy obsługi (30 min) i liczba osób w wieku 20–29 lat w heksie (GUS NSP 2021).

Artykuł

Kaczorowski M., Wróblewski W., Spatio-temporal and demographic distribution of public transport accessibility, European Spatial Research and Policy 33(2).
https://doi.org/10.18778/1231-1952.33.2.04

Druga wersja: wtyczka easy-OTP

Najtrudniejsza była technika: Java, serwer, R. Teraz wszystko dzieje się w QGIS. Wtyczka pobiera Javę, OTP i dane, buduje graf, liczy powierzchnie, nakłada ludność z GUS i nadaje styl. Kroki od startu serwera do klasyfikacji robi jeden algorytm, Run temporal accessibility.

Lista algorytmów easy-OTP w Processing Toolbox
Algorytmy easy-OTP w Processing Toolbox.
Okno parametrów algorytmu Run temporal accessibility
Parametry: OSM, GTFS, punkt, siatka, data, okno czasu, próg.
Przebieg analizy w easy-OTP, przyspieszony: parametry, uruchomienie, wynik na mapie.

Jakie pytania można zadać wtyczce

PytanieAlgorytmPrzykład
Dokąd dojadę o 8:00?Generate isochronesZasięg 15/30/45 min z dworca albo uczelni, kierunek „z” albo „do” punktu.
Jak zasięg zmienia się w ciągu dnia?Generate isochrones over timeIzochrona co godzinę albo co 15 min, animacja w Temporal Controller.
Przez ile godzin miejsce jest dobrze obsłużone?Run temporal accessibilityCzas obsługi transportem dla każdego heksa, 4 klasy.
Ilu mieszkańców to dotyczy?Prepare student layer · Population overlayDane GUS NSP 2021 z obwodów spisowych przeniesione na heksy.
Co zmienia weekend albo nowa linia?Compare temporal accessibilityMapa różnic dwóch scenariuszy.
Ile usług mam w zasięgu?Run service coverageLiczba aptek albo sklepów w 10 min pieszo, dla każdej komórki.
Ile jadę do szpitala z każdego heksa?Run origin-destination times · Run travel-time matrixCzas, przesiadki, czekanie; macierz do modelu grawitacyjnego.
!
GTFS to plan, nie rzeczywistość

Model nie zna opóźnień ani odwołanych kursów. Wynik bywa zbyt optymistyczny. Dlatego ćwiczenie 2 robimy na danych z nagrań GTFS-RT.

!
OTP 1.5 jest stary

Wymaga Javy 8, powierzchnie mają limit 120 min, duże obszary liczą się długo. Do wielu punktów naraz lepszy jest R5.

05 Ćwiczenie 1 · 20 min

Jak zmienia się zasięg z jednego miejsca w ciągu dnia?

Jedna izochrona z tego samego punktu co godzinę, od 6:00 do 22:00, a potem animacja w QGIS. Potrzebne: plik OSM twojego miasta i rozkład P50 z 16.09.2026 z paczki gtfs_p50.7z.

Nazwy algorytmów w polskim QGIS

Instrukcja podaje nazwę angielską i polską. Najprościej wpisać którąś z nich w wyszukiwarkę Przybornika Processing (Processing Toolbox): znajduje algorytm po obu.

  1. Silnik OTP

    easy-OTP → Setup → Download Java 8 JRE and OpenTripPlanner Jar (PL: 1 · Konfiguracja → Pobierz Java 8 JRE i plik Jar OpenTripPlanner), folder np. C:\otp\. Wtyczka zapamięta ścieżki do Javy i jara. Jeśli pobieranie nie działa: skopiuj folder otp/ z pendrive’a prowadzącego.

  2. Sprawdzenie

    Diagnostics → Test OTP server (PL: 2 · Diagnostyka → Test serwera OTP). Wynik „Wszystkie testy zaliczone” znaczy, że Java i jar są gotowe.

  3. Dane

    Z paczek wypakuj <miasto>.osm.pbf i <miasto>_realized_gtfs_2026-09-16_p50.zip. Plik rozkładu skopiuj do osobnego folderu, w którym nie ma innych plików .zip: ten folder wskażesz jako Folder GTFS.

  4. Podkład mapy

    Wtyczka QuickMapServices: Wtyczki → Zarządzaj wtyczkami, wyszukaj QuickMapServices i zainstaluj. Potem Internet → QuickMapServices → OSM → OSM Standard. Bez podkładu trudno trafić w dworzec albo uczelnię.

  5. Izochrona co godzinę

    Analysis → Generate isochrones over time (PL: 3 · Analiza → Generuj izochrony w czasie):

    • punkt: przycisk „…” obok pola i klik na mapie (dworzec albo uczelnia);
    • plik OSM, Folder GTFS z poprzedniego kroku;
    • tryb TRANSIT, kierunek FROM, próg 30;
    • okno 06:00–22:00, interwał 60 (domyślnie jest 15), data 2026-09-16 (domyślnie jest dzisiejsza);
    • Katalog roboczy: nowy pusty folder, np. C:\otp\praca.

    Wynik: 17 izochron, każda z polem time. Pierwszy przebieg buduje graf, to najdłuższy krok (ok. 1–2 min dla Łodzi). Dla Łodzi prowadzący ma na pendrivie gotowy graf (otp_graf_lodz.7z): wypakuj go i wskaż folder otp_praca_lodz jako Katalog roboczy, a budowa się pominie.

  6. Ustawienia czasu warstwy

    Właściwości warstwy → Czas: zaznacz Dynamiczna kontrola czasu, Tryb: pojedyncze pole z datą/godziną, pole time, czas trwania zdarzenia 60 minut. Wtyczka nie ustawia tego sama.

  7. Animacja

    Widok → Panele → Sterowanie czasem (Temporal Controller): kliknij ikonę animacji, potem Ustaw na pełny zakres, krok 1 godzina i ▶. W każdej klatce widać jedną izochronę.

  8. Dla chętnych

    Ten sam punkt z interwałem 15 min albo z progami 15,30. Użyj tego samego Katalogu roboczego: graf jest już zbudowany, więc liczy się szybko. Liczba zapytań rośnie z każdym progiem i każdym krokiem czasu.

Izochrony wygenerowane w easy-OTP
Inny algorytm (Generate isochrones): kilka progów w jednym momencie.
Wynik ćwiczenia: jedna izochrona 30 min na każdą godzinę (Łódź, 16.09.2026, P50).

Do dyskusji

O której zasięg jest największy, a o której najmniejszy? Gdzie rośnie skokowo wzdłuż kolei i tramwaju? Dlaczego wieczorem kurczy się bardziej na peryferiach niż w centrum?

06 Easy-R5 · Conveyal R5

A gdyby policzyć izochronę z każdego miejsca w Łodzi?

OTP liczy jeden punkt naraz. R5 liczy od razu z tysięcy punktów, np. z każdego heksa w mieście, do wszystkich celów. Do tego dla każdej minuty okna odjazdów, np. 7:00–9:00, i podaje percentyle: medianę i wariant ostrożny. Wynik nie zależy od tego, czy trafiliśmy na odjazd o 7:13 czy o 7:15, dlatego dobrze nadaje się do porównań.

9 s
macierz 1000 × 1000 w R5 (Higgins i in., 2022)
> 24 h
ta sama macierz w OTP przez R, bez wyniku
120
minut okna odjazdów domyślnie
AlgorytmCo liczy
Run travel time matrixN punktów × M celów, percentyle po oknie odjazdów.
Run accessibilityIle celów (szkół, aptek, miejsc pracy) jest w progu czasu z każdego punktu.
Run service minutesIle minut z okna odjazdów daje dojazd w progu.
Run competitive accessibility (2SFCA)Np. lekarze na 1000 mieszkańców, z konkurencją o miejsca.
Summarize accessibility equityOdsetek mieszkańców z dostępem, Gini, podział na dzielnice.
Generate isochronesIzochrony konturowane w QGIS z siatki czasów.
Build scenario · Compare scenariosNowa linia, usunięta trasa, inna częstotliwość; mapa różnic.

Przykład 1: do ilu uczelni dojedziesz w 30 minut z każdego heksa?

Łódź, siatka 500 m, trzy uczelnie: Politechnika, Uniwersytet Łódzki i Uniwersytet Medyczny. Dla każdego heksa liczymy, do ilu z nich dojedziesz transportem publicznym w 30 min (rozkład zrealizowany P50 z 21.08.2026). To ta sama miara co przy Żabkach, tylko z tysięcy punktów naraz.

Łódź: liczba uczelni osiągalnych w 30 minut z każdego heksa 500 m, na podkładzie OSM, z legendą
Im ciemniejszy heks, tym więcej uczelni w zasięgu 30 min. Kropki to budynki uczelni. Wszystkie trzy są w zasięgu tylko w centrum i na południe od niego.

Przykład 2: ile kosztują opóźnienia?

Ta sama dostępność policzona dwa razy dla tego samego dnia: raz na rozkładzie, raz na rozkładzie zrealizowanym (P50) odtworzonym z nagrań GTFS-RT. Różnica pokazuje, gdzie opóźnienia odbierają mieszkańcom szkoły, apteki, uczelnie i centra handlowe w zasięgu 30 min. Policzone w całości algorytmami Easy-R5.

Plansza: zmiana liczby usług osiągalnych w 30 minut po uwzględnieniu opóźnień w Łodzi
Czerwone heksy tracą usługi przez opóźnienia, niebieskie zyskują (np. tam, gdzie pojazdy jadą szybciej niż w rozkładzie).

Przykład 3: skąd najłatwiej dojechać na uczelnię?

Sześć miast, dostępność do uczelni w 30 min zestawiona z liczbą osób w wieku 20–29 lat. Mapa dwuzmienna: kolor mówi jednocześnie, jak dobry jest dojazd i ilu młodych ludzi tam mieszka.

Plakat: dostępność do uczelni w 6 polskich miastach na mapach dwuzmiennych
Warszawa, Kraków, Gdańsk, Łódź, Poznań, Szczecin.

Zobacz na interaktywnych mapach

07 Ćwiczenie 2 · 35 min

Jaka jest różnica między wakacjami a rokiem szkolnym na drogach?

Ta sama analiza dla dwóch środ: 26.08.2026 (wakacje) i 16.09.2026 (rok szkolny). Liczymy na rozkładzie zrealizowanym odtworzonym z nagrań GTFS-RT, a nie na planie. Dzięki temu w wyniku są i zmiany rozkładu, i korki, które we wrześniu spowalniają autobusy i tramwaje. Wynik podajemy w liczbie mieszkańców w wieku 10–19 lat, nie tylko w heksach.

P50 · wariant główny

Czasy przejazdu między przystankami z mediany nagranych kursów: tak jechał typowy pojazd tego dnia.

P85 · wariant dodatkowy

Ten sam dzień, odczytany ostrożniej. Dla każdego odcinka między dwoma przystankami bierzemy nagrane przejazdy z danej pory dnia. P50 to czas typowy: połowa przejazdów była szybsza. P85 to czas, którego nie przekroczyło 85% przejazdów, czyli wolny przejazd. Rozkład złożony z takich czasów odpowiada na pytanie „ile czasu zarezerwować”, a nie „ile to zwykle trwa”. To nie jest inny, gorszy dzień, tylko pesymistyczny odczyt tych samych nagrań: wolno na każdym odcinku naraz.

A

Dane · 10 min

  1. Silnik R5

    Easy-R5 → Setup → Download R5 engine and Java 21 (PL: Konfiguracja → Pobierz silnik R5 i Javę 21). Awaryjnie: folder r5/ z pendrive’a prowadzącego.

  2. Dwa dni z nagrań

    Wtyczki → Easy-R5 → Download transit recordings…:

    • City: twoje miasto (Łódź jest na końcu listy, nie myl jej z Łódzką Koleją Aglomeracyjną);
    • najpierw Month 2026-08, potem Day 2026-08-26;
    • Variant: Realized — median (P50);
    • Download into: np. C:\r5\nagrania.

    Potem drugi raz: Month 2026-09, Day 2026-09-16, P50. Każdy dzień trafia do osobnego folderu (…\<miasto>\<data>\p50\) i tak ma zostać.

  3. Kontrola danych

    Diagnostics → Check transit data (GTFS): wskaż plik .zip z folderu danego dnia i wpisz tę samą datę (2026-08-26, potem 2026-09-16). Zero błędów oznacza, że można budować; ostrzeżenia są w porządku.

  4. Dwie sieci

    Build R5 network (PL: Konfiguracja → Zbuduj sieć R5) dwa razy: ten sam <miasto>.osm.pbf, raz folder z 26.08, raz z 16.09. Pole z folderem GTFS podpowiada ostatnio pobrany dzień, więc przy 26.08 zmień je ręcznie. Po każdej budowie zapisz ścieżkę do network.dat z okna wyników: folder ma losową nazwę, a w analizie musisz wskazać właściwą sieć.

Pilnuj daty

Plik zrealizowany ma w kalendarzu kursy także w innych dniach, więc pomyłki daty nie wykryje ani kontrola danych, ani R5. W każdym kroku data ma się zgadzać z folderem, z którego jest sieć.

B

Siatka, szkoły, ludność · 10 min

  1. Siatka heksagonalna
    • wczytaj <miasto>_granica.gpkg;
    • Create grid (PL: Utwórz siatkę): heksagony, odstęp 500 m, EPSG:2180, zasięg z granicy;
    • Extract by location (PL: Wyodrębnij wg położenia): heksy, które przecinają granicę;
    • na heksach w kalkulatorze pól dodaj liczbowe pole hex_id = @row_number;
    • dopiero teraz Centroids (PL: Centroidy): centroidy odziedziczą hex_id, więc wszystkie dalsze łączenia zadziałają.
  2. Szkoły z OSM
    • przeciągnij <miasto>.osm.pbf do QGIS (otwiera go wbudowany sterownik OSM, bez dodatkowych wtyczek); w oknie wyboru warstw zaznacz points i multipolygons;
    • filtr na points: "other_tags" LIKE '%"amenity"=>"school"%';
    • filtr na multipolygons: "amenity" = 'school' (tu amenity jest osobną kolumną);
    • z poligonów zrób Centroids, potem scal obie warstwy: Merge vector layers (PL: Połącz warstwy wektorowe);
    • na scalonej warstwie w kalkulatorze pól dodaj liczbowe pole szkoly = 1. Bez niego analiza nie ma czego zliczać.

    W Łodzi wychodzi ok. 260 szkół. Jeśli masz kilkadziesiąt, poligony nie przeszły przez filtr.

  3. Ludność z GUS
    • z brec_2021_polska.gpkg (warstwa obwody_spisowe) wytnij swoje miasto: Extract by location z granicą (wczytanie całej Polski chwilę trwa);
    • Prepare population layer (PL: Analiza → Przygotuj warstwę ludności): plik ludnosc_nsp_2021.xlsx, arkusz = twoje województwo dokładnie jak w Excelu (np. Łódzkie), kolumna 10-19, klucz OBWOD. Pole wynikowe nazwie się pop10_19;
    • Population overlay (PL: Analiza → Nałóż ludność na siatkę): siatka = heksy (poligony z hex_id), pole ludności = pop10_19. Wynik jest w polu population. Ostrzeżenia o pustych wartościach to obwody utajnione przez GUS.
C

Analiza i porównanie · 15 min

  1. Dwa przebiegi, identyczne parametry

    Run accessibility (PL: Analiza → Policz dostępność):

    • sieć: network.dat z 26.08, data 2026-08-26;
    • punkty źródłowe: centroidy heksów, pole identyfikatora hex_id;
    • punkty docelowe: szkoły, pola możliwości: szkoly;
    • czas odjazdu 07:00, okno 120 min (czyli 7:00–9:00), percentyl 50;
    • progi czasowe: 30 (domyślnie jest 15,30,45,60).

    Potem drugi raz z siecią i datą 16.09. Wynik jest w polu acc_szkoly_p50_c30: liczba szkół w zasięgu 30 min.

  2. Porównanie

    Scenarios → Compare scenarios: A = wynik 26.08, B = wynik 16.09, pole identyfikatora hex_id, pole acc_szkoly_p50_c30, „wyżej znaczy lepiej” zaznaczone. Narzędzie odmówi porównania, jeśli metoda się różni. To celowe zabezpieczenie.

  3. Mapa

    Join attributes by field value (PL: Złącz atrybuty wg wartości pola): warstwa wejściowa = heksy, warstwa łączona = wynik porównania, pole hex_id w obu. Styl: stopniowany według diff, rampa RdBu, symetrycznie wokół 0.

  4. Kontrola ręczna

    Kalkulator pól: "value_b" - "value_a". Musi wyjść to samo co diff.

  5. Wynik w ludziach

    Najpierw dołącz ludność do wyniku każdego przebiegu: Join attributes by field value, wynik Run accessibility ← heksy z ludnością, po hex_id, pole population. Potem Summarize accessibility equity: pole ludności population, pole dostępności acc_szkoly_p50_c30, próg 1, a dla porównania także 10. Zdanie do zapisania: „X% uczniów ma szkołę w 30 min w wakacje, Y% we wrześniu”. Przy progu 1 obie daty dają zwykle prawie to samo; różnicę widać przy progu 10.

  6. Wariant dodatkowy: P85

    Pobierz 16.09 w wariancie Realized — conservative (P85), zbuduj trzecią sieć i powtórz Run accessibility. Percentyl zostaw 50: P85 dotyczy danych, nie parametru analizy. Zrób Summarize accessibility equity dla P85 i porównaj odsetek z P50 przy progach 1 i 10: ilu uczniów traci szkoły w zasięgu, kiedy trafią na wolniejszy kurs?

Uwaga: nie każda różnica to efekt wakacji

Dwa dni różnią się też zwykłą zmiennością: pogoda, wypadek, remont. Żeby oddzielić efekt, porównuje się dodatkowo dwa dni z tego samego okresu (para kontrolna). Tak zrobiona jest analiza zmiany tras w Łodzi z 5.10.2026: para główna pokazuje zmianę, para kontrolna, ile różnicy robi sam dzień.

Łódź: zmiana czasu dojazdu po zmianie tras 5.10 względem 28.09
Para główna: 5.10 (po zmianie tras) vs 28.09. Dla każdego heksa 250 m średnia zmiana czasu dojazdu transportem do wszystkich pozostałych heksów (ważona ich ludnością), odjazd 7:00–9:00. Niebieski: krócej, czerwony: dłużej; najmocniejsze kolory to zmiana o 3 min i więcej, szary to mniej niż 15 s.
Łódź: zmiana czasu dojazdu między dwoma poniedziałkami przed zmianą tras
Para kontrolna: 28.09 vs 21.09, oba dni przed zmianą, ta sama miara. Tyle różnicy robi sam dzień.
08 Skąd dane i co z nich wychodzi

Od pozycji autobusu do mapy dostępności

W ćwiczeniu 2 pobraliście rozkład „jak było naprawdę”. Skąd się wziął? Pojazdy wysyłają swoje pozycje w standardzie GTFS-Realtime. Trzy moje projekty zamieniają je w dane, które da się wczytać do wtyczek, i w mapy, które czyta każdy.

28
nagrywanych sieci, w tym 15 polskich miast i ŁKA
1934
dni nagrań od 14.07.2026
60 s
co tyle zapisywana jest pozycja każdego pojazdu
1

easy-GTFS-RT: nagrywanie i rekonstrukcja

Repozytorium bez kodu aplikacji, same workflowy GitHub Actions. Codziennie dla każdego miasta:

  1. pozycja co 60 s Nagrywanie

    Co minutę: gdzie jest każdy pojazd i jakim kursem jedzie.

  2. punkt na trasie Dopasowanie

    Pozycję rzutujemy na trasę: między którymi przystankami jest pojazd.

  3. godzina minięcia Interpolacja

    Z dwóch pozycji: o której minął przystanek.

  4. czas odcinka Agregacja

    Przejazdy odcinka z tej samej pory dnia: P50 i P85.

  5. stop_times.txt Przebudowa

    Czasy z rozkładu zamieniamy na zmierzone.

  6. GTFS P50 i P85 Wydanie

    Zwykły GTFS na każdy dzień, do OTP i R5.

Strona wydania easy-GTFS-RT dla Łodzi z 16.09.2026 z listą plików
Wydanie dla Łodzi z 16.09.2026: GTFS P50 i P85, rozkład planowy do porównania, wykres i tabela różnic.
2

gtfs-dashboard: katalog nagrań

Statyczna strona, która przegląda wydania easy-GTFS-RT: miasto, miesiąc, dzień. Dla każdego dnia pokrycie godzinowe, liczba dopasowanych obserwacji, wykres średniego opóźnienia w ciągu dnia i pliki do pobrania. Z tego samego indeksu korzysta moduł Download transit recordings w Easy-R5, którego użyliście w ćwiczeniu 2.

gtfs-dashboard: Łódź 16.09.2026, liczba obserwacji i wykres średniego opóźnienia w ciągu dnia
Łódź, 16.09.2026: 288 881 dopasowanych obserwacji. Opóźnienie rośnie wyraźnie w popołudniowym szczycie.
3

mapy-analizy: wyniki dla każdego

Interaktywne mapy z analiz zrobionych tymi samymi wtyczkami. Każda odpowiada na jedno pytanie i działa w przeglądarce, bez QGIS.

4

Twoja kolej

Wszystko jest otwarte: dane z nagrań, wtyczki i kod analiz. Możesz pobrać dowolny dzień z katalogu i powtórzyć ćwiczenie dla innego miasta albo innej pary dni.

Zadanie domowedo wyboru
Powtórz ćwiczenie 2 na rozkładzie planowym
Wariant scheduled dla 16.09 i porównanie z P50: o ile rzeczywistość odbiega od planu? Albo: analiza w czasie w easy-OTP dla obu dni i Compare temporal accessibility. Albo: nowa linia w Build scenario i ilu uczniom pomoże.
09 Materiały

Paczka danych i silniki awaryjne

Dane leżą w wydaniu repozytorium w czterech archiwach: OSM, granice, GUS i rozkłady. Rozkłady są na wypadek, gdyby pobieranie we wtyczce nie zadziałało.

OSM przycięty do miast

osm_miasta.7z: 15 plików <miasto>.osm.pbf, granica miasta z buforem 1 km. Dla GZM 41 gmin metropolii.

301 MB
Granice miast

granice_miast.7z: 15 plików <miasto>_granica.gpkg, EPSG:2180, z kodami TERYT gmin.

< 1 MB
Dane GUS

dane_gus.7z: brec_2021_polska.gpkg (warstwy obwody_spisowe i rejony_statystyczne, cała Polska) i tabele NSP 2021, w tym ludnosc_nsp_2021.xlsx (ludność wg płci i grup wieku, arkusz na województwo).

345 MB
Rozkłady zrealizowane P50

gtfs_p50.7z: <miasto>/2026-08-26/ i 2026-09-16/, mediana z nagrań GTFS-RT. Awaryjnie, gdyby pobieranie we wtyczce nie zadziałało; P85 jest w gtfs-dashboard.

318 MB
Silniki, awaryjnie

Na sali, u prowadzącego: otp/ (Java 8 i OTP 1.5.0) i r5/ (Java 21, R5 7.6 i skompilowany runner).

pendrive

Plan B na sali

Pobieranie silnika nie działa: wypakuj otp.7z albo r5.7z z pendrive’a i wskaż ścieżki w Advanced. Graf OTP dla Łodzi buduje się za długo: na pendrivie jest gotowy (otp_graf_lodz.7z). Pobieranie rozkładu nie działa: weź swoje miasto z gtfs_p50.7z. Komputer za słaby na Warszawę albo GZM: mniejsze miasto albo siatka 1000 m.