É possível definir o CRS do projeto por meio de um comando Python?

10

É possível definir o CRS do projeto de um projeto no QGIS por meio de um comando Python?

No meu caso, o usuário deve abrir o QGIS, iniciar meu plug-in escrito e este plug-in carregará dados espaciais com o código epsg 31467 (Gauss Krueger Zone 3). Infelizmente, o CRS padrão do QGIS é o WGS84 e, por isso, tenho problemas com as unidades e a balança.

Minha primeira abordagem foi usar esse código:

    my_crs = core.QgsCoordinateReferenceSystem(31467, core.QgsCoordinateReferenceSystem.EpsgCrsId)
    self.iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)

Isso muda (depois que os dados já são visualizados) o CRS para a Zona 3. de Gauss Krueger. Pelo menos o código espg no canto inferior direito foi alterado. As unidades ainda estão em graus e a escala está totalmente errada. 1: 5000 no Gauss Krüger é 1: 528822376 no WGS 84 (no meu caso no QGIS). Após definir o CRS do projeto manualmente nas propriedades, o crs do projeto é realmente GK3 e a balança e as unidades estão corretas.

Portanto, minha pergunta é: posso definir o CRS do projeto de outra maneira que eu fiz? Eu quero evitar o caminho manual.


Resolvi o problema adicionando o seguinte código:

qgis.utils.iface.mapCanvas().setMapUnits(0)
qgis.utils.iface.mapCanvas().refresh()

Isso define as unidades para medir e a balança é atualizada automaticamente. O 0 significa metros, 1 é para pé, 2 é para grau e 3 é desconhecido.

kopi
fonte

Respostas:

7

Sim é possivel. O plug-in Openlayers do Sourcepole define automaticamente o CRS como EPSG: 3857.

Dê uma olhada em openlayers_layers.py e openlayers_plugin.py.

AndreJ
fonte
8

Um pouco tarde para responder, mas no caso de alguém acessar a página do google sem o plug-in instalado, http://www.purplelinux.co.nz fornece boas informações sobre isso.

O exemplo encontrado no purplelinux (que está funcionando bem) sugere o seguinte:

if iface.mapCanvas().mapRenderer().hasCrsTransformEnabled():
    my_crs = core.QgsCoordinateReferenceSystem(4326,core.QgsCoordinateReferenceSystem.EpsgCrsId)
    iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)


E você pode até criar um CRS chamando:

QgsCoordinateReferenceSystem("PROPERTY:ID")

qual seria:

QgsCoordinateReferenceSystem("EPSG:31467")

qual IMHO torna o código muito mais legível.

Kim
fonte
11
Observe que o código é para o QGIS 2.X e você deve ver outras respostas listadas aqui para o código QGIS3
Mr Purple
4

Usa isto:

QgsProject.instance().setCrs(my_crs)
letmaik
fonte
11
Funciona com QGIS3, quando my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande