Definindo o CRS da camada e evitando o diálogo do CRS no PyQGIS?

16

Existe um Shapefile existente, que eu quero adicionar.

No momento, meu código se parece com:

self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")

Funciona bem, mas quero definir os crs dentro do código. É possível? Encontrei algumas perguntas semelhantes como esta: Selecione programaticamente um CRS no QGIS 2.4 usando Python

Mas eu não faço funcionar de qualquer maneira.

Hinne123
fonte

Respostas:

8

Eu resolvo o problema semelhante desta maneira:

from qgis.core import *
from qgis.gui import *

layer = QgsVectorLayer(self.shpFilePath, "Track", "ogr")
crs = layer.crs()
crs.createFromId(4326)
layer.setCrs(crs)
QgsMapLayerRegistry.instance().addMapLayer(layer)
Domokos Endre
fonte
4
No entanto, ainda me pede CRS em diálogo?
Mustafa Uçar
A caixa de diálogo CRS é exibida!
Roberto Marzocchi
gis.stackexchange.com/a/325796/77806 - diálogo não aparecerá, confirmou
Pavel Pereverzev
6

Com base nesta postagem no blog e na resposta para Como posso especificar o CRS de uma camada raster em pyqgis? , você pode conseguir o que deseja dessa maneira:

settings = QSettings()
# Take the "CRS for new layers" config, overwrite it while loading layers and...
oldProjValue = settings.value( "/Projections/defaultBehavior", "prompt", type=str )
settings.setValue( "/Projections/defaultBehavior", "useProject" )

# YOUR CODE TO LOAD THE LAYER GOES HERE

# ... then set the "CRS for new layers" back
settings.setValue( "/Projections/defaultBehavior", oldProjValue )

Nota: Se você ainda estiver usando o QGIS v2.x (BTW, não deve: P), use o nome da variável "/ Projections / defaultBehaviour".

Germán Carrillo
fonte
5

O código a seguir deve permitir que você adicione uma camada vetorial sem que a janela pop-up do CRS apareça (pelo menos ela não aparece para mim):

from qgis import *
from qgis.utils import *

#replace "shapefile_path" with your layer's path; replace "Layer_name" with whatever name you want to give the layer in the TOC
qgis.utils.iface.addVectorLayer("shapefile_path", "Layer_name", "ogr")

#Use loaded layer as active layer to set the CRS
myLayer = qgis.utils.iface.activeLayer()
myLayer.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))

#Sets canvas CRS
my_crs = core.QgsCoordinateReferenceSystem(4326, core.QgsCoordinateReferenceSystem.EpsgCrsId)
iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)

Simplesmente mude o 4326 valor CRS nos dois casos para o ID da autoridade de sua escolha, conforme mostrado na imagem:

Opções de CRS

Joseph
fonte
1
Obrigado pela sua resposta! Mas o principal problema é que, quando carrego a camada, aparece uma caixa de diálogo onde eu poderia escolher os CRS. É possível ocultá-lo ou desativá-lo?
Hinne123
Editou minha postagem. Quando executo os comandos, não recebo uma janela de diálogo. Espero que você também não!
Joseph
2
A janela CRS aparece apenas se o CRS não tiver sido definido no código. Enquanto você definir, você será bom.
BritishSteel 23/02
@BritishSteel - Obrigado por mencionar isso! Eu não sabia que era o caso.
Joseph
3

Depois de meses depois, encontrei uma solução. Você deve adicionar duas linhas antes e no final do script, que é de @Domokos Endre:

import os

iface.mainWindow().blockSignals(True)

layer = QgsVectorLayer(path, "My Layer",  "ogr")
crs = layer.crs()
crs.createFromId(32637)  # Whatever CRS you want
layer.setCrs(crs)

QgsProject.instance().addMapLayer(layer)
iface.mainWindow().blockSignals(False)
Mustafa Uçar
fonte
1

Para mim, qualquer solução acima não funciona. Talvez porque eu esteja carregando csv como camada vetorial, não um arquivo de forma. A única maneira de fazê-lo funcionar é:

crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))
wawka
fonte
0

Esta resposta descreve como evitar esse diálogo especificando o CRS no URL usado para carregar o arquivo na memória em primeiro lugar. Portanto, em vez de passar o caminho Shapefile diretamente para addVectorLayer(), crie um QgsVectorLayercom o URL apropriado e, em seguida, chame addMapLayer().

import urlparse
import urllib

baseuri = urlparse.urljoin('file:', urllib.pathname2url(self.shpFilePath))
uri = baseuri + "?crs=EPSG:4326"
vlayer = QgsVectorLayer(uri, "result", "memory")
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
Nick K9
fonte