diff --git a/AGENTS.md b/AGENTS.md index a51d3ce9c..d054f3875 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,9 @@ RustGIS is a fast, free and open-source GIS in pure Rust for mapping, analyzing geospatial data, on the desktop and in the browser. Its architecture: layered crates, everything is a command, a thin egui front end, headless screenshots for UI work. +Before picking work, read [ROADMAP.md](ROADMAP.md) (check Underway) and +[CONTRIBUTING.md](CONTRIBUTING.md) (what to coordinate first). + ## Never crash - No `unwrap()`, `expect()`, `panic!`, `unreachable!`, `todo!` in non-test code; no `unsafe` (`unsafe_code = "forbid"`). Crate roots carry the `#![deny(clippy::unwrap_used, …)]` block. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..65ae726a5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# Contributing to RustGIS + +Contributions are welcome. This page covers what to work on and how to propose it. For build, +test, docs and release mechanics see [docs/contributing.md](docs/contributing.md); for code +conventions see [AGENTS.md](AGENTS.md). + +## Most roadmap items have no issue + +[ROADMAP.md](ROADMAP.md) lists where RustGIS is heading. Only a few of its items link to an +issue; **most features have no issue yet**. Don't wait for one to appear before starting. If +something on the roadmap (or not on it) interests you, propose it and open a pull request. + +## How to contribute a feature + +1. **Check for an existing issue.** Search the + [issues](https://github.com/opengeos/RustGIS/issues) and the roadmap. If there is an issue, + comment on it to say you're taking it. +2. **Write a short proposal** if there is no issue. It covers: + - the problem or workflow it serves; + - what you plan to build: the commands it adds, where it sits in the ribbon, which formats or + tools are involved; + - which crates it touches and whether it adds a dependency; + - how you will test it. + + Put it in an issue with the + [feature request](https://github.com/opengeos/RustGIS/issues/new?template=feature_request.yml) + form, or in the description of a draft pull request. For changes that need coordination (see + below) use an issue and wait for a maintainer's reply; otherwise either works. +3. **Open a pull request.** Draft pull requests are welcome early, to get feedback on the + approach before the work is finished. Link the issue (`Closes #123`) and fill in the + [pull request template](.github/pull_request_template.md). Before it is ready for review, it + must meet the rules and quality gates in [AGENTS.md](AGENTS.md). + +## Pick freely or coordinate first + +- **Pick freely**: roadmap items marked _(open)_ are self-contained. Open a pull request directly, + with the proposal in its description; an issue is optional. +- **Coordinate first**: open a proposal issue and wait for a maintainer's reply before writing much + code if your change + - changes the data model (`Feature`, `Coord`, `Renderer`); + - adds a dependency or a crate; + - changes the `.rgis` project format, or an existing command's id or parameters (the CLI, + Python, MCP and saved scripts call commands by id); + - changes the plugin interface; + - falls under _Exploratory_ in the roadmap. + +Roadmap themes are not releases or an order; an item moves to Done when it lands. A +pull request that lands a roadmap item, or an item of [GEOLIBRE_PARITY.md](GEOLIBRE_PARITY.md), +updates that file in the same change. diff --git a/GEOLIBRE_PARITY.md b/GEOLIBRE_PARITY.md new file mode 100644 index 000000000..838bff6c7 --- /dev/null +++ b/GEOLIBRE_PARITY.md @@ -0,0 +1,311 @@ +# Feature parity with GeoLibre + +_Last reviewed: 2026-10-23 (v0.3.0)._ + +What [GeoLibre v3.4.0](https://github.com/opengeos/GeoLibre/tree/v3.4.0) offers and where RustGIS stands: +**missing** or **partial**, or ticked when done. It moved here from [#77](https://github.com/opengeos/RustGIS/issues/77) so that anyone can keep it +current: **tick or update an item in the pull request that lands it**. Where an item is planned, +_Roadmap_ names its theme in [ROADMAP.md](ROADMAP.md). The GeoLibre and Whitebox geoprocessing +suite RustGIS runs is not counted either way. + +Sources: GeoLibre [v3.4.0](https://github.com/opengeos/GeoLibre/tree/v3.4.0) `docs/features.md`, +`docs/data-formats.md` and the other GeoLibre docs named per +section; RustGIS [ROADMAP.md](ROADMAP.md), [docs/](docs/) and the command registry +(`crates/engine/src/cmd`). Some items may be out of scope for a pure-Rust GIS (noted inline); +strike those through with a reason rather than leaving them open. + +## Data formats & sources +_GeoLibre: docs/data-formats.md, docs/features.md › Adding data, SQL and databases_ + +- [x] **GeoPackage, GeoParquet, Shapefile (and KMZ) export** ([#92](https://github.com/opengeos/RustGIS/issues/92)): GeoLibre writes GeoJSON, + GeoParquet, Shapefile, GeoPackage, CSV, KML and KMZ; RustGIS writes all of them, plus + FlatGeobuf, GPX and WKT. +- [x] **Shapefile and GeoPackage in the web app** ([#94](https://github.com/opengeos/RustGIS/issues/94), [#95](https://github.com/opengeos/RustGIS/issues/95)). +- [ ] **Native KML/KMZ, GPX, GML, DXF/DWG, File Geodatabase, MapInfo and OSM PBF readers**: + partial. KML/KMZ (styles and folders) and GPX (split into layers) are native on the desktop and + the web since [#97](https://github.com/opengeos/RustGIS/issues/97); GML, MapInfo MIF/MID, OSM PBF and TopoJSON since [#122](https://github.com/opengeos/RustGIS/issues/122); KML GroundOverlays as + raster layers since [#123](https://github.com/opengeos/RustGIS/issues/123); DXF (blocks, hatches, splines, text; a CAD layer picked with + "layer") since [#159](https://github.com/opengeos/RustGIS/issues/159); Esri File Geodatabases without GDAL on the desktop (3D multipatches as + footprints). Still missing: DWG (GDAL only) and File Geodatabase in the web app. +- [x] **Excel, LandXML, encoded polylines, GeoRSS** ([#118](https://github.com/opengeos/RustGIS/issues/118)). +- [x] **Delimited text with a projected CRS or address geocoding**: x/y columns in any coordinate + system, WKT columns and any separator ([#115](https://github.com/opengeos/RustGIS/issues/115)); Find Place and address-table geocoding ([#127](https://github.com/opengeos/RustGIS/issues/127)). +- [x] **Remote vector and COG by URL**: Add Data › From URL ([#116](https://github.com/opengeos/RustGIS/issues/116)); COGs ([#132](https://github.com/opengeos/RustGIS/issues/132)), FlatGeobuf and + GeoParquet ([#152](https://github.com/opengeos/RustGIS/issues/152)) read in place by HTTP range on the desktop and the web, from `s3://` too + ([#150](https://github.com/opengeos/RustGIS/issues/150)). +- [x] **PMTiles and MBTiles** ([#74](https://github.com/opengeos/RustGIS/issues/74), [#113](https://github.com/opengeos/RustGIS/issues/113)): raster and vector archives, desktop and web. +- [ ] **Multidimensional rasters**: Zarr/Icechunk, NetCDF-4/HDF5 and kerchunk, with variable and + dimension pickers, hyperspectral RGB and a 3D image cube. Partial: Zarr 2 and 3 stores with + variable and dimension pickers and CF dates ([#147](https://github.com/opengeos/RustGIS/issues/147)), NetCDF/HDF variables through GDAL on the + desktop ([#117](https://github.com/opengeos/RustGIS/issues/117)), data cubes on the time slider with trends. Still missing: native + NetCDF-4/HDF5 ([#396](https://github.com/opengeos/RustGIS/issues/396), _Exploratory_), kerchunk, Icechunk, sharded Zarr 3, hyperspectral RGB and + the 3D cube. +- [x] **GDAL raster formats beyond GeoTIFF and ASCII grid** ([#117](https://github.com/opengeos/RustGIS/issues/117), desktop). +- [ ] **OGC services**: partial. WMS, WMTS, WFS and OGC API Features from their capabilities + ([#120](https://github.com/opengeos/RustGIS/issues/120)), OGC API Tiles ([#144](https://github.com/opengeos/RustGIS/issues/144)), WCS and CSW ([#178](https://github.com/opengeos/RustGIS/issues/178)). Still missing: auto-refresh (_Roadmap: any + time_). +- [ ] **ArcGIS services**: FeatureServer, MapServer, ImageServer and VectorTileServer, with OAuth + and a Portal browser. Partial: the four layer types through From Service… ([#120](https://github.com/opengeos/RustGIS/issues/120)); a token in + the service address is sent with its requests (saved sources drop it). Missing: OAuth and a + Portal browser (_Roadmap: data at the source_). +- [ ] **STAC browser and cloud catalogs**: STAC, Planetary Computer, Earth Engine, Overture, + Source Cooperative, NASA Earthdata, Planet and Hugging Face. Partial: STAC Search ([#128](https://github.com/opengeos/RustGIS/issues/128)), + Planetary Computer with signed assets ([#144](https://github.com/opengeos/RustGIS/issues/144)), Overture Maps and Source Cooperative ([#158](https://github.com/opengeos/RustGIS/issues/158)), NASA + Earthdata (desktop) and Hugging Face. Missing: Earth Engine and Planet. +- [ ] **Open-data portal browsers**: partial. Overpass and geoBoundaries ([#139](https://github.com/opengeos/RustGIS/issues/139)), CKAN, Socrata and + ArcGIS Hub ([#176](https://github.com/opengeos/RustGIS/issues/176)), four Natural Earth sample layers. Missing: more Natural Earth themes; a Web + Data menu of global and per-country services ([#528](https://github.com/opengeos/RustGIS/issues/528)). +- [ ] **Database connections**: PostgreSQL/PostGIS, SQL Server/Azure SQL with write-back, Apache + Iceberg. Partial: PostGIS ([#125](https://github.com/opengeos/RustGIS/issues/125)), MySQL, MariaDB and SQL Server tables read live on the desktop. + Missing: write-back (_Roadmap: data at the source_) and Iceberg. +- [x] **Spatial SQL workspace** ([#131](https://github.com/opengeos/RustGIS/issues/131)): an SQL pane over DuckDB Spatial on the desktop. The web app + has no in-browser engine yet (_Exploratory_). +- [ ] **Private S3 buckets**: partial. `s3://` addresses, SigV4-signed connections, saved + connections without their secrets and an S3 browser, desktop and web ([#150](https://github.com/opengeos/RustGIS/issues/150)). Missing: SSO, IAM + roles and secrets kept in the keychain (_Roadmap: solid ground_). +- [ ] **3D and media data**: LiDAR (LAS/LAZ/COPC/EPT) as layers, 3D Tiles, I3S, Gaussian splats, + placed glTF models, georeferenced video, geotagged photos, ICESat-2/GEDI. Partial: LAS, LAZ and + COPC as point layers ([#137](https://github.com/opengeos/RustGIS/issues/137)), geotagged photos with thumbnails ([#175](https://github.com/opengeos/RustGIS/issues/175)); the rest is missing. +- [x] **Browser / Data Source Manager** ([#157](https://github.com/opengeos/RustGIS/issues/157)): a Data Sources pane with favourites, recents, + folders, saved services, databases, S3 connections, STAC APIs and a library of public services. +- [x] **Data deep links** (`?data=`, `?style=`, `?tiles=` in [#121](https://github.com/opengeos/RustGIS/issues/121), `?stac=` in [#144](https://github.com/opengeos/RustGIS/issues/144)). + +## Map rendering & 3D +_GeoLibre: docs/features.md › Map workspace, Rendering engines and 3D globe; docs/*-renderer.md_ + +- [ ] **3D terrain**: exaggeration, keyless Terrarium tiles, a custom DEM/COG terrain source, + Cesium World Terrain. Partial: a globe, 2.5D extrusion, and tilt, rotation and terrain (from a + DEM or elevation tiles, [#395](https://github.com/opengeos/RustGIS/issues/395)) in the GPU map. +- [ ] **Full 3D scene content**: 3D Tiles, I3S, point clouds, splats, CZML time-dynamic scenes, + true-Z vectors. Missing (_Roadmap: 3D scenes_, [#726](https://github.com/opengeos/RustGIS/issues/726)). +- [ ] **MapLibre style fidelity**: line labels and road shields, line patterns, hillshade and + fill-extrusion in styles. Partial; vector tiles and labels on the GPU map are underway ([#635](https://github.com/opengeos/RustGIS/issues/635), + [#596](https://github.com/opengeos/RustGIS/issues/596)). +- [ ] **Basemap catalog**: OpenFreeMap, Protomaps, EOX S2 cloudless, regional basemaps, planetary + bodies, thumbnail previews. Partial: a basemap gallery (OpenFreeMap, USGS Imagery), custom tile + layers and a Basemaps plugin. +- [ ] **Multi-map grid**: N synchronized panes. Partial: Side by Side with two maps and linked + views and cursors (_Roadmap: any time_). +- [ ] **Coordinate grids and readouts**: UTM and MGRS/USNG grids, UTM/MGRS/DDM readouts, + grid-reference search, pointer elevation. Partial: graticule, decimal/DMS and Go To XY + (_Roadmap: any time_). +- [ ] **Live data overlays**: RainViewer radar, a Timelapse of annual cloudless imagery, live feeds + (quakes, satellites, fires, AIS). Missing. +- [ ] **Wikipedia cards, Street View/Mapillary, OpenAerialMap, historical imagery**. Missing. +- [ ] **On-map right-click menu with quick analysis**: copy the coordinate, open it elsewhere, run + a buffer, isochrone or viewshed from the point. Missing (_Roadmap: any time_). +- [ ] **Flight simulator, camera tours, atmosphere**. Partial: a First-Person walk and animation + keyframes. +- [ ] ~~Multiple rendering engines (MapLibre, Mapbox, Cesium, ArcGIS)~~: out of scope by design; + RustGIS has its own renderer. + +## Cartography & styling +_GeoLibre: docs/features.md › Layers, styling, and labels; docs/user-guide/styling.md_ + +- [x] **Layer groups**. +- [ ] **Rule-based and expression renderers**: nested rules with scale ranges. Missing; display + filters are per-scale SQL only (_Roadmap: expressions and cartography_). +- [ ] **Heatmap and point-clustering renderers**. Partial: hexagon/square aggregation (_Roadmap: + expressions and cartography_). +- [ ] **More classification methods**: standard deviation, geometric interval, manual breaks. + Partial: Jenks, equal interval, quantile (_Roadmap: fixes and quick wins_). +- [ ] **Symbol library**: a marker library, custom SVG/PNG markers, fill patterns, pie/donut/bar + diagrams, arrow lines, inverted-polygon masks, geometry generators. Partial: 5 marker shapes + (_Roadmap: expressions and cartography_ for markers, patterns and a library). +- [ ] **Style interchange**: import/export SLD, QGIS QML, Mapbox GL JSON. Partial: MapLibre style + export and `.rgisstyle` (_Roadmap: expressions and cartography_ for QML and SLD import). +- [ ] **Smart styling**: automatic palette on add, one-click style suggestions. Missing. +- [ ] **Label engine depth**: expression labels, offset, rotation, wrap, case, priority, + de-duplication, number formats. Partial: label classes with SQL queries, field labels with + placement and scale ranges; a labeling pane is underway ([#618](https://github.com/opengeos/RustGIS/issues/618), [#722](https://github.com/opengeos/RustGIS/issues/722)). Expression labels: + _Roadmap: expressions and cartography_. +- [ ] **On-map legend and colorbar controls**. Partial: the legend is in Contents and layouts only + (_Roadmap: expressions and cartography_). +- [ ] **Popup and tooltip designer**: field picking, formats (date, link, image), an expression + title, hover tooltips. Partial: popup modes only (_Roadmap: expressions and cartography_). +- [ ] **Raster histogram stretch UI and Raster Attribute Table**. Partial: stretch types and DRA + (_Roadmap: expressions and cartography_). +- [ ] **Colour-ramp library and style presets manager**. Partial: custom colour ramps and QGIS, + GDAL and GMT palette files. + +## Attribute data & editing +_GeoLibre: docs/features.md › Attribute data and expressions; docs/arcgis-editing.md_ + +- [x] **Vertex editing**: move, add and delete vertices. +- [ ] **Topological digitizing and CAD dimensions**: shared-edge drawing, dimension lines, + building massing. Partial: snapping, topology validation, traverse. +- [ ] **Write-back to sources**: GeoPackage, GeoJSON, PostGIS, SQL Server, ArcGIS FeatureService. + Missing; edits stay in the project (_Roadmap: data at the source_ for GeoPackage and PostGIS). +- [ ] **Expression builder and engine**: one engine shared by filters, labels, styles and Calculate + Field, with a function reference. Partial: Calculate Field is `field op field/number` + (_Roadmap: expressions and cartography_). +- [ ] **Virtual fields and persistent attribute joins**. Missing; relationships exist (_Roadmap: + data at the source_; a one-off join field tool under solid ground). +- [ ] **Attribute form designer**: widgets, constraints, conditional visibility. Partial: domains, + subtypes, attribute rules (_Roadmap: data at the source_). +- [ ] **Editor tracking fields**: created/edited by and at. Partial: archiving keeps edit times + (_Roadmap: data at the source_). +- [ ] **Table column management**: rename, hide and reorder columns, a column explorer. Partial: + sort, filter, add/delete field (_Roadmap: data at the source_). +- [ ] **Quick filters**: per-field checkboxes and range/date controls. Partial: a definition query + (_Roadmap: expressions and cartography_). +- [ ] **Selection gestures**: polygon, freehand, radius. Partial: click and box; Neighborhood + Explorer selects by radius (_Roadmap: fixes and quick wins_). +- [ ] **Charts panel and dashboards**: histogram, scatter, bar, line, box and pie charts, + indicators, cross-filtering. Partial: Exploratory Analysis, Infographics, layout/report charts + (_Roadmap: analysis_ for charts linked to the selection). + +## Analysis +_GeoLibre: docs/features.md › Processing and analysis; docs/user-guide/processing.md, +model-builder.md, segmentation.md, obia.md_ + +- [ ] **Spatial join, intersect, union**. Partial: spatial join, clip and erase are built in; + intersect, union, identity and near are missing (_Roadmap: solid ground_). +- [ ] **More built-in vector tools**: attribute join, merge, extract vertices, points along lines, + fix/check geometry, random extract, buffer options. Partial (_Roadmap: solid ground_). +- [ ] **Routing services**: isochrones, service areas, OD matrix, multi-stop routing, + turn-by-turn (Valhalla/OSRM). Partial: shortest path over a line layer (_Roadmap: analysis_). +- [ ] **Geocoding**: forward, batch and reverse, with multiple providers and a place search box. + Partial: Find Place and address tables (Nominatim, Photon or your own server), a local locator, + a search box. Missing: reverse geocoding (_Roadmap: analysis_). +- [ ] **Spatial statistics**: Emerging Hot Spot (Getis-Ord Gi\*), composite score builder. + Partial: Suitability Modeler (_Roadmap: analysis_ for hot spots). +- [ ] **H3 and DGGS grids**: H3, A5, DGGRID, DGGAL. Partial: A5 grids (_Roadmap: any time_ for + H3). +- [ ] **AI segmentation and detection**: SAM/SamGeo, ONNX/YOLO detection, OBIA with eCognition + import. Partial: pixel classification (_Exploratory_). +- [ ] **Visual Model Builder canvas**: a node graph with validation and export to code. Partial: + ModelBuilder with a node canvas and models from history. +- [ ] **Re-run or copy history as code; batch runs over a folder**. Partial: history copied as + code; batch runs are missing (_Roadmap: solid ground_). +- [ ] **Viewshed from public terrain tiles (no DEM needed)**. Partial: needs a loaded elevation + raster (_Roadmap: analysis_ for a DEM downloader). +- [ ] **Conversion**: vector to PMTiles/GeoParquet, raster to COG. Partial: GeoParquet and COG + out; vector to PMTiles is missing (_Roadmap: any time_, [#557](https://github.com/opengeos/RustGIS/issues/557)). +- [x] **Time Slider**: vector layers by a date field (`time.bind`), data cubes, trends (Sen's + slope, Mann–Kendall), GIF export. +- [ ] **Point cloud annotation**: ASPRS classes, 3D boxes. Missing. +- [ ] **Hydrology and elevation downloaders**: NLDI navigation, USGS 3DEP and LiDAR, a global DEM + downloader. Missing (_Roadmap: analysis_ for a DEM downloader). + +## Layouts & printing +_GeoLibre: docs/features.md › Map tools, printing, and media; docs/user-guide/print-layout.md_ + +- [ ] **SVG layout export**. Partial: PDF and PNG (_Roadmap: any time_). +- [ ] **Atlas along a line, page-filtered tables and charts, copy to clipboard**. Partial: + per-feature map series (_Roadmap: any time_ for the clipboard). +- [ ] **Map and video recording**: canvas recording, a marker along a line to MP4, camera tours. + Partial: keyframe PNG frames, time slider GIFs. +- [ ] **STL 3D export**. Partial: OBJ and glTF (_Roadmap: any time_). + +## Sharing, collaboration & publishing +_GeoLibre: docs/collaboration.md, docs/server-api.md, docs/user-guide/embedding.md, projects.md, +storymaps.md_ + +- [ ] **Real-time multi-user collaboration**: live sessions, permissions, roster, chat. Missing + (_Exploratory_). +- [ ] **Review comments**: anchored, threaded, resolvable. Missing (_Exploratory_). +- [ ] **Share links, project gallery, accounts**: roles, expiry, passwords, a server API. Missing; + Share As writes static files (_Exploratory_). +- [ ] **Story maps**: chapters that fly the live map, a presenter view, HTML export. Partial: + Presentations. +- [ ] **Embed API**: a `postMessage` protocol, an npm client, viewer-only and map-only modes, deep + links. Partial: the web app embeddable with `?embed`, exchanging the project through + `postMessage` (`apps/rustgis-web/src/embed.rs`); no npm client. +- [ ] **Import QGIS (`.qgs/.qgz`) and ArcGIS Pro (`.aprx/.mapx`) projects**. Missing + (_Exploratory_). +- [ ] **Autosave, project history, crash recovery, snapshot compare**. Partial: undo and per-layer + archive restore (_Roadmap: solid ground_ for autosave and crash recovery). +- [ ] **Startup preferences and shareable interface settings**. Partial: start-up preferences, + Pane Sets and ribbon/QAT customization. +- [ ] **Layer metadata with STAC Item export**. Missing (_Roadmap: data at the source_). +- [ ] **Browser extension ("Open data in …")**. Missing. + +## Scripting & integrations +_GeoLibre: docs/python.md, docs/r.md, docs/notebook.md, docs/mcp.md, docs/plugin-api.md, +docs/agent-skill.md_ + +- [x] **Python package / Jupyter widget**: the `rustgis` package on PyPI runs the engine + in-process, and `rustgis.Map` is a two-way Jupyter widget (anywidget). No leafmap-style API. +- [ ] **In-app Python console**. Partial: the "Python Window" runs command scripts, not Python + (_Exploratory_). +- [ ] **Live notebook kernel**: JupyterLite on the web, JupyterLab on the desktop, driving the live + map. Partial: built-in command notebooks with `.ipynb` in and out. +- [ ] **R package**: RStudio, Quarto, Shiny, `sf`. Missing (_Exploratory_). +- [x] **MCP: drive the running desktop app**: the loopback relay lets external AI clients drive the + app; `rustgis-cli mcp` ([#75](https://github.com/opengeos/RustGIS/issues/75)) runs on its own project. +- [ ] **MCP Apps interactive map preview**. Partial: `view_map` returns a static PNG. +- [x] **A shipped agent skill (SKILL.md)**: [skills/rustgis](skills/rustgis/SKILL.md) installs and + manages the app; the assistant has built-in skills too. +- [ ] **Plugin API breadth**: side and floating panels, menus, custom layers, map-click tools, + assistant tools. Partial: commands, tools, a ribbon tab, assistant skills, process plugins. +- [ ] ~~Python FastAPI / GeoPandas processing sidecar~~: out of scope for pure Rust; process + plugins can run Python. + +## Platforms & distribution +_GeoLibre: docs/android.md, ios.md, mac-app-store.md, downloads.md, self-hosting.md, +deployment-capabilities.md, ui-profiles.md_ + +- [ ] **Android app**. Missing (_Exploratory_). +- [ ] **iOS/iPadOS app**. Missing (_Exploratory_). +- [ ] **Touch and responsive layout**. Missing (_Exploratory_). +- [ ] **Field data collection**: forms, photos, GPS or tap placement. Missing (_Exploratory_, + [#665](https://github.com/opengeos/RustGIS/issues/665)). +- [ ] **GPS**: live position, track logs, digitizing from GPS, NMEA receivers. Missing + (_Exploratory_). +- [ ] **PWA and offline basemap tile pre-caching**. Partial: the web app is installable with + offline start; offline data areas with sync. Tile pre-caching unverified. +- [ ] **Docker self-hosting image with runtime config**. Partial: the static web build (_Roadmap: + any time_). +- [ ] **Deployment capabilities, policies and UI profiles**: restrict edit, add, run and export per + deployment. Missing. +- [ ] **Package-manager and store channels**: winget, a Homebrew Cask, the Mac App Store. Partial: + winget, Homebrew, the AUR, Fedora COPR and the Microsoft Store; the Mac App Store is missing. +- [ ] **Windows code signing**. Missing (_Roadmap: solid ground_). +- [ ] **Auto-update**. Partial: Check for Updates (_Roadmap: solid ground_ for in-place updates). +- [ ] **Desktop network features**: OS trust store, mTLS client certificates, network log, + reloading files changed on disk. Missing (_Roadmap: solid ground_ for reloading files). + +## AI +_GeoLibre: docs/user-guide/ai-assistant.md, docs/features.md › AI, Python, and automation_ + +- [ ] **Voice commands and spoken answers**. Missing. +- [ ] **Provider profiles and per-feature providers; AWS Bedrock, Vercel AI Gateway**. Partial: + one provider and model at a time. +- [ ] **AI-authored processing models**. Missing. + +## Other +_GeoLibre: docs/features.md › Platforms and interface; docs/i18n.md_ + +- [ ] **More languages and right-to-left layout**: GeoLibre has 20 languages including Arabic, + Persian and Hebrew. Partial: 17 languages; Persian text is drawn right to left, while the panes + keep their left-to-right layout. +- [ ] **Translated geoprocessing tool names**. Missing (possibly deliberate). +- [ ] **Keyboard-shortcut cheat sheet**. Partial: Command Search; rebindable shortcuts are on the + roadmap (_any time_, [#562](https://github.com/opengeos/RustGIS/issues/562)). + +## Already at or beyond parity +- A native single-binary app, with every action a command shared by the ribbon, CLI, notebooks, + models, the assistant and MCP +- Map projections on the main map (presets and projected EPSG codes) +- Reports: grouped, with statistics, charts and subreports +- Data design: domains, subtypes, attribute rules, contingent values, relationships, archiving, + topology rules, traverse/COGO +- Large GeoPackage, GeoParquet and FlatGeobuf files streamed a view at a time +- Layouts: map frames, grids, extent indicators, map series and publication sheets to PDF +- Sandboxed WASM plugins with permissions and a hash-pinned registry, the same file on desktop, + CLI and web +- AI Assistant with local models and per-command approval; `rustgis-cli ask`; an MCP server with + built-in docs +- Imagery: mosaics, mensuration, pixel editor, a trainable classifier, hosted imagery tiles +- Offline areas with two-way sync of edited features + +## To verify +- Whether exported COGs (written today) pass a COG validator: overviews and tile layout +- GeoLibre's language count: [#77](https://github.com/opengeos/RustGIS/issues/77) said 20, + `docs/comparison/geolibre.md` says 21 +- Accessibility compared with GeoLibre's axe-checked screens +- Whether offline areas or the tile cache pre-fetch basemap tiles +- Whether the shortcuts view is a full cheat sheet +- Some GeoLibre features above are taken from its docs and live in plugins or the Cesium engine + only diff --git a/ROADMAP.md b/ROADMAP.md index 732506709..e7291bf16 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,44 +1,203 @@ # Roadmap -Many features are first versions: there are no full 3D scenes or enterprise portal sharing yet. +_Last reviewed: 2026-10-23 (v0.3.0). Reviewed weekly; if this date is old, trust the linked issues +over this page._ + +This page says where RustGIS is heading and where help is most useful. Details live in the linked +issues; feature-by-feature comparison with GeoLibre is tracked in +[GEOLIBRE_PARITY.md](GEOLIBRE_PARITY.md). + +## Goals +- **What exists works.** A feature that crashes, misreads data or is undocumented costs more + than a missing one. Robustness and correct coordinates come before breadth. +- **Finish the everyday workflow first.** Add data, style it, edit it, analyse it, print or share + it: depth in these beats a long list of first versions. +- **Foundations before features.** Build the shared piece once (an expression engine, a secret + store, Z coordinates) and let several features stand on it. +- **Free and self-contained.** Pure Rust with nothing else to install; GDAL and DuckDB are + optional extras that add formats, not requirements. +- **One program everywhere.** Desktop, browser, CLI, Python and AI agents share the same commands; + nothing below `apps/` breaks the WebAssembly build. + +## Contributing +Most items below have no issue yet: propose one and open a pull request. See +[CONTRIBUTING.md](CONTRIBUTING.md) for which items to pick freely, which to coordinate first, and +how to write a proposal. Themes under Next are not releases and not in order; where an item +needs another first, it says so. + +## Underway +An item is underway when it has an open pull request, or someone said on its issue in the last +week that they are working on it. Check here and the +[open pull requests](https://github.com/opengeos/RustGIS/pulls) before starting; to take an item, +comment on its issue or pull request and open a draft pull request early. +- GPU map: vector tiles and labels on the GPU tile layer + ([#635](https://github.com/opengeos/RustGIS/issues/635), + [#596](https://github.com/opengeos/RustGIS/issues/596)). +- Labeling pane: label classes managed in the pane, query editor, more options + ([#618](https://github.com/opengeos/RustGIS/issues/618), + [#722](https://github.com/opengeos/RustGIS/issues/722)). +- Georeferencer: side-by-side window, transform picker, more formats + ([#609](https://github.com/opengeos/RustGIS/issues/609)). +- Script pane: completion of values such as layer and field names + ([#662](https://github.com/opengeos/RustGIS/issues/662)). +- Connection manager for databases and web services + ([#699](https://github.com/opengeos/RustGIS/issues/699)). +- Zonal statistics as a built-in tool ([#718](https://github.com/opengeos/RustGIS/pull/718)). +- A "No fill" option for polygons ([#745](https://github.com/opengeos/RustGIS/pull/745), for + [#644](https://github.com/opengeos/RustGIS/issues/644)). + +## Next + +### Fixes and quick wins +The bugs users hit, the docs and a few quick wins: good first pull requests. +- Robustness: the Windows 11 start-up failure + ([#375](https://github.com/opengeos/RustGIS/issues/375)), Control-click menus on macOS + ([#707](https://github.com/opengeos/RustGIS/issues/707)), Load Off-Map Data + ([#661](https://github.com/opengeos/RustGIS/issues/661)). +- A pass over the user guide, the comparison pages and the README against what the app does + today (vertex editing, spatial join and kriging are listed as missing or undocumented; some + pages still say 16 languages). +- Styling: standard deviation, geometric interval and manual breaks _(open)_. +- Selection by polygon and lasso, and a radius tool on the map (Neighborhood Explorer already + selects by radius) _(open)_. + +### Solid ground +Correct, robust and recoverable, with the foundations other themes stand on. +- Correct coordinates: grid datum shifts (NTv2 and GeoTIFF grids) for NAD27, NAD83(HARN), + GDA94↔GDA2020 and OSGB36, and a notice whenever a layer is read without its shift; GDA94 + ([#730](https://github.com/opengeos/RustGIS/issues/730)) is one case. _Coordinate first._ +- Reloading files changed on disk. +- Autosave and crash recovery: reopen unsaved work after a crash. +- Signed Windows builds (no SmartScreen warning), then in-place updates. +- A secret store in the OS keychain for database, S3 and service connections (they are kept for + the session only today). +- Overlay tools beside Clip and Erase: intersect, union, identity and near _(open)_. +- Vector tools, each writing a new layer: join field (a one-off attribute join), merge (append + layers), extract vertices, points along lines, check and fix geometry _(open)_. +- Batch runs: one tool over many layers or a folder of files. + +### Expressions and cartography +One expression engine, a superset of today's SQL where clause so existing definition queries, +label-class queries and display filters keep working. It replaces the three parsers of today +(where clauses, Calculate Field, attribute rules) and serves Calculate Field, attribute rules, +labels, definition queries, display filters, pop-ups and symbol properties. On top of it: +- Calculate Field with functions, not only `field op value`. +- Expression labels, with offset, rotation, wrapping, case, priority, number formats and halo + colour/width. +- Data-defined symbol size, colour and rotation. +- Rule-based renderer: ordered rules with an expression, symbol and scale range. +- Quick filters in the attribute table; pop-up templates (chosen fields, formats for dates, links + and images, a title). + +And alongside it: +- Kernel density (heat map) as a tool and as a renderer; point clustering. +- SVG and PNG markers, fill patterns and a symbol library. +- A legend and colour bar on the map. +- Style import: QGIS QML and SLD styles applied to layers. +- A histogram for raster stretches; raster attribute tables. + +### Data at the source +- Write edits back to GeoPackage and PostGIS (edits stay in the project today). _Coordinate + first._ +- Editor tracking fields (created/edited by and at). +- Attribute table columns: rename, hide and reorder _(open)_. +- Persistent attribute joins and virtual fields. _Coordinate first_ (they change `Feature`). +- Attribute forms: widgets, constraints and conditional visibility, on top of domains and + subtypes. +- Layer metadata, exported as STAC items. +- ArcGIS sign-in (OAuth) and a Portal browser, once the secret store (Solid ground) exists. + +### Analysis +- Routing: isochrones, service areas and an origin–destination matrix (today shortest path over + a line layer). +- Hot-spot statistics (Getis-Ord Gi\*), and emerging hot spots on the time slider. +- Charts linked to the selection: histogram, scatter, bar and box plots of a layer's fields. +- Reverse geocoding; a DEM downloader so viewshed works without a loaded elevation raster + _(open)_. + +### 3D scenes, first steps +- Phases 1–2 of [#726](https://github.com/opengeos/RustGIS/issues/726): Z coordinates kept from + the data and written back; a scene with a free camera and each layer's elevation mode (on the + ground, relative, absolute). +- LiDAR point layers (LAS/LAZ/COPC, read today as points) drawn at their heights in the scene. +- 3D objects and 3D Tiles follow. + +### Self-contained, any time _(open)_ +Built in means no runner download, the selection honoured, geodesic distances and attributes +kept. Before adding a tool, check whether the GeoLibre suite already has it (`gp.tools`); a +built-in version must justify itself on one of those. +- SVG layout export; STL export; copy a layout to the clipboard. +- UTM and MGRS grids and coordinate readouts. +- H3 grids built in, next to the A5 grids (the GeoLibre suite has H3 tools only when its runner + is installed). +- An on-map right-click menu: copy the coordinate, run a buffer or viewshed from the point. +- More than two synced maps side by side. +- Auto-refresh for web service layers. +- Vector to PMTiles export: the PMTiles writer and MVT encoder in `rustgis-tiles` exist but are + only used by tests ([#557](https://github.com/opengeos/RustGIS/issues/557)). +- A catalog of data cubes for the time slider + ([#683](https://github.com/opengeos/RustGIS/issues/683)). +- A Dockerfile for self-hosting the web app. +- Rebindable keyboard shortcuts ([#562](https://github.com/opengeos/RustGIS/issues/562)). + +## Exploratory +Open questions rather than plans; discuss before building. +- Layers kept in their own coordinate system rather than WGS 84. +- Integrating [opengeos/terrio](https://github.com/opengeos/terrio), the pure-Rust raster, vector + and point cloud I/O library: which of its drivers, coordinate transformations and GDAL-style + operations could back or replace RustGIS's own readers, or stand in for the GDAL program, and + which of them build for the web app. +- Collaboration: shared projects, review comments, accounts and a server. +- Mobile and field work: touch layout, GPS, data collection, QFieldCloud + ([#665](https://github.com/opengeos/RustGIS/issues/665)). +- Native NetCDF-4/HDF5 without GDAL ([#396](https://github.com/opengeos/RustGIS/issues/396)), + kerchunk and Icechunk. +- An SQL engine in the web app. +- Planetary coordinate systems ([#223](https://github.com/opengeos/RustGIS/issues/223)). +- Opening QGIS and ArcGIS Pro projects. +- An in-app Python console; an R package. +- AI segmentation and detection (SAM, ONNX models). ## Done - Layered workspace, command registry with undo, project files (`.rgis`), `rustgis-cli`, the web app (WebAssembly, installable with offline start, opened with a project or data by its - web address), 15 interface languages; a ribbon laid out in the order of the work + web address), 17 interface languages; a ribbon laid out in the order of the work (Home, Data, Style, Edit, Analyze, View, Publish), start-up preferences, Check for Updates. - Data: files by their web address; GeoJSON, CSV/TSV (x/y in any EPSG system, or WKT), Excel and OpenDocument spreadsheets, GeoRSS, LandXML, encoded polylines, Shapefile (zipped too, with the coordinate system in its `.prj`), GeoPackage, GeoParquet, FlatGeobuf, KML/KMZ (styles included), GPX, GML, MapInfo MIF, OSM PBF, TopoJSON, DXF and LiDAR (LAS/LAZ/COPC) in, all of them in the web app too (large files read in place, a view at a time); Esri File Geodatabases without GDAL (desktop; 3D multipatches - as footprints with their heights); the vector formats GDAL reads when it is installed, PostGIS, MySQL and MariaDB tables read live (desktop), and SQL queries + as footprints with their heights); the vector formats GDAL reads when it is installed, PostGIS, MySQL, MariaDB and SQL Server tables read live (desktop), and SQL queries and DuckDB databases (DuckDB Spatial) when DuckDB is; GeoJSON, CSV, GeoPackage, GeoParquet, Shapefile, FlatGeobuf, KML/KMZ, GPX and WKT out; standalone tables; geotagged photos and KML ground overlays; geocoding (Find Place, address tables); a Data Sources pane (favourites, recent, saved services, a library) and an SQL pane (DuckDB Spatial); layer, map, style, template, task and package files. -- Open data: STAC search (Planetary Computer assets), Overture Maps, Source Cooperative, +- Open data: STAC search (Planetary Computer assets), NASA Earthdata (desktop), Hugging Face, Overture Maps, Source Cooperative, OpenStreetMap by area (Overpass), geoBoundaries, CKAN, Socrata and ArcGIS Hub portals, and S3 buckets with signed connections and a bucket browser. - Rasters: GeoTIFF/COG (by web address, read in place by range; Zstandard too) and ASCII grids, Zarr 2 and 3 stores (a variable's step, by folder or web address), and JPEG 2000, NetCDF, HDF, ERDAS Imagine… through GDAL, EPSG reprojection, stretch/RGB/classified/shaded-relief - symbology, raster functions, indices, change detection, classification, georeferencing. + symbology, raster functions, indices, change detection, classification, georeferencing; + cloud-optimised GeoTIFFs out; data cubes on a time slider, with trends (Sen's slope, Mann–Kendall). - Services: WMS, WMTS, WFS, WCS, OGC API Features and Tiles, and ArcGIS REST, listed from their capabilities; CSW catalogue search. -- Maps: multiple maps, a GPU renderer (beta) with smooth zoom and pan, a 3D globe with the flat +- Maps: multiple maps, a GPU renderer (beta) with smooth zoom and pan, tilt, rotation and terrain, a 3D globe with the flat map draped over it, projection presets and EPSG codes (features cut along the edge of world projections), a search box for layers, places and coordinates, bookmarks, web tile layers (XYZ/TMS/WMS, Mapbox Vector Tiles, MapLibre styles, PMTiles and MBTiles archives), a basemap gallery (OpenFreeMap, USGS Imagery), worldviews. -- Cartography: single, unique values, graduated colours and proportional symbols; labels with - placement and annotation; custom colour ramps (and QGIS, GDAL and GMT palette files); - masking, display filters, aggregation, extrusion; graphics. -- Editing: create, move, rotate, scale, merge, split, explode; snapping, templates, elevation, +- Cartography: single, unique values, graduated colours and proportional symbols; layer groups; + label classes with SQL queries, placement and annotation; custom colour ramps (and QGIS, GDAL + and GMT palette files); masking, display filters, blend modes, aggregation, extrusion; graphics. +- Editing: create, move, rotate, scale, merge, split, explode, vertex editing; snapping, templates, elevation, topology; domains, subtypes, attribute rules, contingent values, relationships, archiving. -- Analysis: selection by attributes and location; overlay, proximity and summary tools; guided - workflows (viewshed, line of sight, IDW, shortest path, suitability); ModelBuilder and - scripts; the GeoLibre and Whitebox suite (1,000+ tools) natively and in the browser. -- Layouts (map frames, surrounds, map series, PDF), reports, presentations and notebooks. +- Analysis: selection by attributes and location; overlay (clip, erase), proximity (buffer) and summary tools, spatial + join, A5 grids, kriging; guided workflows (viewshed, line of sight, IDW, shortest path, + suitability); ModelBuilder and scripts, and history copied as code; the GeoLibre and Whitebox + suite (1,000+ tools) natively and in the browser. +- Layouts (map frames, surrounds, map series, publication sheets and figures in one command, PDF), + reports, presentations and notebooks; the web app embeddable in a page (`?embed`). - Sharing as open formats (web maps, OGC API Features collections, MapLibre styles, glTF scenes, locators), offline areas with sync, deep learning pixel classification, hosted imagery tiles. @@ -52,8 +211,3 @@ Many features are first versions: there are no full 3D scenes or enterprise port - Desktop packages: Windows installers (setup.exe, .msi), a portable zip and a Store MSIX; a signed and notarized macOS DMG; Linux .deb, .rpm, AppImage and tarballs; Homebrew, the AUR, Fedora COPR and winget; a download mirror at downloads.rustgis.app. - -## Next -- Editing: vertex editing (move, add and delete vertices of existing features). -- Analysis: spatial join, intersect and union, near, heat maps. -- 3D: full scenes with terrain, beyond the globe and 2.5D extrusion.