8. Support de projections

Indication

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

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

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)

    1wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
    2      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
    3      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    4crs = QgsCoordinateReferenceSystem(wkt)
    5print(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 :

 1crs = QgsCoordinateReferenceSystem("EPSG:4326")
 2
 3print("QGIS CRS ID:", crs.srsid())
 4print("PostGIS SRID:", crs.postgisSrid())
 5print("Description:", crs.description())
 6print("Projection Acronym:", crs.projectionAcronym())
 7print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
 8print("Proj String:", crs.toProj())
 9# check whether it's geographic or projected coordinate system
10print("Is geographic:", crs.isGeographic())
11# check type of map units in this CRS (values defined in QGis::units enum)
12print("Map units:", crs.mapUnits())

Rendu:

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

 1crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
 2crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
 3transformContext = QgsProject.instance().transformContext()
 4xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)
 5
 6# forward transformation: src -> dest
 7pt1 = xform.transform(QgsPointXY(18,5))
 8print("Transformed point:", pt1)
 9
10# inverse transformation: dest -> src
11pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
12print("Transformed back:", pt2)

Rendu:

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