Définir la couche CRS et éviter la boîte de dialogue CRS dans PyQGIS?

16

Il existe un fichier de formes existant, que je veux ajouter.

En ce moment, mon code ressemble à:

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

Cela fonctionne bien, mais je veux définir les crs dans le code. C'est possible? J'ai trouvé des questions similaires comme celle-ci: Sélectionner par programme un CRS dans QGIS 2.4 en utilisant Python

Mais je ne le fais pas fonctionner de toute façon.

Hinne123
la source

Réponses:

8

Je résous le problème similaire de cette façon:

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
la source
4
Cependant il me demande toujours CRS en dialogue?
Mustafa Uçar
La boîte de dialogue CRS apparaît!
Roberto Marzocchi
gis.stackexchange.com/a/325796/77806 - la boîte de dialogue n'apparaîtra pas, confirmée
Pavel Pereverzev
6

Sur la base de ce billet de blog et de la réponse à Comment puis-je spécifier le CRS d'une couche raster dans pyqgis? , vous pouvez réaliser ce que vous voulez de cette façon:

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 )

Remarque: Si vous utilisez toujours QGIS v2.x (BTW, vous ne devriez pas: P), utilisez plutôt le nom de variable "/ Projections / defaultBehaviour".

Germán Carrillo
la source
5

Le code suivant devrait vous permettre d'ajouter une couche vectorielle sans que la fenêtre contextuelle CRS n'apparaisse (au moins, elle n'apparaît pas pour moi):

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)

Modifiez simplement la 4326valeur CRS dans les deux cas en l' ID d'autorité de votre choix, comme indiqué dans l'image:

Options CRS

Joseph
la source
1
Merci pour votre réponse! Mais le principal problème est que lorsque je charge le calque, une boîte de dialogue apparaît où je peux choisir les crs. Est-il possible de le masquer ou de le désactiver?
Hinne123
Modifié mon message, lorsque j'exécute les commandes, je ne reçois pas de fenêtre de dialogue. Espérons que vous non plus!
Joseph
2
La fenêtre CRS apparaît uniquement si le CRS n'a pas été défini dans le code. Tant que vous le définissez, vous serez bon.
BritishSteel
@BritishSteel - Merci d'avoir mentionné cela! Je ne savais pas que c'était le cas.
Joseph
3

Quelques mois plus tard, j'ai trouvé une solution. Vous devez ajouter deux lignes avant et à la fin du script qui vient 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
la source
1

Pour moi, toute solution ci-dessus ne fonctionne pas. Peut-être parce que je charge csv en tant que couche vectorielle, pas un fichier de forme. La seule façon de le faire fonctionner est:

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

Cette réponse décrit comment éviter cette boîte de dialogue en spécifiant le CRS dans l'URL utilisée pour charger le fichier en mémoire en premier lieu. Donc, au lieu de passer directement le chemin Shapefile à addVectorLayer(), créez un QgsVectorLayeravec l'URL appropriée, puis appelez 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
la source