Version: [6300] Easy-R5 0.2.1 Experimental

0.2.1
* fix(qt6): every enum access across algorithms/ + gui/ fully
qualified
(e.g. QgsFeatureSink.Flag.FastInsert, not QgsFeatureSink.FastInsert) —
the short form is a PyQt5-only convenience that PyQt6 drops, and QGIS
3.40 can be built against either. 53 call sites, no logic change,
identical behaviour under Qt5.
* fix(matrix): points — a destination/origin layer whose schema
changed on
disk after being loaded into QGIS (e.g. columns added by another
script/algorithm run) could leave the project holding a stale cached
field list; write_points_csv() now raises loudly, naming the missing
field(s), instead of silently writing wrong/zero values (#5).
* perf(runner): EasyR5Runner matrix mode routes origins across a
thread
pool (one thread per available core) instead of one at a time — R5's
LinkageCache and EgressCostTable are safe to share across origins run
in
parallel, each origin still gets its own
RegionalTask/TravelTimeComputer;
measured ~3x wall-clock on a 213-origin job, byte-identical output vs.
the old sequential path (#4).
* feat(resources): real plugin icon — a point-up hexagon with a
schematic route network (own composition, own accent color; not a
copy of r5r/r5py's sticker) replaces the placeholder "R5" square;
sized 512x512 intrinsic to match easy-OTP's icon and display at the
same size in the QGIS Plugin Manager.
0.2.0
* feat(setup): DownloadRealizedGtfs — pick a city + date + variant
(realized
P50/P85 or scheduled) and download that GTFS feed from GISBoost's
gtfs-dashboard index, into a folder ready for Build R5 network. No
GitHub
API calls (the manifest is a static CDN file); no checksum published,
so
the download is CRC-checked and sniffed for the GTFS files only.
* feat(gui): 'Plugins > Easy-R5 > Download transit recordings…' — a
cascading city > month > day picker over the live index. The plugin's
first and only dialog (see docs/prd/PR_easy-R5_v02_realized-gtfs.md
§1).
* refactor(core): downloads — HTTP download + safe zip/tar extraction
moved
out of DownloadR5 so both Setup algorithms share it.
* feat(core): gtfs_dashboard — manifest client (fetch + disk cache +
resolve).
0.1.0
* M5 — isochrones, population layers, release.
* fix(deps): drop the pip fallback from the openpyxl bootstrap —
urllib
wheel + _vendor/ only, never shell out to pip (CLAUDE.md).
* fix(java): -XX:+ExitOnOutOfMemoryError so an R5 worker-thread OOM
cannot
hang the process; runner reports setup vs routing time for a sane
estimate.
* fix(analysis): validate DATE/DEPARTURE_TIME before the JVM;
RunAccessibility
lifts MAX_TRIP_DURATION to cover a larger cutoff and joins results by
id;
GenerateIsochrones takes exactly one percentile; output field
percentiles
-> percentile (PRD 5.2).
* feat(analysis): GenerateIsochrones — travel-time polygons per cutoff
from
N points (grid -> one-origin matrix -> contour in QGIS; R5 does not
contour). Styled output, per-cutoff error isolation.
* feat(analysis): PreparePopulationLayer + PopulationOverlay — ported
from
easy-OTP (GUS NSP 2021 -> census geometry; area-weighted onto a hex
grid,
fractional). XLSX read in a subprocess. openpyxl bootstrap (CLAUDE.md
exception, confirmed).
* feat: styles/ QML auto-applied to matrix / accessibility / isochrone
outputs.
* feat(i18n): easy_r5.pro + i18n/easy_r5_pl.ts/.qm (partial PL — see
#1).
* docs: README rewritten with real usage + the hex-grid recipe;
KNOWN_ISSUES.md.
* No hex-grid algorithm (PRD §4.7) and no service-minutes / scenarios
/
itineraries / GTFS-RT (§9) — v0.2+.
0.0.4
* M4 — cumulative-opportunity accessibility.
* feat(analysis): RunAccessibility — opportunities reachable per
origin /
cutoff / percentile, summed in Python from the matrix (STEP, LOGISTIC,
EXPONENTIAL decay); long CSV in r5r's layout + an ORIGINS copy with
acc_<opp>_p<pct>_c<cutoff> fields.
* feat(core): accessibility — decay weights + the cumulative sum.
* refactor: shared matrix machinery (gates, point export, estimate,
batched
processes, walk-only guard) moved to
algorithms/_matrix_base.MatrixBase.
* docs: validation-gdansk.md — RunAccessibility vs r5r's Gdańsk
output.
0.0.3
* M3 — travel-time matrix (the flagship algorithm).
* feat(analysis): RunTravelTimeMatrix — one-to-many / many-to-many
travel
times over a departure window; percentiles, batched processes, sampled
time estimate, hard dead-date gate + post-run walk-only detector.
* feat(java): EasyR5Runner command "matrix" — ports the verified
Probe.java RegionalTask / FreeFormPointSet recipe.
* feat(core): points (layer -> id,lon,lat CSV, EPSG:4326, stable ids),
matrix (batch merge, systematic sample, nearest served days).
0.0.2
* M2 — network building + GTFS service-day validation.
* feat(setup): BuildNetwork — build a cached network.dat from an OSM
extract
and a folder of GTFS feeds; cache keyed by input hash + R5 version;
FORCE_REBUILD bypasses it.
* feat: network.json carries service_days — active trip count per date
over
a 90-day window (calendar.txt + calendar_dates.txt, type 1/2
exceptions).
* feat(java): EasyR5Runner command "build".
0.0.1
* M1 — plugin skeleton + R5 engine on disk.
* feat: Processing provider "Easy-R5" (id easyr5).
* feat(setup): DownloadR5 — Temurin 21 JDK + r5-v7.6-all.jar, SHA-256
verified, paths saved under the easy_r5/ QSettings namespace, one-file
Java runner compiled to <target>/runner_cache/.
* feat(diagnostics): TestR5Setup — reports each check independently
(JDK / jar / runner / optional command=info on a network.dat).
* feat(java): EasyR5Runner.java — command "info" only; full stdout
protocol.

yes

GISBoost

2026-09-14T07:19:10.591306+00:00

3.22.0

3.99.0

None

yes

Version management

Plugin details