.. only:: html .. _crs: ******************* Projections Support ******************* .. contents:: :local: If you're outside the pyqgis console, the code snippets on this page need the following imports: .. testcode:: from qgis.core import (QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsPointXY, ) .. index:: Coordinate reference systems Coordinate reference systems ============================ Coordinate reference systems (CRS) are encapsulated by the :class:`QgsCoordinateReferenceSystem ` class. Instances of this class can be created in several different ways: * specify CRS by its ID .. testcode:: # PostGIS SRID 4326 is allocated for WGS84 crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId) assert crs.isValid() QGIS uses three different IDs for every reference system: * :attr:`InternalCrsId ` --- ID used in the internal QGIS database. * :attr:`PostgisCrsId ` --- ID used in PostGIS databases. * :attr:`EpsgCrsId ` --- ID assigned by the EPSG organization. If not specified otherwise with the second parameter, PostGIS SRID is used by default. * specify CRS by its well-known text (WKT) .. testcode:: 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) assert crs.isValid() * create an invalid CRS and then use one of the ``create*`` functions to initialize it. In the following example we use a Proj4 string to initialize the projection. .. testcode:: crs = QgsCoordinateReferenceSystem() crs.createFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") assert crs.isValid() It's wise to check whether creation (i.e. lookup in the database) of the CRS has been successful: :meth:`isValid() ` must return ``True``. Note that for initialization of spatial reference systems QGIS needs to look up appropriate values in its internal database :file:`srs.db`. Thus in case you create an independent application you need to set paths correctly with :meth:`QgsApplication.setPrefixPath() `, otherwise it will fail to find the database. If you are running the commands from the QGIS Python console or developing a plugin you do not care: everything is already set up for you. Accessing spatial reference system information: .. testcode:: crs = QgsCoordinateReferenceSystem(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("Proj4 String:", crs.toProj4()) # 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()) Output: .. testoutput:: QGIS CRS ID: 3452 PostGIS SRID: 4326 Description: WGS 84 Projection Acronym: longlat Ellipsoid Acronym: WGS84 Proj4 String: +proj=longlat +datum=WGS84 +no_defs Is geographic: True Map units: 6 .. index:: Projections CRS Transformation ================== You can do transformation between different spatial reference systems by using the :class:`QgsCoordinateTransform ` class. The easiest way to use it is to create a source and destination CRS and construct a :class:`QgsCoordinateTransform ` instance with them and the current project. Then just repeatedly call :meth:`transform() ` function to do the transformation. By default it does forward transformation, but it is capable to do also inverse transformation. .. testcode:: crsSrc = QgsCoordinateReferenceSystem(4326) # WGS 84 crsDest = QgsCoordinateReferenceSystem(32633) # WGS 84 / UTM zone 33N xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance()) # 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) Output: .. testoutput:: Transformed point: Transformed back: