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:

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