Ondersteuning van projecties¶
Als u buiten de console van PyQGIS bent, hebben de codesnippers op deze pagina de volgende import nodig:
from qgis.core import (QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsProject,
QgsPointXY,
)
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
# PostGIS SRID 4326 is allocated for WGS84 crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId) assert crs.isValid()
QGIS gebruikt drie verschillende ID’s voor elk referentiesysteem:
InternalCrsId
— ID gebruikt in de interne database van QGIS.PostgisCrsId
— ID gebruikt in databases van PostGIS.EpsgCrsId
— ID toegewezen door de organisatie EPSG.
Indien niet anders gespecificeerd met de tweede parameter, wordt standaard PostGIS SRID gebruikt.
specificeren van CRS door zijn well-known text (WKT)
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()
maak een ongeldig CRS en gebruik dan een van de functies functies
create*
om die te initialiseren. In het volgende voorbeeld gebruiken we een string van Proj4 om de projectie te initialiseren.crs = QgsCoordinateReferenceSystem() crs.createFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") assert crs.isValid()
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:
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())
Uitvoer:
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
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.
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)
Uitvoer:
Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 5)>