RustGIS v0.3.0 brings the world's open data to your map and makes the app faster and more open to other tools. Search STAC catalogs, Overture Maps, OpenStreetMap, open-data portals and S3 buckets from the app, read cloud-native files in place by their web address, and query PostGIS tables live. Maps can now draw on the GPU (beta) with smooth zoom and pan, the globe drapes your map over it, and the new rustgis Python package and process plugins bring RustGIS into Jupyter and your own programs.
Highlights
- Open data, built in: search STAC catalogs (with Microsoft Planetary Computer assets), Overture Maps, Source Cooperative, OpenStreetMap by area (Overpass), geoBoundaries and the CKAN (data.gov), Socrata and ArcGIS Hub portals; browse S3 buckets with signed connections; geocode places and address tables. A new Data Sources pane keeps favourites, recent sources, saved services and a library. See Data.
- Cloud-native data by address: add GeoJSON, CSV, GeoParquet, FlatGeobuf, cloud-optimised GeoTIFFs and more by their web address. GeoParquet, FlatGeobuf and COGs are read in place by range, large GeoJSON and Shapefiles stream, and the web app opens large local GeoTIFFs a part at a time.
- More formats and services: PostGIS tables read live through a pure-Rust client; DXF, GML, MapInfo MIF/MID, OSM PBF, TopoJSON, LiDAR (LAS, LAZ, COPC), MBTiles, spreadsheets, geotagged photos and KML ground overlays open natively; JPEG 2000, NetCDF, HDF and more through GDAL; WMS, WMTS, WFS, WCS, OGC API Features and Tiles, ArcGIS REST and CSW catalogue search; Zarr stores by folder or address. An SQL pane gives you a DuckDB Spatial workspace.
- A faster, livelier map: a GPU rendering backend (beta) and smooth zoom and pan between redraws, a globe with the flat map draped over it and a starry sky, a search box for layers, places and coordinates, OpenFreeMap and USGS Imagery basemaps, features cut cleanly along the edge of world projections, and layers you reorder by dragging.
- Python and plugins: the
rustgisPython package on PyPI runs the engine in-process and puts the app in a Jupyter notebook withrustgis.Map. Process plugins run as programs on your computer, with Python environments RustGIS makes for them, in the background with progress and Cancel. - AI Assistant: use your ChatGPT plan by signing in with ChatGPT, and let external AI clients drive the app through the agent skill and loopback relay.
- Cartography and workspace: custom colour ramps with QGIS, GDAL and GMT palette import; legends that list what the frame draws; rename, duplicate and close maps and layouts from tabs and the Browser pane; the web app installs as an app with offline start and opens projects and data from a link (
?project=,?data=); Georgian joins the interface languages.
Download
Get the app for your platform at https://downloads.rustgis.app (or below), and see https://rustgis.app/installation/ for which file to pick.
What's Changed
- View tab: Display group first; theme follows the system by @giswqs in #112
- Assistant: a failure while handling a reply no longer closes the app by @giswqs in #111
- MBTiles: raster and vector tile sets, on the desktop and in the web app by @giswqs in #113
- MBTiles: read the zooms and a tile only when the metadata leaves them out by @giswqs in #119
- Delimited text: x/y in any coordinate system, WKT columns, any separator by @giswqs in #115
- Add data by its web address: GeoJSON, CSV, GeoParquet, COG and more by @giswqs in #116
- Spreadsheets, GeoRSS, LandXML and encoded polylines by @giswqs in #118
- GDAL rasters: JPEG 2000, NetCDF, HDF, ERDAS Imagine, HGT and more by @giswqs in #117
- Web app links that carry data: ?data=, ?style=, ?tiles= by @giswqs in #121
- Native GML, MapInfo MIF/MID, OSM PBF and TopoJSON readers by @giswqs in #122
- Map and feature services: WMS, WMTS, WFS, OGC API Features, ArcGIS REST by @giswqs in #120
- KML ground overlays: pictures drawn as raster layers by @giswqs in #123
- PostgreSQL/PostGIS databases through DuckDB by @giswqs in #125
- Web build: whole-program LTO to stay under Cloudflare's 25 MiB limit by @giswqs in #133
- i18n(tr): fix Turkish vowel harmony for raster terminology by @ozdil in #129
- Python: the rustgis package, the engine in-process through PyO3 by @giswqs in #114
- STAC search: collections, items with footprints, assets by address by @giswqs in #128
- Add Georgian (ka) interface language by @ezdanapak in #124
- Geocoding: Find Place and address tables by @giswqs in #127
- SQL pane: a DuckDB Spatial workspace by @giswqs in #131
- Previews on GitHub Pages (opengeos/rustgis-preview) instead of Cloudflare Pages by @giswqs in #138
- Python: rustgis.Map, the RustGIS app in a Jupyter notebook by @giswqs in #135
- Cloud-optimised GeoTIFFs by address, read in place by range by @giswqs in #132
- CI: a merge no longer cancels a Python wheel build by @giswqs in #141
- Open data: OpenStreetMap by area (Overpass) and geoBoundaries by @giswqs in #139
- LiDAR point clouds: LAS, LAZ and COPC as point layers by @giswqs in #137
- Python: getting-started notebook, PyPI and Colab badges; Map is 800px by @giswqs in #146
- STAC links, Planetary Computer assets and OGC API Tiles by @giswqs in #144
- Zarr stores: a variable's map at a time step, by folder or address by @giswqs in #147
- CI: docs previews for fork pull requests by @giswqs in #151
- Layers pane: reorder layers by dragging by @jgregoriorincon in #145
- Rasters: open Zstandard-compressed GeoTIFFs (COGs) by @giswqs in #136
- Python: the sdist carries the license file by @giswqs in #153
- S3 buckets: s3:// addresses, signed connections and a bucket browser by @giswqs in #150
- S3: a connection replaced by name forgets its grants; sha2 shared by @giswqs in #156
- GeoParquet and FlatGeobuf by address, read in place by range by @giswqs in #152
- Data Sources pane: favourites, recent, saved services and a library by @giswqs in #157
- Tools pane: field parameters reset when the input layer changes by @jgregoriorincon in #160
- DXF drawings read natively, on the desktop and in the web app by @giswqs in #159
- Data sources: redaction that keeps ordinary addresses whole by @giswqs in #163
- Docs previews: returning fork contributors publish on every push by @giswqs in #166
- DXF follow-ups from #159 by @giswqs in #168
- PostgreSQL URIs: a digit password with a / still goes; no fragment by @giswqs in #170
- Overture Maps and Source Cooperative by @giswqs in #158
- Menus and Command Search: highlight the row under the pointer by @jgregoriorincon in #161
- Standalone tables: remove a table from its right-click menu by @jgregoriorincon in #164
- Rasters: read tiled RGBI GeoTIFFs without black stripes by @giswqs in #171
- Overture and Source Cooperative: follow-ups from #158 by @giswqs in #173
- Geotagged photos: JPEGs with EXIF GPS as points with thumbnails by @giswqs in #175
- Search Open Data: CKAN (data.gov), Socrata and ArcGIS Hub by @giswqs in #176
- XML readers refuse deep nesting instead of overflowing the stack by @giswqs in #179
- Photos: pictures decoded within limits; tighter thumbnail limits by @giswqs in #182
- Web: installable as an app (PWA) with offline start by @giswqs in #180
- Standalone tables: stable ids by @jgregoriorincon in #174
- XML depth check: comments in a DOCTYPE; a DOCTYPE that never ends by @giswqs in #183
- ArcGIS REST: name a service from its address, not its HTML description by @giswqs in #177
- Geoprocessing: XY Table To Point by @jgregoriorincon in #185
- Services: WCS coverages and CSW catalogue search by @giswqs in #178
- Tools pane and Geocode Addresses: pick a table by its id by @jgregoriorincon in #187
- AI Assistant: long lines wrap instead of widening the pane by @SEOUL-raphael in #188
- Standalone tables: XY Table To Point from the right-click menu by @jgregoriorincon in #189
- GeoLibre tools: subcategories as in GeoLibre; Uninstall by @giswqs in #186
- Packaging: drop deprecated Homebrew cask stanzas by @giswqs in #191
- Style: custom color ramps, with .rgisramp import and export by @giswqs in #184
- Web: GeoLibre runner 1.7.0 (tool subcategories) by @giswqs in #192
- Color ramps: read QGIS, GDAL and GMT palette files by @giswqs in #193
- Tests: the plugin Uninstall test no longer finds GeoLibre's button by @jgregoriorincon in #195
- Command Search: unavailable commands are listed, disabled by @jgregoriorincon in #196
- Commands: name every parameter key; say which keys are ignored by @giswqs in #194
- Add Delimited Text: choose the file first, then pick its columns by @jgregoriorincon in #199
- Docs: a dedicated RustGIS and QGIS comparison page by @giswqs in #200
- Web: Save As asks for the file name; opened projects keep theirs by @giswqs in #201
- Docs: a dedicated RustGIS and GeoLibre comparison page by @giswqs in #204
- Layouts: let elements be as thin as a hairline by @jgregoriorincon in #217
- fix(geometry): check polygon ring boundaries in box selection by @TalhaHunter101 in #219
- fix(geom): account work budget accurately in hole bridging by @TalhaHunter101 in #220
- fix(data): parse table PRIMARY KEY constraint columns accurately by @TalhaHunter101 in #227
- fix(analysis): exclude features without geometry in select_by_location by @TalhaHunter101 in #229
- Layouts: a globe map frame follows its own scale and centre by @jgregoriorincon in #230
- Layers and layouts: Zoom To Layer follows the definition query by @jgregoriorincon in #231
- fix(i18n): translate "(filtered)" and correct a few Italian strings by @jagisspecialist in #239
- feat(plugins): file parameters for plugin tools by @giswqs in #242
- Identify: step through every feature under the click, overlapping ones included by @jgregoriorincon in #233
- Projections: refuse codes whose method can't be drawn; turn on aeqd for local views (#208) by @elpidioassinaturas in #216
- Projections: follow-ups to #216 (docs, web-app message, test gating) by @elpidioassinaturas in #238
- feat(plugins): process plugins, which run as programs on the computer by @giswqs in #245
- feat(plugins): Python environments that RustGIS makes for process plugins by @giswqs in #246
- fix(plugins): one Python environment preparation at a time per plugin by @giswqs in #249
- Identify: zoom to the feature a pop-up shows by @jgregoriorincon in #235
- perf(raster): decode GeoTIFF chunks on several threads by @giswqs in #254
- fix(i18n): correct a few Spanish strings by @jagisspecialist in #258
- Zarr: read sharded arrays and bit-shuffled blosc chunks by @giswqs in #250
- perf(data): read large Shapefiles in place by @giswqs in #256
- perf(data): stream GeoJSON, and read large files in place by @giswqs in #257
- feat(web): open a project by its web address (?project=) by @gsueur in #259
- ci: test macOS and Windows on main, and on pull requests by label by @giswqs in #260
- fix(data): keep large whole numbers exact in Shapefiles read in place by @giswqs in #261
- feat(data): EPSG codes 9020–20003 that crs-definitions lacks (SIRGAS-Chile, MAGNA-SIRGAS 2018) by @DanielD-S in #262
- feat(ui): move Customize (Ribbon, Quick Access) to the Settings tab by @giswqs in #264
- fix(web): read zstd-compressed GeoParquet in the browser by @gsueur in #265
- docs: complete the cut-off instruction in the Delimited text row by @lunar-me in #267
- feat(web): layer.addUrl from commands, plugins and the assistant downloads in the app by @DanielD-S in #272
- feat(plugins): run plugin tools in the background, with progress and Cancel by @giswqs in #268
- AI Assistant: agent skill and loopback relay for external clients by @Komzpa in #215
- Projections: cut features along the edge of world projections (#209) by @elpidioassinaturas in #269
- feat(plugins): a progress message for process plugin tools by @giswqs in #279
- fix(layout): label Equator and prime meridian as 0°, antimeridian as 180° by @ningyixi in #234
- Projections: count longitudes from +pm, and cut where a datum shift puts the edge by @elpidioassinaturas in #271
- fix(assistant): close relay connections on stop on Windows by @giswqs in #285
- Feat: Close button on map and layout tabs by @jgregoriorincon in #283
- Select: take only drawn features of selectable layers, in draw order by @jgregoriorincon in #253
- fix(ui): keep Command Search list full height after a short result list by @jgregoriorincon in #255
- Symbology: class on the features the definition query keeps (#236) by @jgregoriorincon in #266
- feat(data): read PostGIS tables live through a pure-Rust client by @giswqs in #281
- feat: Ask before deleting a map or a layout by @jgregoriorincon in #286
- Web: open large local GeoTIFFs a part at a time by @giswqs in #289
- test(assistant): fix a race in the relay wake test by @giswqs in #291
- fix(web): translatable notices when reading a large GeoTIFF in parts by @giswqs in #292
- AI Assistant: use a ChatGPT plan through Sign in with ChatGPT by @gpt-cmdr in #244
- fix(assistant): do not report layersAdded when switching maps by @ningyixi in #225
- feat: Rename maps and layouts from the Browser Pane by @jgregoriorincon in #294
- Layout legends: list what the frame draws (#207) by @elpidioassinaturas in #290
- Fix Copy Coordinates in the map menu; remove, import and export bookmarks; movable dialogs by @giswqs in #295
- feat: Duplicate maps and layouts from the Browser Pane by @jgregoriorincon in #297
- feat: Tabs in the left pane header to switch between Layers, Browser and Data Sources by @jgregoriorincon in #302
- feat(macos): unified title bar (#293) by @ninhhaidang in #296
- ci: test every pull request on Windows by @giswqs in #306
- test: fix the Windows failure of the assistant account-switch test by @giswqs in #308
- fix: web tile layers in the Layers pane; pick layers for list inputs by @giswqs in #298
- fix(map): project layers that can't be read in place are downloaded whole, and get their source's fields by @gsueur in #305
- docs(agents): translate new strings before release, not in every PR by @giswqs in #310
- ci(review): judge pull requests against AGENTS.md by @giswqs in #311
- ci(review): list per-file size changes in the change-size table by @giswqs in #313
- feat(globe): drape the flat map over the moving globe by @giswqs in #312
- docs(readme): bring the README up to date by @giswqs in #316
- UI: keep the right pane in the window when its content overflows by @giswqs in #315
- AI Assistant: never run calls from a cut-off reply; docs tools in the app by @gpt-cmdr in #278
- Basemap gallery: OpenFreeMap and USGS Imagery web basemaps by @giswqs in #318
- feat(globe): stars and shooting stars around the globe by @giswqs in #319
- Bound shared tool output and preserve valid JSON by @gpt-cmdr in #317
- Large layers: share features across undo steps; thin them to draw by @giswqs in #320
- feat: GPU map rendering backend (wgpu, beta) by @sheecegardezi in #309
- Search box in the lower-left corner: layers, places, lat/lon by @giswqs in #323
- i18n: translate 372 new interface strings in every language by @giswqs in #332
- Map view: smooth zoom and pan between full redraws by @giswqs in #322
- Faster drawing of large layers; no panic zoomed in far by @giswqs in #331
- feat: Filter layers by name in the Layers pane by @jgregoriorincon in #330
- Release v0.3.0: version, roadmap and highlights by @giswqs in #333
- Release: retry the NSIS install and macOS stapling by @giswqs in #334
- Release: retry stapler validate in the macOS signature check by @giswqs in #336
- fix: A layer the Layers filter hides is no longer the active one by @jgregoriorincon in #335
- Release: check the DMG with Gatekeeper; retry stapling longer by @giswqs in #339
- Windows: link the C runtime statically by @giswqs in #340
- feat(ui): a shared search field, used by the Layers filter and Find Tools by @jgregoriorincon in #338
New Contributors
- @ozdil made their first contribution in #129
- @ezdanapak made their first contribution in #124
- @SEOUL-raphael made their first contribution in #188
- @TalhaHunter101 made their first contribution in #219
- @jagisspecialist made their first contribution in #239
- @elpidioassinaturas made their first contribution in #216
- @gsueur made their first contribution in #259
- @DanielD-S made their first contribution in #262
- @lunar-me made their first contribution in #267
- @Komzpa made their first contribution in #215
- @ningyixi made their first contribution in #234
- @gpt-cmdr made their first contribution in #244
- @ninhhaidang made their first contribution in #296
- @sheecegardezi made their first contribution in #309
Full Changelog: v0.2.0...v0.3.0