.. _changelog316: Changelog for QGIS 3.16 ======================= |image1| Another great day for the QGIS project! We are pleased to show you some of the highlights of this new release below. **Thanks** We would like to thank the developers, documenters, testers, and all the many folks out there who volunteer their time and effort (or fund people to do so). From the QGIS community, we hope you enjoy this release! If you wish to donate time, money, or otherwise get involved in 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 and small to the project can be seen on our `donors list `__. If you would like to become an official project sustaining member, please visit our `sustaining member page `__ for 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 great 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 what your financial or social status is - we believe empowering people with spatial decision-making tools will result in a better society for all of humanity. .. contents:: :local: Temporal -------- Feature: Ability to export temporal animation frames ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows exporting of temporal animation frames to successive images, for later stitching together in an external application. Users have precise control over the image size and map extent. This feature was developed by `Nyall Dawson `__ Map Tools --------- Feature: Go-To locator ~~~~~~~~~~~~~~~~~~~~~~ We have added a new goto locator filter. The goto indicator takes in the following strings: - A pair of x and y coordinates (separated by a comma or space). - An OSM, Leaflet, or OpenLayers formatted URL. - A Google maps URL. The logic of the XY string is as follows: - If the canvas CRS isn't WGS84: - If the coordinate fits within WGS84 bounds, add a WGS84 result (this is weighted to have higher priority than the canvas CRS result below). - If the coordinate fits within the canvas CRS bounds, add a canvas CRS result. - If the canvas CRS is WGS84: - If the coordinate fits within the WGS84 bounds, add a WGS84 result. |image2| This feature was developed by `Mathieu Pellerin `__ Symbology --------- Feature: Expose option to offset simple line dash patterns by a preset amount ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows for tweaking the positioning of dashes/spaces in the line, so that the dashes/spaces can be placed at nicer positions to account for corners in the line (also can be used potentially to "align" adjacent dash pattern borders). The offset can be set in various units, including map units, and can also be data defined. This feature was funded by `Kanton Solothurn `__ This feature was developed by `Nyall Dawson `__ Feature: Add options to dynamically tweak dash pattern in simple line symbol layers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Options have been added to allow the tweaking of dash patterns to allow more control for improving the rendered quality of line symbols. These options include: - Align dash pattern to line length: If checked, the dash pattern lengths will be subtly adjusted in order to ensure that when a line is rendered it will end with a complete dash element, instead of a gap element or partial dash element. - Tweak dash pattern at sharp corners: If checked, this option dynamically adjusts the dash pattern placement so that sharp corners are represented by a full dash element coming into and out of the sharp corner. It's designed to better represent the underlying geometry while rendering dashed lines, especially for jagged lines. The following images illustrate the "Align dash pattern to line length" change in action, with yellow lines indicating the true start and end position of the line features being symbolised. Before: |image3| After: |image4| |image5| This feature was funded by `Kanton Solothurn `__ This feature was developed by `Nyall Dawson `__ Feature: Manage 3D symbols through style manager ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Support has been added for managing 3D symbols through the QGIS style manager, including support for importing and exporting libraries of 3d symbols, and completes the recent work in fully abstracting out 3D symbols and their widget handlers. Unfortunately, there are no thumbnails generated for 3D symbols in the library, and a generic icon is used for all 3D symbols for the time being. Generating thumbnails is no trivial matter, so it has been deferred for the time being. This feature addresses the issue raised in `31479 `__. |image6| This feature was developed by `Nyall Dawson `__ Labelling --------- Feature: Control anchor point for line labels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A new option is exposed which allows users to control whether the anchor point for the labeling of line features is a hint or a strict requirement. The resulting behavior modifications include the following: - Strict: Labels are placed exactly on the label anchor only, and no other fallback placements are permitted. - Hint: The label anchor is treated as a hint for the preferred label placement, but other placements close to the anchor point are permitted. |image7| This feature was developed by `Nyall Dawson `__ Diagrams -------- Feature: Render axis for stacked bar diagram ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This adds support for rendering the axis on stacked bar diagrams if an axis has been set. The implementation is based on the axis rendering for the histogram diagram. Negative values are not handled properly by stacked bar diagrams with or without the axis being displayed. Addresses `Issue 34915 `__ |image8| This feature was developed by `Dan Minor `__ Mesh ---- Feature: In-memory mesh datasets with persistence ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This feature introduces the ability to create in-memory dataset groups for mesh layers. These dataset groups are temporary and are not kept once the project is closed. A new option has been added to the mesh calculator which allows the creation of in-memory dataset groups. This feature also introduces the ability to remove or save these memory dataset groups to a file with the specified driver. |image9| |image10| This feature was developed by `Vincent Cloarec `__ Feature: Multi identify for mesh layer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The identify tool has been adapted when used on mesh layers and now displays the dataset value corresponding to the current time of the temporal controller for all dataset groups. The active dataset groups (scalar and eventually vector) are first displayed, then the other dataset groups. There is also other information displayed, including: - Source where the dataset is stored - Time step of the dataset that is displayed (can be different than the time of the temporal controller). Displays nothing if the dataset group is not temporal - Centroid of the corresponding face - Coordinate of the snapped vertex (if one is snapped) - Center of the snapped edge (if one is snapped) When the map canvas does not have temporal navigation enabled, the identify results contain only information about the active dataset groups which have static datasets defined in the mesh properties dialog. |image11| This feature was developed by `Vincent Cloarec `__ Feature: Virtual dataset groups for mesh layer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ability to use "virtual" data set groups has been introduced for mesh layers. This replaces the "memory" dataset group used in `37389 `__. With the mesh calculator, users may choose to create those "virtual" dataset groups that will be added to the layer. Values are not stored in memory but each dataset is rather calculated when needed with the formula entered in the mesh calculator. Those virtual dataset groups are saved within the project and be removed or saved to file for persistence. Persistent and virtual dataset groups are distinguished in the source tab of the mesh layer properties by changes in the color of the background for each item, indicated as follows: Persistent: yellow Virtual: purple |image12| |image13| This feature was developed by `Vincent Cloarec `__ Feature: Add export to QgsMesh method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A method has been added to export a triangulation to a QgsMesh instance, with the possibility to construct mesh layer with triangulation from existing points and lines. This is the first step to allow the ability to obtain a QgsMesh from other map layers. The Triangulation and DualEdgeTriangulation classes were also renamed and refactored to make them more consistent with QGIS code. - Add a method to export the triangulation to a QgsMesh instance. This feature was developed by `Vincent Cloarec `__ Feature: TIN Mesh creation ~~~~~~~~~~~~~~~~~~~~~~~~~~ TIN mesh layers can be created from vector layer data (vertices and/ or break lines). The resulting mesh is constructed with a constrained Delaunay triangulation. This mesh layer can be created using the python API or through an algorithm in the processing tool box. |image14| This feature was developed by `Vincent Cloarec `__ Rendering --------- Feature: Gamma correction filter for raster layers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Add gamma correction filter pipe for raster layers in addition to the existing brightness, contrast, hue, and saturation filters. Users can adjust the gamma value from the layer properties dialog, using styling panel and/or new buttons on the Raster toolbar. Default gamma value is 1.0 and it can be adjusted within the range 0.1 to 10. Addresses `Issue 13512 `__ Also adds a rendering test for brightness and contrast filter which has no test at all and fixes some deprecation warnings in the Python test for ``QgsRasterLayer``. |image15| This feature was developed by `Alexander Bruy `__ 3D Features ----------- Feature: Allow 3D material texture files to be embedded in style/project ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Some minor API and code cleanups were performed, as well as introducing the use of QgsImageCache for 3D texture files in order to allow them to be embedded within projects. This feature was developed by `Nyall Dawson `__ Feature: Directional lighting support for QGIS 3D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Added directional lights to QGIS 3D - Now the user can add directional lights to the 3D views. - I added a tab widget under the lights section of the 3D configuration dialog. - The user can specify the direction of the light, its color and intensity. - This is just a duplication of the already existing point lights implementation with some changes. - Later it may be useful to add a way to visualize the light direction by displaying a mesh that is positioned at camera's view point like an arrow that displays how the sun lights the scene for example. |image16| .. raw:: html
.. raw:: html
This feature was developed by `Nedjima Belgacem `__ Feature: Texturing support for vector layer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Texturing support has been added for QGIS 3D with the following new functionalities: - Users can now select an image to be displayed on the surfaces of buildings as diffuse map from the symbol properties. - The user can also change the scale of textures from the symbol properties. Some visual issues may appear when using textures. These issues relate to the normals of surfaces that you may be able to fix by checking "add back faces" and playing around with the invert normals and culling mode in the symbol properties. |image17| This feature was developed by `Nedjima Belgacem `__ Feature: Enable embedded and remote 3D models for 3D point symbols ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Users can now utilise and embed remote 3D models for 3D point symbols. |image18| This feature was developed by `Mathieu Pellerin `__ Feature: Add option to show light source origins ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A feature which allows users to toggle a visible sphere at light source origins in a 3D scene. This allows for the easier repositioning and placement of light sources relative to the scene contents. Addresses `Issue #37726 `__. This feature was developed by `Nyall Dawson `__ Feature: Improvements for material handling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Further improvements for material handling were introduced, and a Gooch shading model was added. This improves the QgsAbstractMaterialSettings API, by: - Adding icon support for registered material types (for use in the material selector combo box). - Adds support for handling different rendering techniques to QgsAbstractMaterialSettings. Now material classes can indicate which rendering techniques they support (e.g. Triangles, Lines, InstancedPoints, etc.), and the material is only offered when it's compatible with the required technique. - The technique handling in the gooch material widget was improved to avoid showing settings that have no effect in a particular context (e.g. hiding all but the ambient color choice for simple 2D line symbols). - A new material, "Gooch", was added. This material gives a CAD style 3D render, where the shading is not dependent on appropriate lighting setup in a scene and where the 3D details are always visible, regardless of the lighting choice. |image19| This feature was developed by `Nyall Dawson `__ Print Layouts ------------- Feature: Expose control over text format and alignment for individual cells in manual text tables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adds control over setting the text format (e.g. bold/italic/buffer/shadow etc) and text alignment (horizontal and vertical) for the contents of individual cells in a manual text table. This feature was funded by City of Canning This feature was developed by `Nyall Dawson `__ Feature: Use QgsTextRenderer to render attribute table text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows for the full range of text formatting options in layout attribute tables, including buffers, shadows, word spacing etc. This feature was funded by City of Canning This feature was developed by `Nyall Dawson `__ Feature: Use QgsTextRenderer for drawing map grid text in layouts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows for grid annotations which use buffers, shadows, background shapes, etc. |image20| |image21| This feature was developed by `Nyall Dawson `__ Feature: Expose option to control PDF image compression method when exporting layouts to PDF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Options are for Lossy compression, which is the default JPEG compression used, and Lossless compression (which creates bigger files in most cases, but is much more suitable for professional printing outputs or for post-production in other products such as Illustrator etc) The bad news is that this option is only available in builds based on Qt 5.13 or later. This feature was developed by `Nyall Dawson `__ Feature: Add automatic clipping settings for atlas maps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This feature allows users to enable map clipping for layout map items so that the maps are clipped to the boundary of the current atlas area feature. Options exist for: - Enabling or disabling the clipping on a per-map basis - Specifying the clipping type: - “Clip During Render Only”: applies a painter based clip, so that portions of vector features which sit outside the atlas feature become invisible - “Clip Feature Before Render”: applies the clip before rendering features, so borders of features which fall partially outside the atlas feature will still be visible on the boundary of the atlas feature - “Render Intersecting Features Unchanged”: just renders all features which intersect the current atlas feature, but without clipping their geometry - Controlling whether labels should be forced placed inside the atlas feature, or whether they may be placed outside the feature - Restricting the clip to a subset of the layers in the project, so that only some are clipped |image22| |image23| This feature was funded by City of Canning This feature was developed by `Nyall Dawson `__ Feature: Add API to QgsMapSettings for specifying clipping regions to apply while rendering maps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is currently API only functionality, but functionality has been added which provide the backend capabilities to specify clipping regions which may be used during map render operations. Although primarily introduced in order to provide functionality which allows the automatic clipping of map elements to the current atlas feature geometry in print layouts, the API has been deliberately implemented in a manner that's very flexible to allow various use cases which require the clipping of regions during map render operations. For non-vector layers, the clipping is applied through a QPainter clipping path. For vector layers, the API exposes various options in how the clipping should be applied: #. As an "intersects" style test only: All vector features which intersect the path are rendered, without actually clipping the feature's geometry #. By modifying the feature's geometry and clipping the geometry to the region: Any stroke or outline settings for the symbol will be rendered along the boundary of the clipping region, even if the feature actually partially falls outside this region. or #. Using a painter clip path: Features are clipped to the region, but only at painter time. Boundaries of the feature which fall outside the clip region will not be visible. This feature was funded by City of Canning This feature was developed by `Nyall Dawson `__ Feature: Layout legend maximum marker size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adds the possibility to enter the maximum marker size (in mm) to the layout legend widget. In some cases, such as when point layers use a symbol size which is based on map units, the point markers on the layout legend can get quite big. This feature adds a setting to the layout legend widget which allows the restriction of the maximum marker symbol size while the automatic legend update is still active. This feature was developed by `mhugent `__ Feature: Allow cells in manual text tables to have expression based contents ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows individual cells from a manual text table to take their contents from a preset expression. Expressions have access to the full layout item expression context, allowing cells to calculate and display metadata style values or aggregate based calculations. This feature was funded by City of Canning This feature was developed by `Nyall Dawson `__ Feature: Clip layout maps to shape ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ New functionality was introduced which allows users to clip a map item to a shape or polygon item from their layout, allowing for non-rectangular maps within the layout. |image24| |image25| This feature was developed by `Nyall Dawson `__ Feature: Support for rotated ticks/annotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tick marks and annotations on a map frame in the print composer can now be rotated, allowing them to align with a rotated map frame as described in `issue 36904 `__. It works for both rotated maps and reprojected grids. The following options have been added: - Ticks: - Rotate ticks (if unchecked, ticks get drawn as before, not taking angle into account) - Rotated ticks alignment (whether ticks should have a constant length, or be aligned orthogonaly) - Skip low angled ticks (an angle threshold below which ticks aren't drawn, so you can skip ticks for grid lines that are, for example, too close to being parallel with the map edge) - Annotations: - Parallel to Tick (Next To/ Horizontal / Vertical Ascending / Vertical Descending) - Draw low angled (if checked, skipped ticks above will still get an annotation) |image26| This feature was funded by `Kanton Solothurn `__ This feature was developed by `Olivier Dalang, OPENGIS.ch `__ Feature: Add page offset expression for Y positions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A ``layout_pageoffsets`` expression was added for print layouts which returns an array of Y coordinates for the top of each page in the layout. this allows users to dynamically position items on pages in a context where page sizes may change. For example, to set an item at 2.5mm from the top of page 2 (for the data-defined position Y of a map item) : ``@layout_pageoffsets[1] + 2.5`` This constitutes a workaround for `Issue 37567 `__. This feature was funded by `BikePlan `__ This feature was developed by `Olivier Dalang, OPENGIS.ch `__ Expressions ----------- Feature: Add "main\_angle" function to return the estimated main angle of a geometry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Returns the angle of the oriented minimum bounding box which covers the geometry value. Useful for data defined overrides in the symbology of label expressions, e.g. to rotate labels to match the overall angle of a polygon, and similar for line pattern fill. |image27| |image28| This feature was funded by `Kanton Solothurn `__ This feature was developed by `Nyall Dawson `__ Feature: Port refFunctions to core ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Various overlay operations have been added to the expression engine. This covers the functionality of the refFunctions plugin. |image29| The following new expression functions are implemented : ``overlay_intersects(layer[,expression][,filter][,limit][,cache]) overlay_contains(layer[,expression][,filter][,limit][,cache]) overlay_crosses(layer[,expression][,filter][,limit][,cache]) overlay_equals(layer[,expression][,filter][,limit][,cache]) overlay_touches(layer[,expression][,filter][,limit][,cache]) overlay_disjoint(layer[,expression][,filter][,limit][,cache]) overlay_within(layer[,expression][,filter][,limit][,cache]) overlay_nearest(layer[,expression][,filter][,limit][,max_distance][,cache])`` in all instances, the spatial operator is evaluated against the other layer. If an expression is provided, it returns an array of results. If no expression is provided, it returns a boolean indicating whether or not there is a match for at least one feature. Features can optionally be filtered by an expression, and optionally be limited to a certain count. The ``overlay_nearest`` function has an additional max\_distance filter. |image30| This feature was developed by `Olivier Dalang, OPENGIS.ch `__ Digitising ---------- Feature: Add option to calculate bearing based on travel direction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For devices which report faulty bearing measurements, this option can be used to instead calculate the GPS bearing based on the previous two recorded locations. This feature was developed by `Nyall Dawson `__ Feature: Digitizing and splitting curved features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ New functionality was introduced that adds the possibility to switch between linear or circular strings when digitizing or splitting vector layer features. The user can use the keyboard shortcut **Ctrl+Shift+G** to switch between linear/circular. For splitting features, new overloading methods have been added to the API. When splitting, curves are preserved. For this, the curve is segmentized before splitting, and all the split features are "de-segmentized" after splitting. A toolbar button was added to enable switching between linear/circular: |image31| |image32| |image33| |image34| This feature was developed by `Vincent Cloarec `__ Data Management --------------- Feature: Rescale raster algorithm for Processing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adds a rescale raster algorithm to change raster value range, whilst preserving the shape of the raster's histogram. Useful for when rasters from different sources should be compared or processed together and their pixel values should be in the same range. By default, the algorithm preserves the NODATA value of the input raster but there is an option to override it. The following image displays a histogram of a DEM (value range is 85-243) |image35| And the next image displays a histogram of same DEM rescaled to the range 100-1000 |image36| Addresses `Issue 26099 `__. |image37| This feature was developed by `Alexander Bruy `__ Forms and Widgets ----------------- Feature: Show related features in identify results tree ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Users will now be able to see related (child) features in the results window when using the identify tool. Under each identified parent feature, new groups will show containing any related child features, displaying their attributes, actions, and allowing the user to directly open the feature form for the child feature. This feature addresses issue `18634 `__. |image38| This feature was developed by `Nyall Dawson `__ Feature: Filter expressions in relation reference widget ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option has been added for static filter expression to be used in the relation reference widget. |image39| This feature was developed by `Ivan Ivanov `__ Analysis Tools -------------- Feature: Add project load profile times to debugging tools dock ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Modification of the QgsRuntimeProfiler class which performs the following functions: 1. Make the profiling thread-safe, so that it's possible to record times across multiple threads 2. Allows different profiling "groups" The new groups API is used here to expose a breakdown of project load times in the debugging dock, alongside the existing QGIS startup profiling. It's possible now to get a breakdown of the various stages of project load, in order to identify the causes of slow project load times. TODO: In the majority of cases, performance problems will be caused by one or more layers, so it would be nice to further break down the individual layer load times. For example, for an individual WFS layer, we may see the time taken for the initial "server capabilities" or other queries. Add a group with profile times for map rendering, so you can see exactly which layers in your project are causing slow map redraw times. In its current form, only the overall load time of each individual layer is displayed. |image40| |image41| This feature was developed by `Nyall Dawson `__ Feature: New Cell statistics algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We added a **Cell statistics** raster analysis algorithm. It performs cell-wise statistics on a stack of raster layers while accounting for NoData. The functions available in the current implementation are: - Sum - Mean - Median - Standard Deviation - Variance - Maximum - Minimum - Majority (most frequent value) - Minority (least frequent value) - Range (max - min) - Variety (count of unique values) |image42| This feature was developed by `Clemens Raffler `__ Feature: New Equal to frequency algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We have added some new raster algorithms that operate on a local cell-by-cell basis in a raster stack. The Equal to frequency algorithm evaluates on a cell-by-cell basis the frequency (number of times) the values of an input stack of rasters are equal to the value of a value raster. |image43| This feature was developed by `Clemens Raffler `__ Feature: New Greater than frequency algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We have added some new raster algorithms that operate on a local cell-by-cell basis in a raster stack. The Greater than frequency algorithm evaluates on a cell-by-cell basis the frequency (number of times) the values of an input stack of rasters are greater than the value of a value raster. |image44| This feature was developed by `Clemens Raffler `__ Feature: New Less than frequency algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We have added some new raster algorithms that operate on a local cell-by-cell basis in a raster stack. The Equal to frequency algorithm evaluates on a cell-by-cell basis the frequency (number of times) the values of an input stack of rasters are less than the value of a value raster. |image45| This feature was developed by `Clemens Raffler `__ Feature: New Lowest position in raster stack algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We added some raster value position analysis tools with this new QGIS version: The *Lowest position in raster stack* algorithm evaluates on a cell-by-cell basis the position of the raster with the lowest value in a stack of rasters. Position counts start with 1 and range to the total number input rasters. The order of the input rasters is relevant for the algorithm. |image46| This feature was developed by `Clemens Raffler `__ Feature: New Highest position in raster stack algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We added some raster value position analysis tools with this new QGIS version: The *Highest position in raster stack* algorithm evaluates on a cell-by-cell basis the position of the raster with the highest value in a stack of rasters. Position counts start with 1 and range to the total number input rasters. The order of the input rasters is relevant for the algorithm. |image47| This feature was developed by `Clemens Raffler `__ Feature: New "Highest/Lowest position in raster stack" algorithms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Two new algorithms were added which add functionality ported from utilities commonly utilised with the ArcGIS Spatial Analyst extension: - **`Highest position in raster stack `__** - **`Lowest position in raster stack `__** The **highest/lowest position algorithm** evaluates the position of the raster with the highest/lowest value in a stack of rasters on a cell-by-cell basis. Position counts start with 1 and range to the total number input rasters. The order of the input rasters is relevant for the algorithm. This feature was developed by `Clemens Raffler `__ Processing ---------- Feature: Add modeler algorithm to create directories ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This algorithm allows models to create new file directories. Useful for models which have to output results to certain dynamically created paths (e.g. a folder containing the current date). This feature was developed by `Nyall Dawson `__ Feature: Add modeler algorithm to set a project expression variable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows a model to set Project-level expression variables during execution. Especially useful with the new `Export Print Layout algorithms `__ to allow models which dynamically set variables used in a layout prior to export. This functionality was ported from https://gis.stackexchange.com/questions/359386 This feature was developed by `Nyall Dawson `__ Feature: Add processing algorithms to export a print layout as PDF/image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Models are able to export print layouts from the current project. One use case for this is allowing users to create an in-project model which exports a particular set of layouts from the project to certain folders, so that they can easily re-export the current project in a single operation instead of having to manually open multiple layouts and export one-by-one. Additionally, with the new capabilities to have expression based output files inside models, you can automatically export the layouts to a folder with the current date tag and include this in the exported file names! This feature was developed by `Nyall Dawson `__ Feature: Add a save features to file algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There is now a native processing algorithm to save vector features to a file dataset within a model. It comes with a pair of advanced features to pass dataset and layer options on to GDAL. |image48| This feature was developed by `Mathieu Pellerin `__ Feature: Export layout atlas as PDF algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A new QGIS processing algorithm was added which allows the export of a map atlas to PDF. This is the PDF counterpart to the recent export atlas layout to image algorithm. This feature was developed by `Mathieu Pellerin `__ Feature: New "Flatten Relationship" algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This algorithm flattens all relationships for a vector layer, exporting a single layer containing one master feature per related feature. This master feature contains all the attributes for the related features. It's designed as a quick way to de-normalize a relation from a project, e.g. to allow exporting to CSV. This feature was funded by SMEC/SJ This feature was developed by `Nyall Dawson `__ Feature: Export atlas layout as image algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A new native processing algorithm was added to export layout atlases as images. This is useful in models where remote datasets are processed with the goal of being used as atlas coverage layers. |image49| This feature was developed by `Mathieu Pellerin `__ Feature: Load processing results to layer group ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Users can now optionally set a group name which ensures that the resulting output layers added to the project when using the *Open output file after running algorithm* option are grouped together. This allows all outputs from several processing algorithms to be grouped so that they may be easily located in the layer tree and be removed, exported, or have their visibility toggled easily. |image50| This feature was developed by `Germán Carrillo `__ Feature: Add zonal statistics algorithm which creates new output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Previously, when calculating zonal statistics, the algorithm always updated the original data source, adding additional fields. A new zonal statistics algorithm has been added which creates a new output instead. This functionality is an implementation of the `29504 feature request `__. This feature was developed by `Matthias Kuhn `__ Feature: Add geometry processing parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Added a new ``QgisProcessingParameterGeometry`` for passing geometries as a parameter to processing alogrithms. This provides a way to pass simple geometries to algorithms without requiring an input layer. The immediates use case are: - Algorithms that might need to manipulate geometries in an atomic way. - Delegation from parent algorithms. - Use with headless qgis processing in stand-alone processing tools. Features: - The parameter is compatible with string parameters as it may pass Well-Known-Text as the value. - The current widget interaction is minimalistic as it only uses the input text widget for entering the value as WKT. This feature was developed by `David Marteau `__ Feature: Add an interface to determine whether it is safe for the application to exit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An interface for plugins and scripts to register custom logic to prevent the QGIS application from exiting was added. This allows plugins to determine whether it is safe for the application to exit. This has made it possible to allow plugins to determine whether there are unsaved changes which should be saved or discarded before allowing QGIS to exit, functionality which has already been implemented in the console script editor, preventing data loss by prompting users when there are unsaved changes rather than silently shutting down the application. This feature was developed by `Nyall Dawson `__ Application and Project Options ------------------------------- Feature: List available GDAL vector drivers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A *Vector Drivers* tab is now available within the QGIS GDAL Settings window, which lists all the available GDAL vector drivers and allows users to toggle their active state. Where several drivers may be used to open data of a specific type, users may now modify these settings to ensure that the intended driver is used when importing specific vector data types. For example, the FileGDB and OpenFileGDB drivers are both capable of being used to import .gdb files, but if the data file has a version of 9.x, the FileGDB won't be able to open it. In this instance, a user may disable the FileGDB driver and ensure that the data is loaded using the OpenFileGDB driver instead. This functionality directly addresses the limitations outlined in `Issue 18738 `__. |image51| This feature was developed by `Alexander Bruy `__ Feature: Detect GRASS installation folder on MacOS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MacOS previously had a platform-specific custom parameter setting Grass7Utils.GRASS\_FOLDER. This caused crashes for many users with multiple QGIS installations or hat had some invalid folder settings. The parameter has been removed and a GISBASE environment variable has been introduced instead, which is commonly used in GRASS scripts as the "root" installation directory, emulating the behavior used for GRASS detection in Windows environments. If GISBASE is not present (default), a search is performed for grass folders in ``QgsApplication.prefixPath()`` (when packaged in bundle format). If not found, the standalone GRASS instance is searched for. The new behaviour for GRASS is in-line with te methodology used for the GDAL and SAGA processing tools. This resolves `Issue 38595 `__. |image52| This feature was developed by `Lutra Consulting (Peter Petrik) `__ Browser ------- Feature: Expose fields in the Browser ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First part of QEP https://github.com/qgis/QGIS-Enhancement-Proposals/issues/171 Exposes field columns in the browser for providers that implement connections API: - PG - GPKG - Spatialite - MSSQL The following operations are supported on fields: - add new field - delete field |image53| |image54| This feature was developed by `Alessandro Pasotti `__ Data Providers -------------- Feature: ArcGIS Vector Tile Service connections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to create connections for ArcGIS Vector Tile Services was added to allow users to easily load vector tile layers from ArcGIS Server vector tile services. It also added support for authentication, configuration, and custom referer string to vector tile connections. This change adds explicit UI options for adding and configuring connections to ESRI vector tile services. While these services use the standard vector tile framework for data retrieval, they can be directly added by creating a connection using the VectorTileService API endpoint on the ArcGIS server. After a user adds a layer from a VectorTileService, the server's default styling and labeling for the layer is automatically loaded. |image55| This feature was developed by `Nyall Dawson `__ Feature: Trust layer metadata propagation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The trust flag at the project level is only used to read the vector layer extent from xml, not from the provider. This flag was not available at the vector layer and data provider level. A new QgsMapLayer reading flag to propagate the trust layer metadata for the project's read flag and a new provider flag to trust the datasource config. Trusting the datasource config allows the provider to use estimated metadata, ensures the primary key is unique and that the detectable geometry type and SRID are the same as the requested. This feature was developed by `rldhont `__ Feature: Add support for virtual columns in Oracle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Support for virtual (generated) Oracle columns has been added and is defined this way: ``sql CREATE TABLE QGIS.GENERATED_COLUMNS ( "pk" INTEGER PRIMARY KEY, "generated_field" GENERATED ALWAYS AS ('test:' || "pk") VIRTUAL);`` **Note:** It's not possible to define a generated column on an SDO\_GEOMETRY field in Oracle. For now, when creating a new feature, the generated field is editable and should not be. A new API method needs to be added to retrieve readonly field from the provider as discussed in `Issue 35995 `__. This feature was developed by `Julien Cabieces `__ Feature: Add advanced options for data imports ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ New functionality has been introduced which allows advanced parameters to be specified when importing layers using the OGR data provider, opening a vast range of new possibilities, especially when working around expected dataset issues. |image| |image57| This feature was developed by `Even Rouault `__ QGIS Server ----------- Feature: QGIS Server WFS3 API Sorting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adds sorting functionality to the QGIS Server WFS3 API This feature was developed by `Alessandro Pasotti `__ Feature: QGIS Server landing page plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A Landing Page Plugin for QGIS Server was created, which is a C++ port of https://github.com/elpaso/qgis-server-landing-page-plugin |image58| This feature was developed by `Alessandro Pasotti `__ Feature: Environment variable to disable GetPrint and to not load layouts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A new ``QGIS_SERVER_DISABLE_GETPRINT`` environment variable was added to QGIS Server which prevents the loading of layouts when projects are read and disables the WMS GetPrint request, improving the read time of projects. This feature was funded by `Ifremer `__ This feature was developed by `3Liz `__ Feature: Environment variable to trust layer metadata with server settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Trust layer metadata can be defined at the project level. A new project reading flag was added which allows the forcing of trust layer metadata. For QGIS server, the trust layer metadata option can be overridden with ``QGIS_SERVER_TRUST_LAYER_METADATA`` environment variable. This feature was funded by `Ifremer `__ This feature was developed by `3Liz `__ .. |image0| image:: images/projects/4ba1280c5037bc85ccedcbd39dab18eb725729c5.png .. |image1| image:: images/projects/dbc0cef663f2f652e0961ac2ed168eb45ed2e182.png :class: img-responsive img-rounded center-block .. |image2| image:: images/entries/acb9e856ac744d0e40d8de33c025deb075385856.gif :class: img-responsive img-rounded .. |image3| image:: images/entries/87635346-39f11c00-c782-11ea-88bc-369866d7f57a.png .. |image4| image:: images/entries/87635368-44131a80-c782-11ea-95d9-07fb7d00ffcf.png .. |image5| image:: images/entries/e1a4d82c248cdd0f04f236443897178c12574885.gif :class: img-responsive img-rounded .. |image6| image:: images/entries/7e4ee802abba7dfd7ec61cdd8b3db333b7a30fae.gif :class: img-responsive img-rounded .. |image7| image:: images/entries/a6c67225ee3b55a021a395ffbf58bd05352ef6fb.gif :class: img-responsive img-rounded .. |image8| image:: images/entries/09739c5bed021a99baec41c98b87f5335a4bf8ec.png :class: img-responsive img-rounded .. |image9| image:: images/entries/85622744-4d9edc00-b635-11ea-91db-a02fa28e6bea.gif .. |image10| image:: images/entries/b27519025102be3b07fc8241f0ff8f8f2f9b31c6.png :class: img-responsive img-rounded .. |image11| image:: images/entries/c4974747f5bc0dcba02f30a97e68bb5edacc5f48.png :class: img-responsive img-rounded .. |image12| image:: images/entries/86540129-a8a3bf00-bed0-11ea-94b8-bf29b5818cb8.gif .. |image13| image:: images/entries/803983acbaec38e8df0fb4fd12d28beef7399520.png :class: img-responsive img-rounded .. |image14| image:: images/entries/fc8a9633b87b29bba052dacd166c0735b4449c90.png :class: img-responsive img-rounded .. |image15| image:: images/entries/bf6076062db63bc4c789bc18d3b029c14b2ddc8e.gif :class: img-responsive img-rounded .. |image16| image:: images/entries/4dcd7d7f4bcfb71d765656bfe734ec32ddcaca9c.png :class: img-responsive img-rounded .. |image17| image:: images/entries/1c4fc6ffc1b7a28aeff9c625fb6238998dd30b67.png :class: img-responsive img-rounded .. |image18| image:: images/entries/d4deaabbeddcf5f4784f602f19dabfac22b2d100.png :class: img-responsive img-rounded .. |image19| image:: images/entries/b6df518d57147bfdfd207d4499363c9d4653721b.png :class: img-responsive img-rounded .. |image20| image:: images/entries/86863750-26550e00-c10f-11ea-8dd4-1b740017949e.gif .. |image21| image:: images/entries/349efbc988ccbf3499e18ec4453b637abf893c38.png :class: img-responsive img-rounded .. |image22| image:: images/entries/86433831-191ad680-bd3f-11ea-9289-cc6d2b3e2e11.gif .. |image23| image:: images/entries/1f1343d09c75b0e1d131c25a79b905d7aaadbc35.png :class: img-responsive img-rounded .. |image24| image:: images/entries/88761088-c1428480-d1b1-11ea-90c0-a391d00b084d.gif .. |image25| image:: images/entries/7179282b09e8d196251f543a9c5f059f89c701e2.png :class: img-responsive img-rounded .. |image26| image:: images/entries/0da542215cefcd2e3ca120dd0381b47611734dce.gif :class: img-responsive img-rounded .. |image27| image:: images/entries/87367553-aae7d680-c5be-11ea-923a-e81200f2b90c.gif .. |image28| image:: images/entries/03463ac0a8303444d94806fb2ff66d6a73c56ccb.png :class: img-responsive img-rounded .. |image29| image:: images/entries/90797864-7bd92900-e311-11ea-945f-0c2ade14e801.gif .. |image30| image:: images/entries/d4bb059729eecfc689e001f731d59fff25225615.png :class: img-responsive img-rounded .. |image31| image:: images/entries/88101713-6505b200-cb6c-11ea-9feb-68a4130d6f52.gif .. |image32| image:: images/entries/86938423-6a93de80-c10e-11ea-8511-489d8b4f006f.gif .. |image33| image:: images/entries/86938444-7089bf80-c10e-11ea-8fd0-0f419f71b52e.gif .. |image34| image:: images/entries/8145ccfa4e659f7d8315830cecfe2b2f391b9aa4.png :class: img-responsive img-rounded .. |image35| image:: images/entries/86897604-53ee8700-c110-11ea-99ae-540d38f88154.png .. |image36| image:: images/entries/86897671-67015700-c110-11ea-8183-e0d6bd013dbb.png .. |image37| image:: images/entries/1331cd2ae8bd39801aa3d5605a13dbcbd1436226.png :class: img-responsive img-rounded .. |image38| image:: images/entries/863b80851b995421b6f2ea455faf6b1c41211cd5.gif :class: img-responsive img-rounded .. |image39| image:: images/entries/8048bb8df64e31bb733eea239c527f8be631ce6f.gif :class: img-responsive img-rounded .. |image40| image:: images/entries/85852208-7bca1a80-b7f3-11ea-8882-b3253622b1b6.png .. |image41| image:: images/entries/943a79db68aee3458cb88cacd7a69b66fda3caea.png :class: img-responsive img-rounded .. |image42| image:: images/entries/fca13f48b118ed13ebe84191a226ca0e20c37bfa.png :class: img-responsive img-rounded .. |image43| image:: images/entries/e368e10cfa5e19992176930121e0cb846c3d1ca8.png :class: img-responsive img-rounded .. |image44| image:: images/entries/97228db861367c2875dab0533ab616bb2ac2432c.png :class: img-responsive img-rounded .. |image45| image:: images/entries/114853cd3d7c245b56edea0024704c853997275c.png :class: img-responsive img-rounded .. |image46| image:: images/entries/f3383f5583c9096b1b8d1873679e1a495fac0485.png :class: img-responsive img-rounded .. |image47| image:: images/entries/a730b8c1566c99bdebff09c783ae320b0c138d76.png :class: img-responsive img-rounded .. |image48| image:: images/entries/b238631365830b019300700cf59c3a8dd3d05a4f.png :class: img-responsive img-rounded .. |image49| image:: images/entries/e4f315e60743577c9f45ad44643fd5ba9778c040.png :class: img-responsive img-rounded .. |image50| image:: images/entries/414c68839518d5b658d6e6f1565f6c27e1f4336f.gif :class: img-responsive img-rounded .. |image51| image:: images/entries/5cc48d8ea8bc276446f8eae4a1c838e0d1f91a40.png :class: img-responsive img-rounded .. |image52| image:: images/entries/e59bb83513293830df8ec4dcf825247b14dacc98.png :class: img-responsive img-rounded .. |image53| image:: images/entries/87223743-a4b7e700-c37f-11ea-88a3-4b371bfadf89.gif .. |image54| image:: images/entries/d4e761ad977a712aa1fc1fbc65d61c886e6e79fb.png :class: img-responsive img-rounded .. |image55| image:: images/entries/e31c882fa9552ed6bd247f0092305ae8c153948a.gif :class: img-responsive img-rounded .. |image| image:: https://changelog.qgis.orgimages/entries/e1c7474d19828b39f5872b289a1e8ba994556a10.png .. |image57| image:: images/entries/4a2d99c6ef6ec12e5f63a29ad00d9ebc3cd534e2.png :class: img-responsive img-rounded .. |image58| image:: images/entries/a2254bbef892835317a9f608afd8bd3722ee4b38.gif :class: img-responsive img-rounded