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

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

8. Ondersteuning van projecties

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)

    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
    
  • 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:

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

Uitvoer:

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

 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)

Uitvoer:

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