github opengeos/RustGIS v0.4.0

4 hours ago

RustGIS v0.4.0 tilts the map into 3D, adds several new data sources and gives cartography and analysis more depth. Turn and tilt the map, drape it over terrain and stand extrusions up on the GPU, or switch to the Moon and Mars. Read Esri File Geodatabases without GDAL, query MySQL, MariaDB and SQL Server tables live, and browse a large catalog of public web data. New tools include vertex editing, spatial join, zonal statistics, kriging and data-cube trends, and new cartography includes label classes, curved line labels, publication layouts and SVG export.

Highlights

  • A map you can turn and tilt: rotate the map to a bearing and tilt it to a pitch, drape it over terrain, stand extrusions and point markers up on the GPU, and turn the globe the same way. Map frames in layouts turn and tilt too. Switch between the Earth, the Moon, Mars and other celestial bodies, each with its own basemaps. See Maps.
  • More data, from more places: Esri File Geodatabases without GDAL, live MySQL, MariaDB, SQL Server and Azure SQL tables, QGIS projects opened as maps with their layer styles, and scans without coordinates for georeferencing. You can now write cloud-optimised GeoTIFFs. Reusable connections remember their passwords and keys in the OS keychain, and a Web Data pane lists public catalogs such as NASA Earthdata, FEMA, The National Map, NASA GIBS, Natural Earth, Hugging Face and satellite embeddings. See Data.
  • Time and data cubes: a time slider for layers, dated imagery, Zarr variables and STAC bands. Chart a point's time series, summarise a cube by year or month, and map trends cell by cell with Sen's slope and the Mann-Kendall test.
  • Editing and analysis: move, insert and delete vertices on the map with snapping. Analysis adds spatial join, zonal statistics, IDW and ordinary kriging, geodesic buffers, A5 equal-area grids, Calculate Geometry in metric or imperial units, and polygon, lasso and radius selection on the map. Plan routes and follow them turn by turn. ModelBuilder is rebuilt as a node canvas, the Script pane completes commands, parameters, layers and fields as you type, and a geoprocessing run can be copied as Python. See Analysis.
  • Cartography and labels: a Labeling pane with label classes chosen by SQL queries, labels that follow lines straight or curved, and installed font families. New classification methods (geometric interval, standard deviation, manual breaks), stacked and dashed line strokes drawn in symbol levels, reference scales, layer groups, blend modes, scientific colour ramps and raster colour bars. See Cartography.
  • Layouts: build a publication sheet or figure, with its locator and surrounds, in one command. Edit elements in a Format pane, and add shapes, arrows, rulers, guides, snapping and element locking. Style grids, north arrows and scale bars, and export the layout to SVG. See Layouts.
  • AI agents and plugins: the AI Assistant gains skills and subagents, and can drive agents on your computer through ACP. External agents connect over MCP on HTTP or a file bridge, with an audit log, their own undo and a snapshot of the map as you see it. Plugins can add panels of widgets and read small documents from the web. Persian and Bengali join the interface languages, for 18 in all.

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

  • Python: put the license at the root of the sdist by @giswqs in #343
  • feat: List layers by Drawing Order, Data Source or Selection in the Layers pane by @jgregoriorincon in #344
  • Directions: plan a route and follow it turn by turn by @giswqs in #341
  • feat: Move the Project group from Data to the front of Home by @jgregoriorincon in #346
  • GeoLibre: leave option defaults to the runner by @giswqs in #355
  • UI: keep the left pane's width when a row is wider than it by @giswqs in #354
  • Layout: keep a dragged element and its outline together by @giswqs in #356
  • fix: Web Layer, Web Map, Web Scene and Geodata Service share every feature of a streamed layer by @ishiland in #357
  • build(deps): bump anthropics/claude-code-action from 1.0.245 to 1.0.250 in the actions-minor-patch group by @dependabot[bot] in #364
  • build(deps): bump vedantmgoyal9/winget-releaser from f29ed1ffd34f91223a2aebaa71beaab0901ff9fd to b7370d4d152efdce803a26cc6ca9eee58cb2ad54 by @dependabot[bot] in #365
  • build(deps): bump the cargo-minor-patch group with 2 updates by @dependabot[bot] in #366
  • build(deps): bump base64 from 0.22.1 to 0.23.1 by @dependabot[bot] in #367
  • build(deps): bump zstd from 0.13.3 to 0.14.2 by @dependabot[bot] in #368
  • build(deps): bump sha2 from 0.10.9 to 0.11.1 by @dependabot[bot] in #369
  • build(deps): bump getrandom from 0.3.4 to 0.4.3 by @dependabot[bot] in #370
  • fix(deps): sort rustgis-assistant dependencies in Cargo.lock by @giswqs in #372
  • feat: Reload Web Layers clears the tile and style caches by @ishiland in #371
  • MSIX: make rustgis-cli an alias of the main app by @giswqs in #374
  • fix: Web Style carries a layer's scale limits as minzoom and maxzoom by @ishiland in #358
  • feat(symbology): edit one class's colour and legend label (#314) by @elpidioassinaturas in #359
  • Support OGC landing-page discovery, grouped imports and refresh by @DEKHTIARJonathan in #218
  • feat: a Bookmarks pane to manage every map's bookmarks in place by @jgregoriorincon in #373
  • fix(symbology): layer.classStyle returns the edited class's own legend row by @giswqs in #379
  • docs: add the Microsoft Store badge to the README and docs by @giswqs in #380
  • fix(style): keep the fill alpha chosen in the colour picker by @ninhhaidang in #378
  • ui: name Whitebox on the GeoLibre card by @giswqs in #387
  • fix: respect definition queries in unique-value legends by @danmaps in #345
  • MCP relay: "Let your Agents Control RustGIS" in the assistant settings; run-scoped tokens by @gpt-cmdr in #360
  • fix(style): no additive blending in the colour pickers (#381) by @elpidioassinaturas in #389
  • feat(startup): Start With a chosen project or the last project (#377) by @elpidioassinaturas in #386
  • test(smoke): open the assistant settings after the first frame by @giswqs in #398
  • docs(geolibre): describe the browser's WASI runner in the crate docs by @giswqs in #397
  • AI Assistant: retries, streaming, compaction and translated notes by @gpt-cmdr in #361
  • feat(ui): bookmark icons on the ribbon's Bookmarks menu, and a New Bookmark icon by @jgregoriorincon in #383
  • feat(ui): describe a bookmark when creating it in the New Bookmark dialog by @jgregoriorincon in #388
  • fix(ui): long names in the Layers pane wrap onto a second line, then end in an ellipsis by @jgregoriorincon in #391
  • AI Assistant: skills by @gpt-cmdr in #362
  • fix(symbology): map sorted legend rows back to their classes by @giswqs in #376
  • fix(assistant): skills follow-ups from the #362 review by @giswqs in #405
  • feat(ui): the map's right-click menu matches GeoLibre's by @giswqs in #403
  • AI Assistant: subagents, and agents on this computer through ACP by @gpt-cmdr in #363
  • feat(layout): rulers, guides and snapping in the layout view by @huzaifffa in #390
  • feat(ui): tabs for the panes open on the right side by @jgregoriorincon in #404
  • test(data): write SQLite fixtures in one transaction by @giswqs in #414
  • Rendering: draw CJK labels with an installed CJK font by @giswqs in #409
  • fix(data): read LZW GeoTIFF tiles the tiff crate drops bytes of by @giswqs in #416
  • Analysis: reject tool choices outside the declared list by @giswqs in #407
  • AI Assistant: list_layers shows web tile layers (WMS overlays) by @giswqs in #408
  • ci: nightly run for slow checks; pull requests test on Linux only by @giswqs in #417
  • fix(ui): only Shift+Enter breaks a line in dialogs' multi-line boxes by @jgregoriorincon in #419
  • feat(analysis): add IDW Interpolation tool matching QGIS by @huzaifffa in #384
  • feat(layout): pan and zoom map frames with a Pan/Zoom Map tool by @huzaifffa in #418
  • test(assistant): de-flake approval_held_requests_wait_for_the_user by @giswqs in #421
  • fix(assistant): retry without reasoning when a model refuses it with tools (#402) by @cartwheei in #415
  • Render: print the globe in light space in exports and layouts by @giswqs in #423
  • Project: open project packages from Project › Open, a drop and the command line by @giswqs in #424
  • Map: rotate the flat map to a bearing by @giswqs in #425
  • feat(raster): a Custom Min/Max stretch with your own bounds by @ninhhaidang in #422
  • feat(assistant): make the AI provider settings collapsible by @giswqs in #431
  • fix(plugins): say what the network permission covers in the install prompt by @giswqs in #430
  • Basemaps: stack web basemaps and blend tile layers by @giswqs in #427
  • Analysis: geodesic buffers by @giswqs in #429
  • Web: open a Shapefile picked or dropped as its loose files by @giswqs in #426
  • Edit: move, insert and delete vertices on the map by @giswqs in #428
  • Map: don't read a streamed layer outside its zoom range by @giswqs in #432
  • GeoTIFF: read rotated and skewed rasters by @giswqs in #434
  • Ribbon: drop Ready To Use from the Geoprocessing group by @giswqs in #439
  • Rasters: read GDAL .aux.xml sidecars by @giswqs in #438
  • Symbology: mask raster pixel values on the fly by @giswqs in #436
  • fix(ui): show a map tool's crosshair only over the map by @jgregoriorincon in #440
  • Map: tilt the flat map to a pitch by @giswqs in #433
  • Layers: group related layers in a collapsible group by @giswqs in #435
  • Layout: raster colorbar element by @giswqs in #444
  • Symbology: scientific colour ramps and a default raster style by @giswqs in #445
  • perf(tiles): fetch up to 16 tiles at a time per server by @giswqs in #448
  • Docs: add a star history chart to the README by @giswqs in #450
  • Data: one shared settings, data and cache folder helper by @giswqs in #442
  • Raster: mosaic DEM tiles, clip by a polygon layer, share a stretch by @giswqs in #451
  • feat(ui): make the map's Dynamic Text a menu of values, as in Publish by @jgregoriorincon in #446
  • Map: bearing and pitch from MapLibre styles, links and scenes by @giswqs in #452
  • Data: open a file by address from the file its drive fetches for by @giswqs in #458
  • Plugins: panels of widgets bound to a plugin's commands by @giswqs in #449
  • Plugins: host.fetch reads a small document from the web by @giswqs in #447
  • Layout: grid ticks and label formats, north arrow and scale bar styles by @giswqs in #453
  • fix(render): frame a selected text graphic around its text by @jgregoriorincon in #460
  • CI: an automerge label merges a pull request once CI passes by @giswqs in #459
  • CI: automerge refuses a labeller's own pull request by @giswqs in #463
  • Tasks for teaching: named outputs from files, recording, step editing and Show Me (#410) by @elpidioassinaturas in #443
  • test(render): grid label test passes with Windows fonts by @giswqs in #471
  • docs: space the home page buttons and keep the Store badge on their line by @giswqs in #473
  • Desktop: start on Direct3D 12 on Windows, add --backend by @giswqs in #472
  • Tasks: keep access keys out of recorded steps; tighten the output tripwire (#443 follow-up) by @elpidioassinaturas in #476
  • Data: read MySQL and MariaDB tables live by @giswqs in #475
  • fix(ui): close the pop-up when the feature it shows is gone by @jgregoriorincon in #466
  • Map: draw a settled tilted map off the UI thread by @giswqs in #474
  • fix(ui): say why a keyboard shortcut's command can't run by @jgregoriorincon in #464
  • Data: read SIRGAS 2000 as WGS 84, without a datum note (#400) by @elpidioassinaturas in #477
  • MCP: keep the open project the user's on the relay by @giswqs in #479
  • Graphics: edit a placed text's text and size by @choupeanut in #462
  • feat(layout): Backspace deletes and Ctrl/Cmd+D duplicates the selected element by @huzaifffa in #461
  • i18n: translate the new interface strings in every language by @giswqs in #480
  • Map: stand point markers upright in a tilted view by @giswqs in #481
  • feat(ui): type a map scale into the status bar by @huzaifffa in #467
  • MCP: describe the whole project in one list_layers call by @giswqs in #483
  • Layout: turn and tilt map frames by @giswqs in #485
  • [Bug]: A refused edit of a streamed layer is silent, or claims it was done by @jgregoriorincon in #484
  • Analysis: Tissot's indicatrix, geodesic circles that show a projection's distortion (#393) by @elpidioassinaturas in #482
  • Symbology: update transparency live while dragging the slider by @giswqs in #486
  • Symbology: stack line strokes with offsets, caps and joins by @giswqs in #487
  • MCP: run a script of commands in one call by @giswqs in #488
  • Projections: draw the map in ESRI codes (#213) by @giswqs in #494
  • fix(ui): line text size controls up with their commands (#457) by @jgregoriorincon in #500
  • Map: draw turned and tilted maps on the GPU by @giswqs in #489
  • Relay: show what the agent just ran; tell it the user is watching by @giswqs in #490
  • Rebuild ModelBuilder as a node canvas, after GeoLibre's by @giswqs in #493
  • Map: stand extrusions up on the GPU with a depth buffer by @giswqs in #492
  • Globe: turn and tilt it like the flat map by @giswqs in #497
  • MCP: snapshot the map as the user sees it by @giswqs in #495
  • GPU map: re-render when zooming out past the drawn features by @giswqs in #504
  • Layout: the extent indicator takes a colour and width (#213, point a) by @elpidioassinaturas in #507
  • Agents: an explicit full-access opt-in by @giswqs in #503
  • Agents: a file bridge for clients without MCP by @giswqs in #498
  • feat(layers): copy and paste layers between maps (#491) by @jgregoriorincon in #508
  • Relay: busy replies, caller timeouts, an endpoint file, a port variable by @giswqs in #499
  • Relay: keep an audit log of what agents do by @giswqs in #496
  • Relay: agents keep their own active layer and undo only their steps by @giswqs in #501
  • Coordinate systems: read WKT2 (PROJCRS, GEOGCRS) by @giswqs in #510
  • Map: drape a tilted map over terrain by @giswqs in #502
  • Agents: tie the file bridge to the audit log, full access and undo by @giswqs in #512
  • Layout: text elements take italic, alignment and letter spacing (#213, point c) by @elpidioassinaturas in #511
  • Agents: MCP over HTTP beside the relay, and mcp-register by @giswqs in #506
  • fix: OGC API Features layers read every page of a collection by @ishiland in #519
  • Maps: switch the map between celestial bodies, with planetary basemaps (#223) by @giswqs in #505
  • Analysis: Calculate Geometry stores full-precision area, perimeter and length by @giswqs in #520
  • Data: export layers in their own or a chosen coordinate system by @giswqs in #521
  • feat(services): say plainly why a service failed, with its details (#509) by @jgregoriorincon in #515
  • Layout: a legend can leave layers out though the map draws them (#517, point 1) by @elpidioassinaturas in #518
  • Projections: presets take a central meridian, conics their standard parallels (#517, point 2) by @elpidioassinaturas in #523
  • fix: improve celestial rendering and Earth basemap selection by @giswqs in #522
  • feat(layouts): edit layout elements in a Format pane beside the others (#516) by @jgregoriorincon in #524
  • fix: count the first page in the OGC paging deadline by @ishiland in #525
  • feat(ui): Home › Web Data menu for public web services by @giswqs in #529
  • fix: keep symbols their size on the moving globe by @giswqs in #530
  • feat(ui): one text form for map text and layout text, with the page's dynamic text (#516) by @jgregoriorincon in #527
  • feat: Web Data catalog services (ArcGIS, Earthdata GIS, OAM, 3DEP, IGN LiDAR HD, GeoLens, Hugging Face, ODP, US GIS) in a Web Data pane by @giswqs in #532
  • feat: Web Data › NASA Earthaccess and USGS NLDI by @giswqs in #538
  • feat: Web Data › Dynamical (weather and climate Zarr stores) and Tennessee GIS by @giswqs in #541
  • feat: Web Data › static STAC catalogs: Planet, Portolan, Vantor, Sentinel-2, USGS LiDAR by @giswqs in #533
  • feat: Web Data › FEMA, EnviroAtlas, The National Map, NASA GIBS, Natural Earth, Fields of the World by @giswqs in #534
  • feat: Web Data › Satellite Embeddings (AlphaEarth, Tessera, Earth Index) by @giswqs in #542
  • feat(ui): format, place and move map text in the Format pane, bold included (#516) by @jgregoriorincon in #537
  • fix(engine): give a project back its undo history when the command that replaced it fails by @jgregoriorincon in #540
  • feat: time slider for layers and dated imagery by @giswqs in #543
  • GeoTIFF: read tiled files with bands stored apart without panicking by @giswqs in #549
  • docs: move Web Data to a page of its own by @giswqs in #550
  • GeoTIFF: test non-square planar tiles and the sub-8-bit refusal by @giswqs in #552
  • i18n: translate 479 new interface strings in all 15 languages by @giswqs in #553
  • feat(analysis): copy a geoprocessing run as Python, a command or a script (#539) by @jgregoriorincon in #545
  • Map view: keep frames drawn mid-motion at full resolution by @giswqs in #567
  • feat(pmtiles): Brotli and Zstandard archives; frame and zoom to archives by @giswqs in #560
  • fix(analysis): empty secrets written with spaces around the = in copied code by @giswqs in #561
  • feat(identify): pop-ups for vector tile features (PMTiles, MBTiles, MVT) by @giswqs in #565
  • docs: screenshots for ModelBuilder, other worlds, terrain and more; fix stale menu paths by @giswqs in #558
  • fix(analysis): part secret pairs at '&', and redact a failed run's error fully by @jgregoriorincon in #564
  • Map view: draw raster tiles as GPU textures that move with the camera by @giswqs in #570
  • fix(assistant): scroll the settings and fold the agents section by @giswqs in #569
  • feat(assistant): resize the message box by a grip above it by @giswqs in #571
  • feat(layout): rectangle, circle, ellipse and line shapes in a Shapes group by @huzaifffa in #546
  • fix(layout): resize from a handle even after a fast drag; bigger handles by @huzaifffa in #547
  • UI: one keymap drives every keyboard shortcut by @giswqs in #572
  • Python API: Layer objects, run_tool, and view shortcuts by @giswqs in #574
  • COG: files side by side meet without a line by @elpidioassinaturas in #575
  • Analysis: A5 equal-area grids, and points counted by cell (#551) by @elpidioassinaturas in #573
  • feat(layout): lock layout elements so they can't be moved or changed by mistake by @jgregoriorincon in #576
  • Python: zoom_to takes run_tool's list of layers by @giswqs in #580
  • Fix main CI: redraw the GPU fast-path test map after editing it directly by @giswqs in #581
  • Status bar: zoom level next to bearing and pitch by @giswqs in #582
  • fix(render): draw a map text of several lines on as many lines in exports by @jgregoriorincon in #578
  • Plugin registry: mark process plugins in Browse before they're installed by @giswqs in #584
  • docs(plugins): point to the templates and rustgis-official-plugins by @giswqs in #585
  • feat(graphics): italic, alignment and letter spacing for text graphics by @jgregoriorincon in #586
  • Data: the Equi7 grids' coordinate systems, EPSG 27701–27707 by @elpidioassinaturas in #590
  • perf(tiles): draw vector tile shapes once into cached tile pictures by @giswqs in #587
  • fix(geom): carry rounded seconds in DMS coordinates instead of showin… by @shanerbergman in #589
  • feat(ui): italic, alignment and letter spacing in a map text's Format pane by @jgregoriorincon in #592
  • Projections: the sinusoidal projection, so MODIS GeoTIFFs open (#563) by @elpidioassinaturas in #594
  • fix(ui): keep a number dragged in the text form when it is let go by @jgregoriorincon in #597
  • fix(fonts): draw the semibold face heavier where the system font is variable (macOS) by @jgregoriorincon in #598
  • fix(edit): keep pasted text graphics' style in an older graphics layer by @jgregoriorincon in #599
  • perf(tiles): reuse drawn tile pictures while the map moves, draw the rest over frames by @giswqs in #600
  • feat(tiles): a vector tile style's shapes as meshes, made once per tile and level by @giswqs in #606
  • perf(gpu): draw vector tile styles as meshes on the GPU map by @giswqs in #611
  • Add live SQL Server and Azure SQL spatial sources by @deniial00 in #616
  • test(gpu): run the GPU fast path tests one at a time by @giswqs in #619
  • fix(ui): keep a dragged number when it is let go, in the layout, the ribbon and raster symbology by @jgregoriorincon in #608
  • feat(packaging): zsync files and update information for the AppImages by @pick2510 in #612
  • feat(layout): arrow keys nudge the selected element, one undo step a run by @huzaifffa in #614
  • feat(labels): a Labeling pane, opened from the layer's menu and the View tab by @jgregoriorincon in #620
  • UI: stop redrawing the map every frame while a side pane is dragged or a layer menu is open by @giswqs in #621
  • feat(imagery): control point fits with residuals, leave-one-out error and a recommended transform by @ryanjshields in #610
  • feat(layout): arrows, and lines and arrows turned to any angle by @huzaifffa in #613
  • i18n: add Persian (fa) translation with an RTL display layer by @A-talebifard in #595
  • feat(data): add a File Geodatabase from the Add Data dialog and the Browser by @pick2510 in #623
  • fix(ogc): accept the WMTS time keyword "current" by @golithe in #626
  • feat(sources): add swisstopo (geo.admin.ch) WMTS to the library by @golithe in #627
  • UI: right-click a map or layout tab to rename, duplicate or delete it by @giswqs in #628
  • feat(labels): a full-size Properties button in Style › Labels, with its own icon by @jgregoriorincon in #631
  • feat(data): open TIFF, PNG and JPEG scans that have no coordinates by @ryanjshields in #624
  • fix(geom): switch to km when a distance or area rounds up to the next unit by @shanerbergman in #634
  • perf(tiles): fetch tiles a few at a time per server, newest first, and drop stale ones by @giswqs in #636
  • perf(map): draw raster tile layers live on the GPU, from a fixed texture pool by @giswqs in #645
  • STAC: a collection's band as a data cube on the time slider (#559) by @elpidioassinaturas in #605
  • feat(labels): label classes with SQL queries by @jgregoriorincon in #640
  • feat(map): support Zoom To Layer for WMS layers by @deniial00 in #646
  • fix(map): switch to K, M or B when a legend number rounds up to the next form by @shanerbergman in #639
  • feat(data): write cloud-optimised GeoTIFFs by @ryanjshields in #629
  • fix(web): free the GPU map's memory, quiet tiny-skia's console warnings by @giswqs in #630
  • fix(data): with an alpha band, alpha alone says which COG pixels are empty by @giswqs in #650
  • Add acknowledgements and an AI disclaimer by @giswqs in #652
  • fix(assistant): build the Acknowledgements page into the docs by @giswqs in #655
  • feat(labels): place vector tile labels as MapLibre does by @giswqs in #642
  • fix(ui): open interactive workflows from Command Search by @deniial00 in #647
  • feat(labels): a SQL tab in the Labeling pane, to label only the features that match by @jgregoriorincon in #649
  • feat(ui): colour the Script pane's commands and JSON, and mark the lines that won't run by @jgregoriorincon in #654
  • Zarr: a variable that follows the time slider (#554) by @elpidioassinaturas in #601
  • fix(data): open downloaded JPEG 2000 rasters through desktop GDAL by @deniial00 in #659
  • fix(data): recognise JPEG 2000 downloads by their contents by @deniial00 in #664
  • feat(ui): suggest command ids in a floating list as a Script line's first word is typed by @jgregoriorincon in #666
  • Zarr: a variable's time series at a point, as a chart (#555) by @elpidioassinaturas in #602
  • feat(imagery): warp a raster with any control-point fit by @ryanjshields in #669
  • fix(symbology): honor explicit polygon class alpha by @deniial00 in #670
  • feat(analysis): add spatial join geoprocessing tool and engine command by @quanguet0409 in #657
  • Zarr: summarise a variable over time into a raster (#556) by @elpidioassinaturas in #603
  • feat(ui): show the highlighted command's signature, name and parameters beside the Script suggestions by @jgregoriorincon in #672
  • Ship third-party licence notices and check dependency licences by @giswqs in #674
  • fix(imagery): cubic takes no colour from see-through pixels by @ryanjshields in #673
  • Size the macOS DMG from its contents by @giswqs in #676
  • Analysis: trend over a data cube, Sen's slope and the modified Mann-Kendall test, cell by cell (#579) by @elpidioassinaturas in #604
  • feat(ui): keep a command's help by the cursor while its parameters are typed in the Script pane by @jgregoriorincon in #677
  • feat(ui): add a command's parameters when it's accepted in the Script pane by @jgregoriorincon in #679
  • feat(analysis): add Ordinary Kriging interpolation tool with variogra… by @quanguet0409 in #660
  • feat(map): bound streamed viewport and geometry caches by bytes by @yongyin-leon in #680
  • feat(data): cache streamed Shapefile spatial indexes on disk by @yongyin-leon in #668
  • Layouts: a font family for text, sans or serif, from the installed fonts (#517) by @elpidioassinaturas in #675
  • Analysis: trend over a STAC collection's band, read in place in pieces (#579) by @elpidioassinaturas in #678
  • feat(ui): close a brace typed in the Script pane, step over it and delete the pair by @jgregoriorincon in #686
  • feat(render): stream complete Shapefile layers in ordered chunks by @yongyin-leon in #681
  • Raster: a minimum and maximum for each band of an RGB stretch by @ninhhaidang in #693
  • fix(data): keep 3D surfaces and curves of layers read through GDAL by @pick2510 in #691
  • fix(ui): let Ctrl/Cmd+Z undo a text field's typing, not the project by @jgregoriorincon in #689
  • Add attribute table geometry calculator with field and unit selection by @devjuhans in #633
  • fix(layout): show the map, not the page, sliding into a frame as it's panned by @huzaifffa in #656
  • fix(web): keep the browser from acting on the app's Ctrl (⌘) shortcuts by @huzaifffa in #658
  • Raster: show JPEG-compressed YCbCr GeoTIFFs as RGB by @ninhhaidang in #694
  • perf(render): draw a layer too dense to mesh on the CPU in GPU mode by @pick2510 in #695
  • Analysis: a STAC trend checks its bbox, cellSize and resampling before searching (#579) by @elpidioassinaturas in #696
  • feat(ui): offer a command's parameter keys in the Script pane by @jgregoriorincon in #690
  • fix(engine): restore project name when Save As fails by @yongyin-leon in #703
  • test(render): let streamed reads land before the stream tests render by @giswqs in #700
  • feat(data): read Esri File Geodatabases without GDAL by @pick2510 in #697
  • Data: Shapefile cache releases unlock explicitly, fixing flaky cache tests (#687) by @giswqs in #704
  • Fix undo grouping for ribbon label size and colour edits by @Mavrick-F in #688
  • feat(connections): add reusable endpoints, storage and session logins by @deniial00 in #701
  • Layouts: a publication layout in one command, a sheet or a figure sized to its page (#682, part 1) by @elpidioassinaturas in #698
  • fix(data): preserve existing files on staging collisions by @yongyin-leon in #702
  • feat(map): add Vietnam VN-2000 coordinate system support and presets by @quanguet0409 in #684
  • feat(ui): manage connections in the Data Sources pane by @deniial00 in #705
  • test(ui): fix the flaky connections context-menu click on Windows by @giswqs in #710
  • feat(connections): browse and add datasets from the Connections tree by @deniial00 in #708
  • feat(connections): pick and save connections in add dialogs by @deniial00 in #711
  • feat(ui): offer tools and their parameter keys in a gp.run line by @jgregoriorincon in #712
  • fix(data): honor Shapefile code-page metadata by @Mavrick-F in #713
  • perf(render): reuse adjacent segment normals in line offsets by @yongyin-leon in #716
  • perf(data): evaluate polygon label grid with scanline masks by @yongyin-leon in #717
  • feat(ui): offer second-level keys and a task step's command in the Script pane by @jgregoriorincon in #720
  • fix(engine): keep a polygon's outline when its fill color changes by @ninhhaidang in #721
  • feat(ui): Home › Add Data › Connections… and New Connection menu (#699) by @deniial00 in #714
  • Add imperial unit support across analysis, editing and measurement by @Mavrick-F in #719
  • feat(connections): reopen database layers on connection login and keep layer tokens out of saved projects by @deniial00 in #723
  • feat(linux): draw an Adwaita title bar on Wayland by @pick2510 in #725
  • perf(render): reuse path storage for stacked line strokes by @yongyin-leon in #727
  • feat(ui): name tree-added datasets in Recent after their connection by @deniial00 in #724
  • test(gpu): run mapgpu GPU tests one at a time by @brownag in #735
  • feat(ui): pick several layers in the Layers pane by @ninhhaidang in #728
  • feat(map): stacked line strokes per class by @pick2510 in #729
  • feat(ui): pair quotes in the Script pane as braces and brackets by @jgregoriorincon in #731
  • fix(engine): end a parameter string at its first unescaped quote by @jgregoriorincon in #736
  • fix(labels): let each label class label every feature it matches by @jgregoriorincon in #737
  • Layouts: a publication layout's locator, a globe or an inset with the area outlined (#682, part 2) by @elpidioassinaturas in #706
  • fix(connections): drop stale listings in the add dialogs by @deniial00 in #715
  • Layouts: a publication layout's surrounds keep off the data; a decimal comma (#682, part 3) by @elpidioassinaturas in #709
  • feat(map): draw stacked strokes in levels by @pick2510 in #734
  • fix(ui): stop a tiled map redrawing for good while a frame is drawn by @pick2510 in #740
  • Layouts: a publication sheet's style, accent and orientation; graticule labels kept apart (#682, part 4) by @elpidioassinaturas in #742
  • refactor(engine,ui): read quoted text by one rule by @jgregoriorincon in #743
  • feat(symbology): add No Fill for polygon layers by @choupeanut in #745
  • fix(data): preserve UTF-8 field content by @Mavrick-F in #746
  • fix(layout): a publication legend that fits exactly isn't said to overflow by @giswqs in #749
  • docs: rework the roadmap; GeoLibre parity and CONTRIBUTING.md in the repo by @deniial00 in #747
  • i18n: translate the 306 new interface strings in every language by @giswqs in #753
  • Layouts: a publication sheet's accent must be opaque; a column always holds the legend (#682) by @elpidioassinaturas in #750
  • feat(map): a layer's reference scale by @pick2510 in #763
  • Analysis: a STAC trend's keys read from cube.trend's description, so none is said to be ignored (#579) by @elpidioassinaturas in #766
  • docs: bring every page up to date with the code by @deniial00 in #752
  • feat(secrets): an OS keychain secret store behind Services::secrets by @deniial00 in #767
  • fix(symbology): choose compatible fields when switching renderers by @deniial00 in #772
  • test(gpu): a settled planet frame without its tile yet hides the overlay too by @giswqs in #776
  • Analysis: summarise any data cube over time, by year or month of the year (#579) by @elpidioassinaturas in #774
  • feat(data): define source projection for Shapefile layers by @Mavrick-F in #778
  • Web reads: a file's last bytes from a store that answers a suffix range with 501 by @elpidioassinaturas in #751
  • feat(ui): offer layers and fields as values in the Script pane by @jgregoriorincon in #771
  • feat(plugins): raise the manifest command limit to 256 by @choupeanut in #780
  • build(deps): bump anthropics/claude-code-action from 1.0.250 to 1.0.257 in the actions-minor-patch group by @dependabot[bot] in #782
  • build(deps): bump the cargo-minor-patch group with 4 updates by @dependabot[bot] in #784
  • build(deps): bump pyo3-build-config from 0.29.3 to 0.30.1 by @dependabot[bot] in #787
  • test(ui): stop calling half-painted GPU frames settled by @Mavrick-F in #791
  • feat(ui): run the Script pane with Ctrl+Enter (⌘+Enter on macOS) by @jgregoriorincon in #783
  • test(gpu): paint until tile uploads finish in the GPU waiter by @giswqs in #793
  • build(deps): bump eframe from 0.36.2 to 0.37.0 in the egui group by @dependabot[bot] in #781
  • fix(ui): fall back to an installed symbol face for marks like ✓ by @giswqs in #796
  • feat(connections): remember database passwords in the OS secret store by @deniial00 in #777
  • fix(map): Load All Features waits for a web source still opening by @pick2510 in #775
  • Analysis: a trend over a state in one call from rustgis-cli run, with progress for trends and summaries (#579) by @elpidioassinaturas in #792
  • feat(assistant): remember API keys in the system keychain by @choupeanut in #795
  • fix(ui): name shortcuts by the OS egui reads, a Mac browser's too by @jgregoriorincon in #801
  • feat(map): dashed line strokes by @pick2510 in #765
  • Analysis: summarise a stack of categorical rasters over time: mode, frequency, changes, longest run and more by @elpidioassinaturas in #798
  • UI: name input widgets and restore accessibility checks by @giswqs in #806
  • Added Bengali language localization by @SophisticatedStupid in #803
  • feat(labels): label lines along them, straight or curved, and italic labels by @pick2510 in #802
  • perf(render): cache repeated text width measurements by @yongyin-leon in #804
  • fix(app): copy and paste through the system clipboard again on egui 0.37 by @jgregoriorincon in #815
  • feat(symbology): geometric interval and standard deviation classes by @alteralto in #805
  • feat(data): read ArcGIS layers past their record limit, in the app and the browser by @Mavrick-F in #823
  • fix(geom): ring area across the antimeridian (#810) by @subarna-kandel in #811
  • fix(data): NOT over a null is unknown in where clauses (#813) by @subarna-kandel in #814
  • fix(tiles): read a large GeoTIFF tile index in place, doubling the header step by @elpidioassinaturas in #826
  • test: fix main CI on macOS and Windows (thin-font halo test, sign-in cancel race) by @giswqs in #820
  • test(ui): fix the flaky connection-chooser smoke test by @giswqs in #833
  • test(ui): scroll the Script results under the run's line by @jgregoriorincon in #832
  • feat(ui): offer a gp.run tool's parameter values by kind in the Script pane by @jgregoriorincon in #827
  • feat(analysis,engine): add zonal statistics geoprocessing tool (gp.zo… by @quanguet0409 in #718
  • fix(data): recognize GDA2020 as WGS 84-like, fixing #730 by @ninhhaidang in #837
  • feat(ui): add reusable ribbon split button by @deniial00 in #835
  • feat(symbology): manual class breaks by @alteralto in #822
  • fix(ui): allow selecting a field before applying unique symbology by @devjuhans in #738
  • feat(labels): draw labels in an installed font family, by name by @pick2510 in #824
  • feat(map): open QGIS projects as maps and apply QGIS layer styles by @pick2510 in #825
  • feat(s3): remember saved connection keys by @deniial00 in #794
  • fix: restore main builds after QGIS and connection merges by @giswqs in #840
  • feat(ui): complete project names in the Script pane by @choupeanut in #817
  • Fix zonal statistics validation and review feedback by @giswqs in #838
  • fix: include web tile layers in map search by @deniial00 in #834
  • i18n: translate 162 new interface strings in every language by @giswqs in #843
  • perf(data): hold paged service features as their JSON text by @Mavrick-F in #841
  • feat(layout): export a layout to SVG by @alteralto in #839
  • feat(labels): choose, add, rename, remove and order label classes in the Labeling pane by @jgregoriorincon in #789
  • fix(ui): name label class controls for accessibility by @giswqs in #849
  • fix(map): QGIS import follow-ups: TRUE/FALSE and exponents in filters, label fonts, unread source options by @pick2510 in #844
  • fix(ui): run the SQL pane's query once per Ctrl+Enter, not for each key repeat by @jgregoriorincon in #848
  • Data: preserve national datum shifts in ESRI WKT by @giswqs in #850
  • Release v0.4.0: version, roadmap and highlights by @giswqs in #847
  • fix(analysis): join layers with different source CRSs by @Mavrick-F in #854
  • Add polygon, lasso, and radius map selection by @deniial00 in #855
  • feat(ui): offer field names in arrays and in keys that take a field in the Script pane by @jgregoriorincon in #856
  • Data: refuse destructive GeoPackage overwrites by @giswqs in #857
  • fix(edit): preserve same-feature targets when snapping vertices by @yongyin-leon in #818
  • chore(i18n): complete selection and label class translations by @giswqs in #860
  • fix(edit): honor vertex snapping for Point and MultiPoint targets by @yongyin-leon in #859

New Contributors

Full Changelog: v0.3.0...v0.4.0

Don't miss a new RustGIS release

NewReleases is sending notifications on new releases.