{"name": "Easy-R5", "package_name": "easy_r5", "version": "0.2.1", "experimental": true, "qgis_min": "3.22.0", "qgis_max": "3.99.0", "downloads": 24, "uploaded_by": "GISBoost", "upload_datetime": "2026-09-14T02:19:10.591306", "changelog": "0.2.1\n* fix(qt6): every enum access across algorithms/ + gui/ fully qualified\n(e.g. QgsFeatureSink.Flag.FastInsert, not QgsFeatureSink.FastInsert) \u2014\nthe short form is a PyQt5-only convenience that PyQt6 drops, and QGIS\n3.40 can be built against either. 53 call sites, no logic change,\nidentical behaviour under Qt5.\n* fix(matrix): points \u2014 a destination/origin layer whose schema changed on\ndisk after being loaded into QGIS (e.g. columns added by another\nscript/algorithm run) could leave the project holding a stale cached\nfield list; write_points_csv() now raises loudly, naming the missing\nfield(s), instead of silently writing wrong/zero values (#5).\n* perf(runner): EasyR5Runner matrix mode routes origins across a thread\npool (one thread per available core) instead of one at a time \u2014 R5's\nLinkageCache and EgressCostTable are safe to share across origins run in\nparallel, each origin still gets its own RegionalTask/TravelTimeComputer;\nmeasured ~3x wall-clock on a 213-origin job, byte-identical output vs.\nthe old sequential path (#4).\n* feat(resources): real plugin icon \u2014 a point-up hexagon with a\nschematic route network (own composition, own accent color; not a\ncopy of r5r/r5py's sticker) replaces the placeholder \"R5\" square;\nsized 512x512 intrinsic to match easy-OTP's icon and display at the\nsame size in the QGIS Plugin Manager.\n0.2.0\n* feat(setup): DownloadRealizedGtfs \u2014 pick a city + date + variant (realized\nP50/P85 or scheduled) and download that GTFS feed from GISBoost's\ngtfs-dashboard index, into a folder ready for Build R5 network. No GitHub\nAPI calls (the manifest is a static CDN file); no checksum published, so\nthe download is CRC-checked and sniffed for the GTFS files only.\n* feat(gui): 'Plugins > Easy-R5 > Download transit recordings\u2026' \u2014 a\ncascading city > month > day picker over the live index. The plugin's\nfirst and only dialog (see docs/prd/PR_easy-R5_v02_realized-gtfs.md \u00a71).\n* refactor(core): downloads \u2014 HTTP download + safe zip/tar extraction moved\nout of DownloadR5 so both Setup algorithms share it.\n* feat(core): gtfs_dashboard \u2014 manifest client (fetch + disk cache + resolve).\n0.1.0\n* M5 \u2014 isochrones, population layers, release.\n* fix(deps): drop the pip fallback from the openpyxl bootstrap \u2014 urllib\nwheel + _vendor/ only, never shell out to pip (CLAUDE.md).\n* fix(java): -XX:+ExitOnOutOfMemoryError so an R5 worker-thread OOM cannot\nhang the process; runner reports setup vs routing time for a sane estimate.\n* fix(analysis): validate DATE/DEPARTURE_TIME before the JVM; RunAccessibility\nlifts MAX_TRIP_DURATION to cover a larger cutoff and joins results by id;\nGenerateIsochrones takes exactly one percentile; output field percentiles\n-> percentile (PRD 5.2).\n* feat(analysis): GenerateIsochrones \u2014 travel-time polygons per cutoff from\nN points (grid -> one-origin matrix -> contour in QGIS; R5 does not\ncontour). Styled output, per-cutoff error isolation.\n* feat(analysis): PreparePopulationLayer + PopulationOverlay \u2014 ported from\neasy-OTP (GUS NSP 2021 -> census geometry; area-weighted onto a hex grid,\nfractional). XLSX read in a subprocess. openpyxl bootstrap (CLAUDE.md\nexception, confirmed).\n* feat: styles/ QML auto-applied to matrix / accessibility / isochrone\noutputs.\n* feat(i18n): easy_r5.pro + i18n/easy_r5_pl.ts/.qm (partial PL \u2014 see #1).\n* docs: README rewritten with real usage + the hex-grid recipe;\nKNOWN_ISSUES.md.\n* No hex-grid algorithm (PRD \u00a74.7) and no service-minutes / scenarios /\nitineraries / GTFS-RT (\u00a79) \u2014 v0.2+.\n0.0.4\n* M4 \u2014 cumulative-opportunity accessibility.\n* feat(analysis): RunAccessibility \u2014 opportunities reachable per origin /\ncutoff / percentile, summed in Python from the matrix (STEP, LOGISTIC,\nEXPONENTIAL decay); long CSV in r5r's layout + an ORIGINS copy with\nacc_<opp>_p<pct>_c<cutoff> fields.\n* feat(core): accessibility \u2014 decay weights + the cumulative sum.\n* refactor: shared matrix machinery (gates, point export, estimate, batched\nprocesses, walk-only guard) moved to algorithms/_matrix_base.MatrixBase.\n* docs: validation-gdansk.md \u2014 RunAccessibility vs r5r's Gda\u0144sk output.\n0.0.3\n* M3 \u2014 travel-time matrix (the flagship algorithm).\n* feat(analysis): RunTravelTimeMatrix \u2014 one-to-many / many-to-many travel\ntimes over a departure window; percentiles, batched processes, sampled\ntime estimate, hard dead-date gate + post-run walk-only detector.\n* feat(java): EasyR5Runner command \"matrix\" \u2014 ports the verified\nProbe.java RegionalTask / FreeFormPointSet recipe.\n* feat(core): points (layer -> id,lon,lat CSV, EPSG:4326, stable ids),\nmatrix (batch merge, systematic sample, nearest served days).\n0.0.2\n* M2 \u2014 network building + GTFS service-day validation.\n* feat(setup): BuildNetwork \u2014 build a cached network.dat from an OSM extract\nand a folder of GTFS feeds; cache keyed by input hash + R5 version;\nFORCE_REBUILD bypasses it.\n* feat: network.json carries service_days \u2014 active trip count per date over\na 90-day window (calendar.txt + calendar_dates.txt, type 1/2 exceptions).\n* feat(java): EasyR5Runner command \"build\".\n0.0.1\n* M1 \u2014 plugin skeleton + R5 engine on disk.\n* feat: Processing provider \"Easy-R5\" (id easyr5).\n* feat(setup): DownloadR5 \u2014 Temurin 21 JDK + r5-v7.6-all.jar, SHA-256\nverified, paths saved under the easy_r5/ QSettings namespace, one-file\nJava runner compiled to <target>/runner_cache/.\n* feat(diagnostics): TestR5Setup \u2014 reports each check independently\n(JDK / jar / runner / optional command=info on a network.dat).\n* feat(java): EasyR5Runner.java \u2014 command \"info\" only; full stdout protocol.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/easy_r5/version/0.2.1/download/"}