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