8. Supporto alle proiezioni
Suggerimento
I frammenti di codice di questa pagina necessitano delle seguenti importazioni se sei è al di fuori della console pyqgis:
1from qgis.core import (
2 QgsCoordinateReferenceSystem,
3 QgsCoordinateTransform,
4 QgsProject,
5 QgsPointXY,
6)
8.1. Sistemi di riferimento delle coordinate
I sistemi di riferimento delle coordinate (SR) sono incapsulati dalla classe QgsCoordinateReferenceSystem
. Le istanze di questa classe possono essere create in diversi modi:
Specificare SR con il suo ID
# EPSG 4326 is allocated for WGS84 crs = QgsCoordinateReferenceSystem("EPSG:4326") print(crs.isValid())
True
QGIS supporta diversi identificatori SR con i seguenti formati:
EPSG:<code>
— ID assegnato dall’organizzazione EPSG - gestito concreateFromOgcWms()
POSTGIS:<srid>
— ID utilizzato nei database PostGIS - gestito concreateFromSrid()
INTERNAL:<srsid>
— ID utilizzato nel database interno di QGIS - gestito concreateFromSrsId()
PROJ:<proj>
- gestito concreateFromProj()
WKT:<wkt>
- gestito concreateFromWkt()
Se non viene specificato alcun prefisso, viene assunta la definizione WKT.
specifica il SR con il suo 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
crea un SR non valido e poi utilizzare una delle funzioni
create*
per inizializzarlo. Nell’esempio seguente si utilizza una stringa Proj per inizializzare la proiezione.crs = QgsCoordinateReferenceSystem() crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") print(crs.isValid())
True
È opportuno verificare se la creazione (cioè la ricerca nel database) del SR è avvenuta con successo: isValid()
deve restituire True
.
Si noti che per l’inizializzazione dei sistemi di riferimento spaziali QGIS deve cercare i valori appropriati nel suo database interno srs.db
. Pertanto, se creai un’applicazione indipendente, devi impostare correttamente i percorsi con QgsApplication.setPrefixPath()
, altrimenti non riuscirà a trovare il database. Se esegui i comandi dalla console QGIS Python o sviluppi un plugin, non è importante: tutto è già stato impostato.
Accesso alle informazioni del sistema di riferimento spaziale:
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())
In uscita:
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. Trasformazione SR
Puoi effettuare trasformazioni tra sistemi di riferimento spaziali diversi utilizzando la classe QgsCoordinateTransform
. Il modo più semplice per usarla è creare un SR di origine e uno di destinazione e costruire un’istanza QgsCoordinateTransform
con essi e il progetto corrente. Quindi basta chiamare ripetutamente la funzione transform()
per eseguire la trasformazione. Per impostazione predefinita esegue la trasformazione in avanti, ma è in grado di eseguire anche la trasformazione inversa.
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)
In uscita:
Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>