Unlock Version
Lock Version
The QGIS Project proudly announces the release of QGIS 3.44, a momentous release that marks the culmination of the QGIS 3 series. This release arrives within a vibrant and ever-expanding ecosystem of free and open-source geospatial tools, libraries, and community support that empowers users worldwide. Building upon the solid foundations of previous releases, QGIS 3.44 provides a stable and refined experience for all users as the project transitions to the modern Qt6 framework with the upcoming release of QGIS 4.0 in October 2025.
As the final feature release of the QGIS 3.x branch, this version ensures a reliable environment for existing workflows, and plugin developers can anticipate a smooth transition between releases, as QGIS 4.0 will retain deprecated APIs to minimize compatibility efforts and allow the ecosystem to evolve alongside the core application.
While focused on stability and refinement, the release still includes a range of notable enhancements that refine workflows and empower users in their geospatial endeavors. Such enhancements include refinements to database management and connectivity, improved data provider flexibility, and new project settings. Old favourites such as the Processing toolbox and QGIS Expressions also see their fair share of improvements, and cartographic capabilities get a boost with new labelling and layout updates.
For a whirlwind tour of all the new functionalities introduced, you can view the highlight reel video on YouTube.
QGIS is a community effort, and we would like to extend a big thank you to the developers, documenters, testers, and the many folks out there who volunteer their time and effort (or fund people to do so) to make these releases possible. From the QGIS community, we hope you enjoy this release! If you wish to donate time, money, or otherwise contribute towards making QGIS more awesome, please wander along to QGIS.ORG and lend a hand!
QGIS is supported by donors and sustaining members. A current list of donors who have made financial contributions large or small to the project can be seen on our list of donors. If you would like to become an official project sustaining member, please visit our sustaining member page for more details. Sponsoring QGIS helps us to fund our regular developer meetings, maintain project infrastructure, and fund bug-fixing efforts. A complete list of current sponsors is provided below - our very big thank you to all of our sponsors!
QGIS is free software and you are under no obligation to pay anything to use it - in fact, we want to encourage people far and wide to use it regardless of their financial or social status - we believe that empowering people with spatial decision-making tools will result in a better society for all of humanity.
Initial work packages of the QEP Overview of widget types while configuring forms. This PR will pave the road for subsequent features.
We preserved the look and feel as well as the prior behavior, while doing small refactorings and improving minor UI/UX issues.
Based on the new model/view approach, this PR introduces a new feature:
[FEATURE] Allow users to switch between field names and field aliases in both the Available Widgets and the Form Layout panels.
https://github.com/user-attachments/assets/a81a3928-8c55-4f8e-98b8-57a1505437f2
Other enhancements:
BEFORE
AFTER
Description of the before/after scenario above:
Available Widgets
panel and its label/alias (if show aliases is active and if the relation has a custom label) in the Form Layout
panel.Includes unit tests.
Fix #37038
Fix #49502
Fix #61608
This feature was funded by the [QGIS user group Switzerland](.)
This feature was developed by Germap
Shows the database query history panel in the Execute SQL dialog, and adds a top level action to open the query history window.
Implements https://github.com/qgis/QGIS-Enhancement-Proposals/blob/master/qep-332-sql-query-history.md
https://github.com/user-attachments/assets/fe919f6e-e256-4254-a2ae-8f4ea49e6a42
https://github.com/user-attachments/assets/27bb6ff5-f365-4d75-835e-f47ad582f9bf
Fixes #61476 / #61493
The analysis of DescribeFeatureType response with the GMLAS driver makes appear fields that are not supported by the
addFeatures()/changeAttributeValues() method. So if transaction support is detected and featureMode=default, use QGIS built-in analyser to get SimpleFeatures only. Otherwise try the GMLAS method.
This feature was developed by Even Rouault
This PR adds two new settings for vector layer labels:
Note that both settings require a build based on GEOS 3.10 or later.
Fixes #23154
This feature was developed by Nyall Dawson
Allow layer tree group node to expose time dimension
A new checkbox allows to enable or disable the computation of this time dimension. If enabled, it would recursively generate the time dimension based upon its children time dimension. A group which time dimension computation is disabled would not propage the time dimension of its children to its parent.
Add also support of date range in time dimension with respect to the OGC WMS and ISO8601 standard.
Like the equivalent Oracle provider setting, this allows users to specify a single schema to limit a Postgres connection to.
When set, only tables from the matching schema will be included in the browser panel and data source select for the connection.
This can be used to limit the database work required to populate tables for a connection pointing to a large database store.
Allows legend text to be automatically wrapped after a set line length (in millimeters).
This can prevent very wide auto-generated legends.
https://github.com/user-attachments/assets/48b00615-3e26-49be-9361-0645195be364
This feature was developed by Nyall Dawson
The server QgsConfigCache
currently uses default-constructed QCache
s which default to cost=100
, i.e. 100 entries. This PR adds the QGIS_SERVER_PROJECT_CACHE_SIZE
Env-Var to make this configurable.
This feature was developed by Sandro Mani
Expose raster creation options in the raster calculator UI (both native dialog and Processing algorithm).
Raster calculator
Processing algorithm
Follow-up #61175, fixes #39082.
This feature was developed by Alexander Bruy
Allow user to edit server properties on layer tree group and return them on GetCapabilities request. So far, only short name, title and abstract were available. There are now:
- keywords,
- data URL (with format)
- Attribution title and URL
- Metadata URLs
- Legend URL (and format), with a default generated one in case there is none defined
<Name>MyShortName</Name>
<Title>This is the title</Title>
<Abstract>
This is a more descriptive text aboout the WMS data.
</Abstract>
<KeywordList>
<Keyword>keyword1</Keyword>
<Keyword>keyword2</Keyword>
</KeywordList>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:3943</CRS>
<CRS>EPSG:3857</CRS>
<EX_GeographicBoundingBox>
<westBoundLongitude>-180</westBoundLongitude>
<eastBoundLongitude>180</eastBoundLongitude>
<southBoundLatitude>-85.051129</southBoundLatitude>
<northBoundLatitude>85.051129</northBoundLatitude>
</EX_GeographicBoundingBox>
<BoundingBox CRS="EPSG:3857" minx="-20037508.343" miny="-20037508.343" maxx="20037508.343" maxy="20037508.343"/>
<BoundingBox CRS="EPSG:3943" minx="-100494907.822" miny="-93107605.747" maxx="103803487.301" maxy="61264912.326"/>
<BoundingBox CRS="EPSG:4326" minx="-85.051129" miny="-180" maxx="85.051129" maxy="180"/>
<DataURL>
<Format>text/plain</Format>
<OnlineResource xlink:type="simple" xlink:href="http://mydataurl.com"/>
</DataURL>
<Attribution>
<Title>Attribution title</Title>
<OnlineResource xlink:type="simple" xlink:href="http://myattributionurl.com"/>
</Attribution>
<MetadataURL type="FGDC:1998">
<Format>text/xml</Format>
<OnlineResource xlink:type="simple" xlink:href="http://mymetadata.com/data1"/>
</MetadataURL>
<MetadataURL type="ISO19115:2003">
<Format>text/plain</Format>
<OnlineResource xlink:type="simple" xlink:href="http://mymetadata.com/data2"/>
</MetadataURL>
<Style>
<Name>default</Name>
<Title>default</Title>
<LegendURL>
<Format>image/png</Format>
<OnlineResource xlink:type="simple" xlink:href="http://findthelegendhere.com"/>
</LegendURL>
</Style>
This PR create a single "Toolbox" panel for both the Inputs and Algorithms panel under a single panel.
The "Algorithms" panel is turned into a "Toolbox" panel and is embellished with a new sub categories "Input parameters" that is now searchable along side other model component. The parameter inside the toolbox behave as you would expect with double click and drag and drop to add it to the model
This feature avoid the annoyance to switch between the two panels back and forth. Additionally the model parameters are now searchable as well !
To note: The "Inputs" panel is still available on his own
Thanks to the Hauts-de-France region for sponsorising this work and Camptocamp for their collaboration
Before the PR:
After the PR:
This feature was developed by Valentin Buira
This PR adds a new project-level setting for the scale calculation method, with choices for "at top of map", "at bottom of map", "at middle of map" and "horizontal average".
Changing the scale method has the following impact:
There's also a new scale calculation method introduced for "scale at equator". This method always calculates the scale at the equator, regardless of the actual visible map extent. It can be used to provide a consistent, static scale for maps in geographic reference systems, regardless of the latitudes actually visible in the map (permitting consistent appearance of these maps when rendering relies on scale based visibility or calculations). Otherwise a project in eg EPSG:4326 which uses scale based visibility of layers and symbols will see layers and features "randomly" disappear as the map is panned, even though the user has not zoomed in or out of the map.
This method is only applicable when calculating scales with a degree based reference system.
(It's also useful for those who want to mimic the behavior of ESRI products, which ALWAYS calculate the scale at equator for geographic CRS.)
This feature was developed by Nyall Dawson
Improve the georeferencing of DIMAP / Pleiades NEO products. This is the counterpart of the GDAL change of https://github.com/OSGeo/gdal/pull/11989 but it can be applied independently of it.
With this PR dataset MARSEILLE_PRY_NoHD15_NoDHZ_JP2/000251471_1_1_STD_A/IMG_01_PNEO3_PAN/DIM_PNEO3_STD_202111071029297_PAN_SEN_PWOI_000251471_1_1_F from https://geodelivery.intelligence-airbusds.com/main.html?download&weblink=7f828450ac65e2d61bfd5ea4ac8b3feb&realfilename=MARSEILLE_ORT_NoHD15_NoDHZ_JP2.7z overlaps nicely with OSM background
This feature was developed by Even Rouault
This PR adds a new tool to create cross sections in 3D scene. User enables this tool in 3D window, selects the area on 2D canvas and after confirmation the 3D scene will be edited + the camera will change to profile view.
Left click
-> adds point
~~BACKSPACE
or DEL
-> remove last step in selection~~
Right click
or ESCAPE
-> resets the selection
https://github.com/user-attachments/assets/3e0e7a67-d28d-48d4-a342-ed267f2d603a
This PR allows to display subsections indicator as vertical lines in the profile tool. This is based on the ideas discussed in https://github.com/qgis/QGIS-Enhancement-Proposals/issues/260
It works on the Elevation Profile
and the Print Layout
. In both cases, it is possible to change the symbology of the lines. For the elevation profile, theses new options are added to the options menu.
cc @Simon-Lopez @T4mmi @Djedouas
While the default remains at GET requests, this change allows users to switch a particular WFS connection to prefer POST requests:
(For motivation see https://github.com/qgis/QGIS/issues/32348)
Allows temporary output in Batch processing (see attached video example).
One thing to consider would be if it makes sense to allow temporary outputs if Load layers on completion is not checked.
Adds options for QGIS Projects stored in PostGIS database to:
This adds configuration option to Nominatim Geocoder Locator filter for filtering results to one or more countries. (Two letter country codes, comma separated). Configuration value is optional.
Allows the user to select a fixed date/time for a raster layer temporal properties so he doesn't have to set the same date/time for start and end of a temporal range.
This expands the database table import dialog to add a new field mapping section, which gives users control over the
fields in the created table. Users can rename, set the exact destination field types, and tweak the source expression
for each output field. Fields can also be excluded from the import, or new fields created which don't exist in the source table.
Refs https://github.com/qgis/QGIS/issues/24192
Refs https://github.com/qgis/QGIS/issues/45286
When a table is imported to a database via the browser, the user now has an option to filter the copied records by extent or expression:
This PR is a step towards porting the DB Manager "Import vector table" functionality into core/browser. I've taken extreme care here to ensure that everything is kept generic and that the GUI is all dynamically built based on the available capabilities of the destination database provider. This means that we gain native import vector table control for postgres, hana, sql server, gpkg, spatialite + the OGR database formats (eg ESRI File Geodatabase) in one shot, and that any future extensions to this dialog will automatically apply to all relevant destination providers. *
To facilitate this, I've added new API to the database connections classes. I've removed a lot of duplicate copy/paste code from the various QgsDataItemGuiProvider subclasses and moved them to generic methods in QgsDataItemGuiProviderUtils.
Some notes:
Fixes https://github.com/qgis/QGIS/issues/24194
This ports the equivalent functionality from DB Manager over to the core/browser "Execute SQL" dialog.
Users can insert stored queries into their current query, save new stored queries, and remove queries via a new toolbar action.
Users can opt to store queries in either the current project (ie the DB Manager approach, and this is fully compatible with
existing queries stored via DB Manager) or in the local user profile (so that they are available across different projects)
https://github.com/user-attachments/assets/7035bfb4-6e48-4d32-a475-be2de4ae86cc
This adds support for saving and loading SQL queries to a .sql text file to the Execute SQL dialog and Update SQL dialogs.
Effectively, it ports this functionality from the DB Manager plugin over to the core browser-based database connection facilities.
The UX has been designed to mimic the same functionality from other standard parts of QGIS, eg the Processing Script Editor. Toolbar actions are used accordingly, instead of the old text button approach used in DB Manager. To accompany the new toolbar I've also added standard actions for operations like copy/paste/undo/redo, again mimicing the Processing Script Editor dialog UI
Allows loading SQL Server queries as map layers from the browser, and updating the SQL for existing query layers
Fixes https://github.com/qgis/QGIS/issues/19301
Fixes #59494.
Similarly to already existing Split and Duplicate "policies" this PR implements Merge Policies, which determine the initial values in the Merge Features dialog. The PR includes the following merge policies:
From the existing Qgis::FieldDomainMergePolicy
enum:
* Sum: numeric fields only
* Geometry Weighted: numeric fields only, uses weighted average by geometry
* Default Value: uses the default value set in QGIS (expressions use a dummy feature with the merged geometry, but referring to other fields won't work)
New policies:
* Unset Field: similarly to Split & Duplicate policies clears the field and lets the data provider populate any default value if one exists. If it doesn't the first feature is used (this is the behavior which is currently implemented)
* Largest Geometry: use the value from the feature with the biggest geometry (length/area/number of parts for multipoints)
* Minimum Value: numeric fields only
* Maximum Value: numeric fields only
* Set to Null: sets the value of the field for the feature to NULL
Initial merge dialog before PR:
Initial merge dialog after PR:
Configuring the policies:
This feature was funded by the National Land Survey of Finland.
This feature was developed by Juho Ervasti
This PR adds an oauth2 advanced configuration option to attach extra tokens sent by the OAuth2 token endpoint as HTTP(S) request headers. The UI looks as follow:
This can be quite useful when working with OAuth2 service providers such as Google which adds openid tokens to their token replies.
This feature was developed by Mathieu Pellerin
This PR add the new way to edit a model using a drag and drop interface. This is part of long waited improvements in the model designer capabilities.
The design is based of the Google Summer of code proposal I did last year, and that we discussed on the mailling list. Compared to the original proposal the UI looks more similar to the current modeler interface
I encourage anyone to open your existing models and give it a try !
Thanks to the Hauts-de-France region for sponsorising this work
New sockets were added around each parameter and algorithm used in a model.
https://github.com/user-attachments/assets/30f3df6f-cfad-4cad-aa32-0de2bdb58828
Those are interactive and are used to connect component between them. To connect component drag any output socket regardless of it's from a model parameter or a algorithm into an input socket. You can also remove a connection by dragging an edge out of the socket.
https://github.com/user-attachments/assets/becb533b-2914-4454-be17-78528fc363a1
Theses new capabilities have been added as part of the select/edit tool. No needs to switch to a new tool when you want to edit connection in your model. The icon has been updated in consequence.
This PR remain fully compatible with the previous user interface. When you connect sockets by drag and drop. The dialog used when opening an algorithm is updated as well.
https://github.com/user-attachments/assets/42b2c2ef-4c79-4b76-baec-7886540ceee8
This feature was developed by Valentin Buira
This PR adds an option via a button in the categorized symbol renderer widget to delete unused categories from the model/view. I.e. any categories which are not matched in the attribute field or expression used to categorize the layer.
Example use case:
I have a layer of land systems covering the entire Northern Territory and a .qml style file which categorizes this layer into some 22 classes based on an attribute "CLASS".
Now I clip this NT-wide layer to a much smaller area. The subset only contains 7 of these classes, however I still want to load the style from the same .qml style file.
With the added option, one can quickly delete all the categories which are not used by the smaller subset layer:
In the added void QgsCategorizedSymbolRendererWidget::deleteUnusedCategories()
method, I reused a block of code from the existing addCategories()
method to build a QList<QVariant>
of unique values in the layer based on the current classification attribute or expression. To avoid duplication & to try and keep things tidy, I moved this block to a new protected method: QList<QVariant> QgsCategorizedSymbolRendererWidget::layerUniqueValues( QString attrName )
which returns the list of unique values and is then called in both addCategories()
and deleteUnusedCategories()
.
This feature was developed by Ben Wirf
This PR introduces a new spatial analysis' raster rank algorithm:
The algorithm takes a collection of rasters as input and creates an output with cell values matching the rank order of a list of cell values take from the input collection of rasters. For e.g., if the list of input values for a given cell is [10,20,30,40] and the rank is 2, the output value will be 20.
The algorithm also allows for negative index rank. Given the same list of input values - [10,20,30,40] - using rank -2, the output value would be 30.
Finally, the algorithm offers to nodata handling behavior. By default, nodata values are excluded from the list and a given output cell will only be set to nodata if the rank is greater than the values list size. Users can also pick an alternative behavior whereas one or mode nodata values for a given cell in the input layers will result in a nodata value for that output cell. The alternative behavior matches what ArcMap is doing in its own raster rank algorithm.
This feature was developed by Mathieu Pellerin
Processing batch mode allows to defined output name using expressions and all algorithm parameters are available as values in this context. However, CRS parameters when used in expression return nothing. This happens because when algorithm scope is populated we create variables using the values obtained from parametersForRow()
method and these values are just uses as-is
https://github.com/qgis/QGIS/blob/6b4ffb39a887a4f10d04373f27250b6d7b1f2293/python/plugins/processing/gui/BatchPanel.py#L956-L961
In case of CRS parameter, variable will be populated with the instance of QgsCoordinateReferenceSystem
. Expression engine does not have support for variants containing QgsCoordinateReferenceSystem
and evaluating such variable returns nothing as reported in #58313.
This PR adds two new expression functions:
make_crs(definition)
to create a QgsCoordinateReferenceSystem
from a definitioncrs_authid(crs)
to get a string with the CRS authidRefs #58313.
This feature was developed by Alexander Bruy
This highly in-demand tool seems to be fragile and error-prone when run via the SAGA Processing Plugin.
A new native tool has been provided to provide an optimized out-of-the-box tool that is stable and effective.
Note that, as this implementation is a clone of the SAGA implementation, bugs present in the source will be present in the new native tool.
This feature was developed by Nyall Dawson
Import PR from Github into Entries