Maintainer: GeoForge Studio | QGIS 3.22–4.x (declared range; tested by the maintainer in QGIS 3 and QGIS 4)
The CRS toolbar has two compact, boxed, icon-only buttons ordered left to right. Their full labels remain available in tooltips and the Plugins menu:
- Display CRS (layers and eye): show or hide CRS information in the Layers panel. The icon and button border change between inactive and active states.
- Reproject (geographic grid, planar grid and arrow): open the batch reprojection dialog.
All plugin interface text, tooltips, messages and documentation are in English. Layer names and attribute values retain their original language. When upgrading from a pre-GeoForge build, disable the old version before installing and restart QGIS. Display preferences and the last output folder reset once under the new settings namespace. Older CRS widget entries are replaced; unrelated embedded widgets are retained.
- Build the installation archive with
python tools/build_zip.py --release(see below), then installlayer_crs_display_0.7.1.zipthrough Plugins → Manage and Install Plugins → Install from ZIP. Restart QGIS. - Click Reproject. The target CRS initially follows the project CRS and can be changed.
- Choose one output folder, a GeoPackage filename (default
reprojected.gpkg) and a layer name suffix, such as_UTM39.RoadsbecomesRoads_UTM39. No numbering or prefix is automatically added. - Eligible layers with a different CRS are initially selected. Use Use panel selection to use the Layers panel selection, or change checkboxes individually.
- Review the output names and click Reproject. Progress and the result for each layer are displayed.
Set the destination groups the target CRS, output folder, shared GeoPackage filename and layer suffix, with a live output naming example. Choose the layers provides a searchable table, selection controls, output previews and per-layer status.
Search filters the visible list without changing selection. The summary explicitly counts selected layers hidden by search. Selection buttons apply to all layers, including hidden search results.
Advanced options expands to show raster resampling, adding outputs, hiding originals and changing the project CRS. Defaults are unchanged. Progress and the Reproject, Stop and Close buttons stay visible in a fixed footer while the form scrolls. Readiness guidance explains what must be completed before starting.
- All successfully converted vector layers are saved as separate named tables in one GeoPackage (
reprojected.gpkgby default). Each converted raster is saved to a GeoTIFF. Layers already in the target CRS produce no copy and are excluded from the package. - Coordinates are reprojected, rather than merely assigning a different CRS label.
- Source data, coordinates and layer names are retained. Adding outputs, hiding source layers and changing the project CRS are separate options.
- Existing files are not overwritten. If selected layers have duplicate output names, run one separately with another suffix. The displayed name is exactly the original name plus suffix; invalid filesystem characters are replaced with
_in the physical raster filename or GeoPackage table name. Reserved GeoPackage table prefixes are escaped with_. The shared GeoPackage filename can be changed independently of the layer suffix. - All features matching the current layer filter are exported. Selecting individual features does not restrict the export. The source filter is recorded in the report. GeoPackage internal feature IDs may be regenerated; use an attribute field for stable business identifiers.
- Attribute field names and values are transferred by the reprojection algorithm. A reported transformation error or a feature-count mismatch prevents publication of that layer's output. Styles are copied where possible; project forms, relationships and other dependencies are not fully migrated.
Nearest neighbour is the default for categorical values. Choose bilinear or cubic for continuous data such as elevation. The chosen method applies to all rasters in that batch; use separate batches when different methods are needed.
GDAL calculates output cell size and extent. Input data type and source NoData are inherited through the algorithm. Matching CRS does not guarantee matching resolution, extent or grid alignment. TIFF outputs are tiled and uncompressed, with BigTIFF enabled when needed; output files can be large.
Layers run sequentially as background tasks; validated vector outputs are then combined by native:package in another background task. Temporary vector data is removed after completion. Processing is sequential to limit simultaneous memory and disk use. Raster Warp enables overlapping I/O and processing and uses up to four computation threads. Actual speed depends on data volume, drivers, storage and transformation; no benchmark or time guarantee is claimed.
- Unknown source CRS: assign the actual source CRS first. The plugin does not guess it.
- Edit mode: save changes and leave edit mode before reprojection.
- Layers already in the target CRS are listed but not exported again. The check uses QGIS equality and GDAL full-CRS equivalence for aliases, retaining coordinate epoch distinctions. Same zone alone does not imply the same CRS.
- Non-spatial tables, WMS/XYZ services, meshes and point clouds are not supported. Rasters must use the GDAL provider. Readable GeoPackage/FileGDB raster sublayers depend on the GDAL version bundled with QGIS.
- Processing must be enabled; raster conversion also requires its GDAL provider. No additional pip dependencies are required.
- Transformations needing datum grids require the appropriate grids and coordinate operation in QGIS. The plugin does not download them or verify that the assigned source CRS is correct.
Stop cancels the current operation and remaining queue. Already saved rasters are retained. Converted vectors are staged and saved together only when packaging succeeds; stopping before that point discards the unsaved vector outputs. A failed or cancelled package is never exposed under the final filename. The dialog cannot close until cancellation completes. Failure of one layer does not stop subsequent layers. A JSON report in the output folder records source and target CRS, names, filters, statuses and errors.
This repository contains the unpacked plugin source, tests and a reproducible ZIP builder.
The installable ZIP has one top-level directory: layer_crs_display/.
Run from the repository root:
python -m unittest discover -s tests -p 'test_*.py' -v
python -m compileall -q layer_crs_display tests tools
# Optional UI/batch lifecycle tests; PyQt6 or PyQt5 is test-only:
QT_QPA_PLATFORM=offscreen python tests/qt_batch_acceptance.py
# Build a local testing ZIP (does not require a public contact email):
python tools/build_zip.pyThe portable suite checks output names and collisions. The Qt suite uses real widgets and files but simulated QGIS objects, providers and tasks. It checks three dialog sizes, selection/search, success/failure, CRS/count validation, cancellation, shared-package failures, same-CRS exclusion and preservation of existing outputs. These tests do not prove that QGIS/GDAL performs reprojection correctly.
Development tests stay in the source repository and are excluded from the installation ZIP. Download the repository for the installed version, then run tests/native_acceptance.py independently inside the Python Console of actual QGIS 3 and QGIS 4 installations with this plugin installed and Processing/GDAL enabled. It generates
small temporary vector/raster fixtures and checks transformed coordinates,
attributes, categorical values, NoData and source preservation. See
testing instructions. The maintainer confirmed that the 0.7.0
candidate works in both QGIS 3 and QGIS 4. Exact QGIS, Qt, GDAL, OS and full
acceptance-suite results should still be recorded rather than inferred for every
version and platform.
Version 0.5.4 is available through the official QGIS Plugins Repository as an
experimental release. Version 0.7.1 is the stable dual-QGIS submission package.
Source code and support are hosted at
geoforge-studio/layer-crs-display.
The public contact email is reynolds.mach88@gmail.com. Maintainer testing has
passed in QGIS 3 and QGIS 4; see the publication checklist.
Build the installation archive from this source:
python tools/build_zip.py --releaseThis command validates required metadata and builds the archive. It does not contact GitHub or QGIS and cannot prove that the links are live or the plugin works.
This project is distributed under GNU GPL version 2 or any later version
(GPL-2.0-or-later); see LICENSE. No third-party binary files are bundled.
Use the repository's Issues tab to report problems. Include QGIS/OS/Python versions, layer/provider type, source and target CRS, the error message and a minimal non-sensitive example. Do not post private datasets. JSON batch reports contain layer names, file paths and subset filters; redact sensitive content before sharing a report.
The About dialog presents these destinations as labelled buttons. The social buttons include small monochrome platform symbols.