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") assert crs.isValid()
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)
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()
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") assert crs.isValid()
É interessante verificar se a criação (ou seja, pesquisa no banco de dados) do SRC foi bem-sucedida: isValid()
deve retornar 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: WGS84
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)>