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