8. Soporte de Proyecciones

Consejo

Los fragmentos de código en esta página necesitan las siguientes adiciones si está fuera de la consola de pyqgis:

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

8.1. Sistemas de coordenadas de referencia

Sistemas de Coordenadas de Referencia (SRC) son encapsulados por la clase QgsCoordinateReferenceSystem. Las instancias de esta clase se pueden crear de varias formas diferentes:

  • especificar SRC por su ID

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    QGIS admite diferentes identificadores de SRC con los siguientes formatos:

Si no se especifica ningún prefijo, se asume la definición de WKT.

  • especificar SRC por su 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
    
  • cree un SRC no válido y luego use una de las funciones crear* para inicializarlo. En el siguiente ejemplo usamos una cadena Proj para inicializar la proyección.

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

Es aconsejable comprobar si la creación (es decir, la búsqueda en la base de datos) del SRC se ha realizado correctamente: isValid() debe devolver True.

Tenga en cuenta que para la inicialización de sistemas de referencia espacial, QGIS necesita buscar los valores apropiados en su base de datos interna srs.db. Por lo tanto, en caso de que cree una aplicación independiente, debe configurar las rutas correctamente con QgsApplication.setPrefixPath(), de lo contrario, no podrá encontrar la base de datos. Si está ejecutando los comandos desde la consola de QGIS Python o desarrollando un complemento, no le importa: todo ya está configurado para usted.

Acceso a la información del sistema de referencia espacial:

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

Salida:

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. Transformación SRC

Puede realizar la transformación entre diferentes sistemas de referencia espacial utilizando la clase QgsCoordinateTransform. La forma más fácil de usarlo es crear un SRC de origen y destino y construir una instancia QgsCoordinateTransform con ellos y el proyecto actual. Luego simplemente llame repetidamente transform() function para hacer la transformación. De forma predeterminada, realiza una transformación hacia adelante, pero también es capaz de realizar una transformación 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)

Salida:

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