Les extraits de code sur cette page nécessitent les importations suivantes si vous êtes en dehors de la console pyqgis :

1
2
3
4
5
6
from qgis.core import (
    QgsCoordinateReferenceSystem,
    QgsCoordinateTransform,
    QgsProject,
    QgsPointXY,
)

8. Support de projections

8.1. Système de coordonnées de référence

Les systèmes de référence de coordonnées (CRS) sont encapsulés par la classe QgsCoordinateReferenceSystem class. Les instances de cette classe peuvent être créées de plusieurs manières différentes :

  • spécifier le SCR par son ID

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    QGIS prend en charge différents identificateurs CRS dans les formats suivants :

Si aucun préfixe n’est spécifié, la définition de WKT est supposée.

  • spécifier le SCR par son Well-Known-Text (WKT)

    1
    2
    3
    4
    5
    wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
          'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
          'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    crs = QgsCoordinateReferenceSystem(wkt)
    print(crs.isValid())
    
    True
    
  • créer un CRS invalide et utiliser ensuite l’une des fonctions « créer* » pour l’initialiser. Dans l’exemple suivant, nous utilisons une chaîne Proj pour initialiser la projection.

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

Il est sage de vérifier si la création (c’est-à-dire la consultation dans la base de données) du SCR a réussi : isValid() doit retourner True.

Notez que pour l’initialisation des systèmes de référence spatiale, QGIS doit rechercher les valeurs appropriées dans sa base de données interne : file:srs.db. Ainsi, dans le cas où vous créez une application indépendante, vous devez définir les chemins correctement avec QgsApplication.setPrefixPath(), sinon la base de données ne sera pas trouvée. Si vous exécutez les commandes depuis la console Python de QGIS ou si vous développez un plugin, vous ne vous en souciez pas : tout est déjà configuré pour vous.

Accès aux informations du système de référence spatiale :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
crs = QgsCoordinateReferenceSystem("EPSG:4326")

print("QGIS CRS ID:", crs.srsid())
print("PostGIS SRID:", crs.postgisSrid())
print("Description:", crs.description())
print("Projection Acronym:", crs.projectionAcronym())
print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
print("Proj String:", crs.toProj())
# check whether it's geographic or projected coordinate system
print("Is geographic:", crs.isGeographic())
# check type of map units in this CRS (values defined in QGis::units enum)
print("Map units:", crs.mapUnits())

Rendu:

1
2
3
4
5
6
7
8
QGIS CRS ID: 3452
PostGIS SRID: 4326
Description: WGS 84
Projection Acronym: longlat
Ellipsoid Acronym: EPSG:7030
Proj String: +proj=longlat +datum=WGS84 +no_defs
Is geographic: True
Map units: 6

8.2. Transformation de SCR

Vous pouvez effectuer une transformation entre différents systèmes de références spatiaux en utilisant la classe QgsCoordinateTransform. La façon la plus simple de l’utiliser est de créer un CRS source et un CRS destination et de construire une instance de QgsCoordinateTransform avec ceux-ci et le projet en cours. Ensuite, il suffit d’appeler plusieurs fois la fonction transform() pour effectuer la transformation. Par défaut, elle effectue une transformation directe, mais elle peut également effectuer une transformation inverse.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
transformContext = QgsProject.instance().transformContext()
xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)

# forward transformation: src -> dest
pt1 = xform.transform(QgsPointXY(18,5))
print("Transformed point:", pt1)

# inverse transformation: dest -> src
pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
print("Transformed back:", pt2)

Rendu:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 5)>