{"name": "Easy-OTP", "package_name": "easy_otp", "version": "0.7.0", "experimental": false, "qgis_min": "3.22.0", "qgis_max": "3.99.0", "downloads": 106, "uploaded_by": "GISBoost", "upload_datetime": "2026-08-06T02:19:22.698815", "changelog": "0.7.0\n* Analysis \u2014 RouteViaPoints (N-6):\n- feat(analysis): RouteViaPoints \u2014 city tour planner: supply a START point,\nan END point, and an optional layer of via-points (landmarks) in any order;\nthe plugin automatically computes a sensible visit order using\nnearest-neighbour + 2-opt heuristic (pure Python, haversine distance),\nthen makes one OTP /plan query per segment (N+1 sequential queries).\n- Transport mode selectable: WALK (default), BICYCLE, CAR, TRANSIT,WALK.\nTRANSIT,WALK requires a GTFS folder; other modes use a street-only graph.\nGTFS date validation warns when the analysis date falls outside the service\ncalendar or on a weekend.\n- Output: one LineString feature per leg, attributed with segment_order,\nfrom_label, to_label, duration_min, distance_m, mode, via_point_id.\nTRANSIT,WALK routes produce multiple features per segment (one per leg).\n- Soft-fail: all unroutable segments collected and reported together so the\nuser sees every problematic via-point at once.\n- Soft warning when more than 20 via-points are supplied.\n* Realtime \u2014 RT-3 generalization:\n- feat(realtime): RecordGtfsRt duration capped at 1500 min (25h); new\nspan-check warning in BuildRealizedGtfs when an archive spans more\nthan ~one service day (RT3-1).\n- feat(realtime): BuildRealizedGtfs supports multi-file static GTFS via\nSTATIC_GTFS_EXTRA (e.g. Krak\u00f3w's separate tram/bus feeds) (RT3-2).\n- feat(realtime): frozen/stale GTFS-RT feed detection \u2014 hash-based\nstreak warning in RecordGtfsRt (FREEZE_WARNING_THRESHOLD), snapshot\ndeduplication in BuildRealizedGtfs (DEDUPLICATE_FROZEN_SNAPSHOTS)\n(RT3-3).\n- feat(realtime): reconcile repeated predictions for the same trip by\nlead time \u2014 RECONCILE_LAST_SNAPSHOT (default True); documented,\nintentional shift in P50/P85 output on existing archives (RT3-4).\n- feat(realtime): MATCHING_MODE (AUTO/TRIP_ID/ROUTE_STOP_FALLBACK) \u2014\nroute_id+stop_id fallback matching for feeds with a permanently\ndisjoint trip_id namespace vs. the static GTFS (Pozna\u0144/Krak\u00f3w);\nfails fast with a clear message instead of a silent empty result\n(RT3-5).\n- feat(realtime): SEGMENT_SOURCE_MODE (AUTO/PER_MESSAGE/\nCROSS_SNAPSHOT) \u2014 stitches segment observations across snapshots for\nnext-stop-only GTFS-RT feeds (Pozna\u0144); PER_MESSAGE (today's\nbehaviour) is unchanged for already-working feeds (RT3-6).\n0.6.0\n* Analysis \u2014 Network & Accessibility (new algorithms):\n- feat(analysis): GenerateIsochrones (N-1) \u2014 /isochrone polygons for 1..N\norigins, FROM/TO direction, multiple cutoffs; optional street-only graph\nfor non-transit modes (no GTFS needed).\n- feat(analysis): GenerateIsochronesOverTime (N-2) \u2014 one point, isochrones\nacross a time window; time field drives the Temporal Controller.\n- feat(analysis): RunServiceCoverage (N-3) \u2014 multi-point service coverage;\nreachable-count raster + optional hex/square/own-layer aggregation.\n- feat(analysis): RunOriginDestinationTimes (N-4) \u2014 per-origin detailed\ntrip statistics to one destination (minutes); ThreadPoolExecutor;\n404/snapping mitigations (maxWalkDistance lever, optional snap-to-network,\nerrorId diagnostics).\n- feat(analysis): RunTravelTimeMatrix (N-5) \u2014 N\u00d7M OD travel-time matrix;\nlong/wide CSV (XLSX if openpyxl present), optional OD line layer.\n- feat(core): isochrone_client and plan_client REST clients (urllib;\nOTP 1.5 /isochrone and /plan endpoints).\n0.5.0\n* Analysis:\n- feat(analysis): RunTemporalAccessibility now saves origin point as a named\noutput vector layer (point geometry + CRS) with run metadata fields:\nrun_date, run_time, time_window, interval_min, router_id, arrive_by.\n* i18n:\n- feat(i18n): Polish (pl) UI translation \u2014 easy_otp_pl.qm compiled and\nbundled; tr() context fixed to class name so Processing strings translate.\n0.4.0\n* Realtime (new section):\n- feat(realtime): RT-3 BuildRealizedGtfs \u2014 reconstruct realized static GTFS\n(P50 median + P85 85th-percentile feeds) from a RecordGtfsRt snapshot archive;\naggregation per stop-pair segment (route_id, direction_id, from_stop_id,\nto_stop_id); output feeds work directly with RunTemporalAccessibility.\nRequires google.protobuf (bootstrapped on first use via dependencies.py).\n- feat(realtime): RT-2 RecordGtfsRt \u2014 GTFS-RT TripUpdates snapshot archiver;\npolls a feed at a configurable interval (15\u2013600 s) and writes raw .pb files\nplus a recording.json manifest; cancel-safe and partial-archive-safe.\n- feat(realtime): RT-1 RunRealtimeAccessibility \u2014 live GTFS-RT TripUpdates feed\nintegrated into OTP stop-time-updater; tri-state RT effectiveness detection\n(effective / not-applied / inconclusive).\n* Other fixes:\n- fix(deps): install openpyxl via in-process urllib wheel download (no admin,\nworks around SSL absence in QGIS 3.22 pip subprocess).\n- fix(ux): OTP server runs in a visible, closeable Java console window; graph\nbuild phase stays windowless.\n0.3.5\n- chore: lower qgisMinimumVersion to 3.22 (verified API/Python compatibility;\nall PyQGIS APIs used since \u22643.14, all Processing IDs since \u22643.16).\n- A-1: arriveBy toggle in RunTemporalAccessibility \u2014 analyse arrive-by\naccessibility in addition to depart-at mode.\n- A-3: Optional XLSX summary report for RunTemporalAccessibility and\nCountFromExistingSurfaces (requires openpyxl).\n- A-2: CompareTemporalAccessibility \u2014 delta raster and classified hex-grid\ndifference between two accessibility scenarios; supports NoData semantics\nfor cells present in only one scenario.\n- fix(security): safe zip extraction and nosec annotations for Bandit HIGH\nfindings (B202, B324, B310, B103).\n- pre-publish: add icon placeholder SVG, easy_otp/LICENSE, rewrite metadata\nabout/changelog, remove qgisMaximumVersion.\n0.2.0\n- R1a: Prepare student layer \u2014 import GUS NSP 2021 Excel into a polygon layer\n(handles raw / wrong / done data states).\n- R1b: Population overlay \u2014 areal interpolation of demographics onto the hex\ngrid; preserves fractional counts (Float field, fixes the integer rounding\nbug present in the reference QGIS model).\n- R2: Download transit data \u2014 automated OSM (Geofabrik) and GTFS (Transitland)\nacquisition with 7-day OSM cache and continental-feed filtering.\n- R3: Download JRE \u2014 automated Eclipse Temurin 8 download (Adoptium API,\nSHA-256 verified) plus the OTP 1.5.0 shaded jar; both paths saved to\nQSettings for hands-off setup.\n- Fix: service-time category thresholds now scale proportionally for\nanalysis windows shorter than 06:00\u201322:00 (a shorter window previously\nforced almost every cell into \"inaccessible\"). Full-window runs are\nunchanged. A warning is logged whenever scaling is applied.\n0.1.0\n- Initial release: TestOtpServer, GenerateHexGrid,\nRunTemporalAccessibility, CountFromExistingSurfaces.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/easy_otp/version/0.7.0/download/"}