Layer-CRS definieren und CRS-Dialog in PyQGIS vermeiden?

16

Es gibt ein vorhandenes Shapefile, das ich hinzufügen möchte.

Im Moment sieht mein Code so aus:

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

Es funktioniert gut, aber ich möchte die crs innerhalb des Codes definieren. Ist es möglich? Ich habe einige ähnliche Fragen wie diese gefunden: Programmgesteuertes Auswählen eines CRS in QGIS 2.4 mit Python

Aber ich bekomme es trotzdem nicht zum Laufen.

Hinne123
quelle

Antworten:

8

Ich löse das ähnliche Problem auf folgende Weise:

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
quelle
4
Allerdings fragt es mich immer noch CRS im Dialog?
Mustafa Uçar
Der CRS-Dialog erscheint!
Roberto Marzocchi
gis.stackexchange.com/a/325796/77806 - Dialog wird nicht angezeigt , bestätigt
Pavel Pereverzev
6

Basierend auf diesem Blog-Beitrag und der Antwort auf Wie kann ich das CRS einer Rasterebene in Pyqgis angeben? So erreichen Sie, was Sie wollen:

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 )

Hinweis: Wenn Sie weiterhin QGIS v2.x verwenden (BTW, sollten Sie nicht: P), verwenden Sie stattdessen den Variablennamen "/ Projections / defaultBehaviour".

Germán Carrillo
quelle
5

Mit dem folgenden Code können Sie eine Vektorebene hinzufügen, ohne dass das CRS-Popup-Fenster angezeigt wird (zumindest wird es für mich nicht angezeigt):

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)

Ändern Sie einfach den 4326CRS-Wert in beiden Fällen in die Autoritäts-ID Ihrer Wahl (siehe Abbildung):

CRS-Optionen

Joseph
quelle
1
Danke für deine Antwort! Aber das Hauptproblem ist, dass beim Laden der Ebene ein Dialog erscheint, in dem ich die crs auswählen kann. Kann man es verstecken oder deaktivieren?
Hinne123
Hat meinen Beitrag bearbeitet, wenn ich die Befehle ausführe, wird kein Dialogfenster angezeigt. Hoffentlich wirst du es auch nicht!
Joseph
2
Das CRS-Fenster wird nur angezeigt, wenn das CRS nicht im Code festgelegt wurde. Solange Sie es einstellen, werden Sie gut sein.
BritishSteel
@BritishSteel - Vielen Dank, dass Sie das erwähnt haben! Ich wusste nicht, dass das der Fall ist.
Joseph
3

Nach Monaten fand ich eine Lösung. Sie sollten zwei Zeilen vor und am Ende des Skripts hinzufügen, das von @Domokos Endre stammt:

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
quelle
1

Für mich funktioniert keine der oben genannten Lösungen. Vielleicht, weil ich CSV als Vektorebene lade, keine Formdatei. Die einzige Möglichkeit, es zum Laufen zu bringen, ist:

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

In dieser Antwort wird beschrieben, wie Sie diesen Dialog vermeiden, indem Sie zunächst den CRS in der URL angeben, die zum Laden der Datei in den Speicher verwendet wird. Anstatt den Shapefile-Pfad direkt an zu übergeben addVectorLayer(), erstellen Sie einen QgsVectorLayermit der entsprechenden URL und rufen Sie dann an 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
quelle