8. Ondersteuning van projecties

Hint

De codesnippers op deze pagina hebben de volgende import nodig als u buiten de console van PyQGIS bent:

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

8.1. Coördinaten ReferentieSystemen

Coördinaten referentiesystemen (CRS) zijn ingekapseld in de klasse QgsCoordinateReferenceSystem. Instances van deze klasse kunnen op verschillende manieren worden gemaakt:

  • specificeren van CRS met zijn ID

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

    QGIS ondersteunt verschillende identificaties voor CRS met de volgende indelingen:

Indien geen voorvoegsel is gespecificeerd, wordt definitie WKT aangenomen.

  • specificeren van CRS door zijn 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
    
  • maak een ongeldig CRS en gebruik dan een van de functies create* om die te initialiseren. In het volgende voorbeeld gebruiken we een tekenreeks van Proj om de projectie te initialiseren.

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

Het is verstandig om te controleren of het maken (d.i. opzoeken in de database) van het CRS succesvol was: isValid() moet True teruggeven.

Onthoud dat, voor het initialiseren van ruimtelijke referentiesystemen, QGIS de instellingen moet opzoeken in zijn interne database srs.db. Dus dienen bij het maken van een eigen applicatie de paden te worden ingesteld met QgsApplication.setPrefixPath() anders zal het vinden van de database mislukken. Als opdrachten worden uitgevoerd vanuit de console van Python in QGIS of vanuit een plug-in hoeft u niets te doen: alles is al goed ingesteld voor u.

Toegang tot informatie ruimtelijk referentiesysteem:

 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())

Uitvoer:

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. CRS transformatie

Het is mogelijk transformaties tussen verschillende ruimtelijke referentiesystemen uit te voeren door gebruik te maken van de klasse QgsCoordinateTransform. De eenvoudigste manier om deze functie te gebruiken is een bron en doel CRS te definieren en een instantie van QgsCoordinateTransform te construeren (construct) met deze erin en het huidige project. Dan kan de funtie transform() herhaaldelijk worden aangeroepen voor het uitvoeren van de transformatie. Standaard wordt van bron naar doel getransformeerd, maar de transformatie kan ook worden omgedraaid.

 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)

Uitvoer:

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