Os trechos de código desta página precisam das seguintes importações se você estiver fora do console do pyqgis:

1
2
3
4
5
6
from qgis.core import (
    QgsCoordinateReferenceSystem,
    QgsCoordinateTransform,
    QgsProject,
    QgsPointXY,
)

8. Suporte a projeções

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)

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

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

Saída:

1
2
3
4
5
6
7
8
QGIS CRS ID: 3452
PostGIS SRID: 4326
Description: WGS 84
Projection Acronym: longlat
Ellipsoid Acronym: EPSG:7030
Proj String: +proj=longlat +datum=WGS84 +no_defs
Is geographic: True
Map 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.

 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)

Saída:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 5)>