{"name": "GPS Road Builder (RidgeSlide)", "package_name": "gps_road_builder_ridgeslide", "version": "1.2.1", "experimental": false, "qgis_min": "3.22.0", "qgis_max": "4.99.0", "downloads": 182, "uploaded_by": "aleko", "upload_datetime": "2026-08-22T11:59:33.423110", "changelog": "1.2.1 - Sprint 17: QGIS Processing Provider and Toolbox integration\n- Added a stable GPS Road Builder provider with three Processing algorithms\nfor Toolbox, Modeler and Batch Processing workflows.\n- Processing algorithms reuse the shared QGIS adapter, support progress and\ncancellation, and expose stable machine-readable IDs and output schemas.\n- The provider now displays the GPS Road Builder icon instead of the default\nProcessing gear in the Toolbox.\n1.2.0 - Sprints 15\u201316: QGIS 4 / Qt6 support and 12-language UI\n- One Qt5/Qt6-compatible codebase was manually verified in QGIS 3.44 and\nQGIS 4.2; qgisMaximumVersion is now 4.99 (no supportsQt6 flag)\n- Added Chinese, Hindi, Spanish, Arabic (RTL), French, Portuguese, German,\nIndonesian, Thai and Vietnamese, with SVG language flags and persisted\nlive switching; responsive controls accommodate long labels\n- Fixed PyQt5 overloaded language-selector signals and made the Qt6 checked\ncheckbox state visible with a bundled white checkmark\n1.0.3 - Sprint 14: complete live RU/EN switching\n- Added a shared retranslateUi contract for tabs, widgets and dialogs\n- Live language changes now update labels, tooltips, combos, tables,\nresult/stage text, duration units and the QGIS plugin action\n- Combo labels preserve itemData/current values and language persists in QSettings\n1.0.2 - QGIS repository security scan (Bandit)\n- Resolved the Bandit findings that blocked upload by marking them as\nreviewed false positives with justified per-line # nosec codes: reading\nthe plugin's OWN checkpoint cache (pickle, B301); running the QGIS\npython's own pip in the dependency installer (subprocess, B404/B603);\nand a few intentional best-effort error swallows (B110). No behaviour\nchange. Secrets, flake8, file-permission and suspicious-file scans were\nalready clean\n1.0.1 - RidgeSlide sub-brand in the name\n- Display name is now \"GPS Road Builder (RidgeSlide)\" to link the plugin to\nits RidgeSlide engine while staying discoverable; the window title and\nheader match. The package folder and settings keys are unchanged\n1.0.0 - Sprint 13: RidgeSlide boundary and first production release\n- RidgeSlide carved into a clear, QGIS-agnostic core: renamed core/slide ->\ncore/ridgeslide (files refine.py, kernel.py) with a small public API\nfa\u00e7ade (RidgeSlide / RidgeSlideConfig / RidgeSlideResult) so the method can\nbe reused as a library; the plugin pipeline stays a client\n- The RidgeSlide core is MIT-licensed (core/ridgeslide/LICENSE + NOTICE, with\nthe paulmach/slide + Guo 2020 lineage); the plugin stays GPLv3 (compatible)\n- Added CITATION.cff and AUTHORS; documented the dual licensing\n- A guard test enforces that the algorithm core imports no qgis/PyQt\n- First production release (1.0.0)\n0.17.0 - Sprint 12: topology and an accurate preset\n- Break at crossings (Post-process): split two edges that cross\ngeometrically but share no node, inserting a real junction (GRASS\nv.clean break) \u2014 improves connectivity of visually crossing but broken\nroads. Optional (creates a false junction at bridges/overpasses)\n- Junction consolidation (Post-process): merge clusters of nearby junction\nnodes into one, cleaning the bushy intersections from 8-connectivity\n- New preset \"Sparse / RidgeSlide (accurate)\": finer cell/resample, less\nsmoothing and micro-loop cleanup for geometry closer to the reference\n(slower \u2014 numba recommended)\n0.16.0 - Sprint 11: UI polish, RidgeSlide branding, QGIS 3.x\n- Window: the minimize button now works (WindowMinimizeButtonHint)\n- Tabs: reverted the bold font that clipped the active tab's last letter;\nselection is shown by colour only, with a robust tab width (no clipping)\n- About dialog redesigned as a styled card (like Support), highlighting the\nRidgeSlide method and its authorship\n- Support dialog: removed the \"Maybe later\" button (donate or close via X)\n- Language switcher shows real flag icons (Windows does not render flag\nemoji)\n- UI now says \"RidgeSlide\" everywhere instead of bare \"Slide\" (tab, method,\nbackend, presets, tooltips); internal setting values are unchanged\n- Compatibility: documented support for the whole QGIS 3.x branch (tested on\n3.44 \"Solothurn\"); qgisMaximumVersion=3.99 keeps 4.x/Qt6 out until it is\nseparately supported\n0.15.0 - Sprint 10: scenario presets\n- New one-click presets beyond forestry, since the engine is\nmethod-agnostic: \"Dense tracks (running / cycling)\", \"Urban vehicles /\nlogistics\", \"OSM traces (heterogeneous)\" and \"Sparse vessels / AIS\"\n- Each encodes assumptions about the data (cell size, resample step, gap\nsegmentation, threshold mode) as a starting point \u2014 expect to tune\n- Dense/urban/OSM use the RidgeSlide method; urban and OSM use the robust\npercentile threshold; AIS uses coarse scale and wide segmentation gaps\n0.14.2 - More connectivity + post-processing logging\n- Directional bridge: connect dead-ends that face each other (their road\ncontinuations point at one another) even beyond the normal radius\n- Component stitching: join the nearest nodes of separate components into one\nnetwork (Kruskal over k-nearest neighbours), up to a max distance\n- Post-processing runs now log their full settings and result counts\n(bridged/snapped/faced/stitched/dropped) to the file log and the run\nmanifest, like build runs\n0.14.1 - Node-to-edge gap bridging (post-processing connectivity)\n- \"Bridge gaps\" now also snaps a dangling end to the nearest point on a\nneighbouring edge (a T-gap), splitting that edge \u2014 not only end-to-end.\nThis is the common road gap that end-to-end bridging could not close, so\npost-processing barely changed the graph before. The Post-process log now\nreports bridged/snapped/components-dropped counts\n0.14.0 - Sprint 9: new input sources\n- Load input from a project vector layer (points or lines) or a GPX/KML/SHP\nfile, not only CSV/XLSX. Vector inputs need no coordinate columns \u2014 the\ngeometry provides them; device/time are auto-detected from field names or\nsynthesized; line layers treat each line as one track; GPX uses its\ntrack_points sub-layer\n- Data tab: an \"Input source\" selector (files / project layer / vector file)\n0.13.1 - RidgeSlide authorship\n- Documentation states throughout that RidgeSlide was conceived, generalized,\ndeveloped and completed by Alexander Kobyakov (README, ALGORITHMS,\nUSER_GUIDE, metadata)\n0.13.0 - Sprint 8: product (docs, RidgeSlide, UI fixes)\n- The custom Slide reimplementation is now named RidgeSlide (roads = ridges\nof the density surface); metadata/README/ALGORITHMS updated accordingly\n- Marked production-ready (experimental=False); positioning generalized\nbeyond forestry (logistics, sports, off-road, vessels, OSM, ...)\n- New docs at repo root: rewritten README, USER_GUIDE.md, ALGORITHMS.md\n- UI fixes: the active tab no longer clips its last letter (bold applied to\nall tab states); the AOI group on the Data tab is now visible without\nscrolling; the build script excludes test_temp/memory\n0.12.1 - Sparse/Slide threshold fix (per-tile Otsu blow-out)\n- The ui5 run showed per-tile Otsu thresholds ranging 0.03..374: tiles with\na town/yard got a huge threshold and dropped almost all roads (sparse\nresult). The \"Sparse / Slide\" preset now uses the percentile threshold\n(scale-adaptive per tile) instead of Otsu, and a slightly finer cell (10 m)\n- Tip: lower the threshold percentile for a denser network\n0.12.0 - Sprint 7: KDE quality and device attributes\n- KDE quality (WS-KDE): percentile threshold mode (robust on sparse data\nwhere Otsu cuts above roads); KDE now uses all points incl. single fixes;\nmask hole-filling and micro-loop removal kill the skeleton \"crossings\";\nmedial-axis (centerline) skeletonizer option; the sparse KDE preset uses\nthese by default\n- Device attributes (WS-Dev): n_devices per edge (unique GPS devices near\nthe edge), written to the layer, GeoJSON and GraphML\n- WS-Perf: resuming from a checkpoint already skips the input re-read\n(Sprint 5); parallel tiles (A5) intentionally deferred \u2014 numba already\nparallelizes Slide across cores and a process pool is unsafe in QGIS\n0.11.4 - Drop remaining \"FGIS LK\" mentions\n- Removed \"\u0424\u0413\u0418\u0421 \u041b\u041a\" from the KDE method label and its tooltip (kept only the\ngeneric sparse-data description)\n0.11.3 - Preset naming fix\n- Sparse presets renamed: \"\u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 / Slide (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434.)\" and\n\"\u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 / KDE (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c.)\" \u2014 dropped \"\u0424\u0413\u0418\u0421 \u041b\u041a\" from the KDE preset\nname and unified the spelling (\u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435) across the UI\n0.11.2 - Backend clarity (numba vs numpy)\n- The log now records the resolved Slide backend (setting -> using) so it is\nclear whether numba or numpy actually ran\n- The numpy backend option is relabelled \"numpy (slow, reference)\" and the\nSlide-backend tooltip explains that installing numba on the Dependencies\ntab does not select it \u2014 pick \"Auto\" or \"numba\"\n0.11.1 - Sparse/Slide performance fix\n- \"Sparse / Slide\" preset: numba backend + coarse resample (K=50, gap 700)\nso sparse points no longer explode into tens of millions (was ~83M / 225\ntiles); coarser cell for fewer tiles\n- Guard: Slide on the numpy backend with >15M points now aborts early with\nguidance instead of grinding for hours; a warning is logged when numba is\navailable but numpy is selected\n- Log now shows the resample point-count inflation (before/after/ratio)\n0.11.0 - Sprint 6: post-processing and connectivity\n- Connectivity (WS-Conn): bridge dangling ends within a radius, drop small\ncomponents, keep only the largest network; optional morphological mask\nclosing for the Slide method too (core/graph/connect.py)\n- New \"Post-process\" tab (WS-Post): improve an already-built graph (or a\nchosen line layer) without a full rebuild \u2014 bridge gaps, smooth, clean\ncomponents; shared orchestrator core/graph/postops.py\n- Area of interest (WS-AOI): clip input points by a polygon from a file or a\nproject layer before processing (removes points in the sea / out of zone)\n- Connectivity/AOI settings also apply during a normal build\n0.10.0 - Sprint 5: transparency and a working result\n- Logging for parameter tuning (WS-L): the run now logs the full resolved\nsettings and per-stage metrics (per-tile binarization threshold, edges/\nnodes before/after merge and cleanup) with per-stage durations; a compact\nper-run manifest is appended to gps_road_builder_runs.jsonl; log rotation\nraised to 5 MB; resuming from a checkpoint no longer re-reads the input\n- New \"Sparse / Slide (recommended)\" preset \u2014 Slide builds a connected\nnetwork on sparse FGIS LK data; the KDE preset is marked experimental\n- Polyline smoothing (WS-Smooth): optional Chaikin smoothing removes the\nraster-skeleton stair-steps (Graph tab, keeps edge ends fixed)\n- UI fixes (WS-U): the tab bar no longer scrolls away (scrolling moved\ninside each tab) and tab titles are no longer truncated (+ tab tooltips)\n- Presets now apply to all parameter tabs, not just Density/Graph\n0.9.0 - Sprint 4 (WS-G): quality and attributes\n- Graph post-cleaning against fragmentation: pass-through (degree-2) nodes\nare merged into single polyline edges (always on); optional removal of\nshort dangling spurs (Graph tab, \"remove dangling spurs shorter than\")\n- Edge attributes: road_class (main/improved/ordinary/winter by traversal\nfrequency quantiles) and a \"reconstructed\" flag (inferred segment with no\ntrack coverage); written to the layer, GeoJSON and GraphML\n- REB / anti-spoofing preprocessing filter (Preprocess tab): drops teleports\n(>120 km/h), jumps >200 m in <60 s and A->B->C spikes\n- Overview histograms use log-spaced bins with range labels, so skewed\nfrequency/length distributions are readable instead of one dominant bin\n0.8.1 - WS-E completion: tooltips and method-aware fields\n- Tooltips on every parameter of the Preprocess, Density/Slide, Graph and\nScale tabs (plain-language hints with recommendations)\n- Fields irrelevant to the chosen method are greyed out: KDE disables\nresample, Slide backend, sigma1/sigma2, kernel sharpness and Slide loops;\nSlide disables KDE radius/buffer\n0.8.0 - Big update, Sprint 3: tester convenience\n- Checkpoints: cleaned points and projected tracks are saved to a chosen\ncache folder; a run can start from a saved stage or stop after a stage, so\nyou re-tune later steps without re-running the expensive early ones\n- Presets can be saved to and loaded from JSON files (not only the built-ins)\n- Output tab: cache folder, \"start from stage\" and \"stop after stage\"\n0.7.0 - Big update, Sprint 2: sparse-data method\n- New \"KDE + buffer\" method for sparse GPS logging data (FGIS LK: a fix every\n15 min / 5 km) \u2014 kernel density on points, gap bridging by a buffer, no\nresampling/Slide; the Guo \"Density + Slide\" method stays for dense tracks\n- Method and backend selection in the UI (Slide backend, skeletonizer, KDE\nradius/buffer); \"Sparse data / FGIS LK\" preset\n0.6.1 - Big update, Sprint 1: performance on large sparse datasets\n- Tile assignment via per-track bbox (was O(tiles*tracks)); single vectorized\nprojection; near-duplicate thinning (numba); default cell 5 m + raster\nguard; file log fixed, step plan/ETA/available-libraries reporting\n0.6.0 - Phase 5: polish\n- Export to GeoJSON / GraphML (pure) and SHP / GeoPackage (QgsVectorFileWriter)\n- Rotating file log in the QGIS profile for debugging\n- User guide (docs/USER_GUIDE.md), README, cross-platform CI (Linux + Windows)\n- Plugin packaging script excluding data/docs/tests\n0.5.0 - Phase 4: functional GUI\n- Real tab controls (Data...Output), field presets, tooltips, result\nhistograms; Build runs the pipeline in a QgsTask and adds the road layer\nstyled by traversal frequency; progress, log and cancel\n0.4.0 - Phase 3: scalability\n- Split-and-merge over overlapping tiles with boundary fixing; close-node\nmerge that also cleans junction clusters\n0.3.0 - Phase 2: MVP pipeline\n- Density surface, improved Slide (numpy reference + numba backend, verified\nagainst the reference implementation), skeleton -> graph, edge weights and\n(f, l) artifact filtering\n0.2.0 - Phase 1: data and CRS\n- Robust CSV/XLSX reader (delimiter and datetime auto-detection), cleaning,\ndeduplication, segmentation, equidistant resampling; data-centered\nTransverse Mercator working CRS\n0.1.0 - Phase 0: plugin skeleton and UI chassis\n- Tabbed main dialog (header with language selector, Support and About)\n- Dependency installer framework (pip-into-target and prebuilt-wheels), no\nsilent auto-install; runs only on explicit user action\n- Background task scaffold (QgsTask), settings persistence, RU/EN interface\n- Offline unit tests and CI", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/gps_road_builder_ridgeslide/version/1.2.1/download/"}