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:

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