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

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

8. Soporte de Proyecciones

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")
    assert crs.isValid()
    

    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)

    1
    2
    3
    4
    5
    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()
    
  • 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")
    assert crs.isValid()
    

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 Verdadero.

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
crs = QgsCoordinateReferenceSystem("EPSG: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("Proj String:", crs.toProj())
# 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())

Salida:

1
2
3
4
5
6
7
8
QGIS CRS ID: 3452
PostGIS SRID: 4326
Description: WGS 84
Projection Acronym: longlat
Ellipsoid Acronym: WGS84
Proj String: +proj=longlat +datum=WGS84 +no_defs
Is geographic: True
Map 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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
transformContext = QgsProject.instance().transformContext()
xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)

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

Salida:

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