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:
EPSG:<code>
— ID toegewezen door de organisatie EPSG - afgehandeld metcreateFromOgcWms()
POSTGIS:<srid>
— ID gebruikt in databases van PostGIS - afgehandeld metcreateFromSrid()
INTERNAL:<srsid>
— ID gebruikt in de interne database van QGIS - afgehandeld metcreateFromSrsId()
PROJ:<proj>
- afgehandeld metcreateFromProj()
WKT:<wkt>
- afgehandeld metcreateFromWkt()
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 4.99999999999999911)>