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:
EPSG:<code>
— ID asignada por la organización EPSG - manejada concreateFromOgcWms()
POSTGIS:<srid>
— ID usada en bases de datos PostGIS - manejada concreateFromSrid()
INTERNAL:<srsid>
— ID usada en la base de datos QGIS - manejada concreateFromSrsId()
PROJ:<proj>
- manejada concreateFromProj()
WKT:<wkt>
- manejada concreateFromWkt()
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 4.99999999999999911)>