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