8. Suporte a projeções
Dica
Os trechos de código desta página precisam das seguintes importações se você estiver fora do console do pyqgis:
1from qgis.core import (
2 QgsCoordinateReferenceSystem,
3 QgsCoordinateTransform,
4 QgsProject,
5 QgsPointXY,
6)
8.1. Sistemas de Referencia de Coordenadas
Os sistemas de referência de coordenadas (SRC) são encapsulados pela classe QgsCoordinateReferenceSystem
. Instâncias desta classe podem ser criadas de várias maneiras diferentes:
especificar CRS pela sua identificação
# EPSG 4326 is allocated for WGS84 crs = QgsCoordinateReferenceSystem("EPSG:4326") print(crs.isValid())
True
O QGIS suporta identificadores SRC diferentes com os seguintes formatos:
EPSG:<code>
— ID ID atribuído pela organização EPSG - manipulado comcreateFromOgcWms()
POSTGIS:<srid>
— ID usado em bancos de dados PostGIS databases - manipulados comcreateFromSrid()
INTERNAL:<srsid>
— ID usados no banco de dados interno do QGIS - manipulados comcreateFromSrsId()
PROJ:<proj>
- manipulado comcreateFromProj()
WKT:<wkt>
- manipulado comcreateFromWkt()
Se nenhum prefixo for especificado, assume-se a definição WKT.
especifica SRC pelo seu texto conhecido (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
cria um SRC inválido e usa uma das funções
create*
para inicializá-lo. No exemplo a seguir, usamos uma string Proj para inicializar a projeção.crs = QgsCoordinateReferenceSystem() crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") print(crs.isValid())
True
It’s wise to check whether creation (i.e. lookup in the database) of the CRS
has been successful: isValid()
must return True
.
Observe que, para a inicialização dos sistemas de referência espacial, o QGIS precisa procurar valores apropriados em seu banco de dados interno srs.db
. Portanto, no caso de você criar um aplicativo independente, precisará definir os caminhos corretamente com QgsApplication.setPrefixPath ()
, caso contrário, ele vai falhar quando tentar encontrar o banco de dados. Se você estiver executando os comandos no console do QGIS Python ou desenvolvendo um complemento, tudo já está configurado para você.
Acesso à informação do sistema de referência 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())
Saída:
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. Transformação de SRC
Você pode fazer a transformação entre diferentes sistemas de referência espacial usando a classe QgsCoordinateTransform
. A maneira mais fácil de usá-lo é criar um SRC de origem e destino e construir uma instância QgsCoordinateTransform
com eles e o projeto atual. Em seguida, basta chamar repetidamente a função transform ()
para fazer a transformação. Por padrão, ele faz a transformação, mas é capaz de fazer também a transformação 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)
Saída:
Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>