Definiowanie CRS warstwy i unikanie dialogu CRS w PyQGIS?

Odpowiedzi:

8

Rozwiązuję podobny problem w ten sposób:

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
źródło
4
Jednak nadal pyta mnie CRS w oknie dialogowym?
Mustafa Uçar
Pojawi się okno dialogowe CRS!
Roberto Marzocchi,
gis.stackexchange.com/a/325796/77806 - okno dialogowe nie pojawi się, potwierdzone
Pavel Pereverzev
6

Na podstawie zarówno tego postu na blogu, jak i odpowiedzi na pytanie Jak mogę określić CRS warstwy rastrowej w pyqgis? , możesz osiągnąć to, co chcesz w ten sposób:

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 )

Uwaga: Jeśli nadal używasz QGIS v2.x (BTW, nie powinieneś: P), zamiast tego użyj nazwy zmiennej „/ Projections / defaultBehaviour”.

Germán Carrillo
źródło
5

Poniższy kod powinien umożliwić dodanie warstwy wektorowej bez wyświetlania okna podręcznego CRS (przynajmniej dla mnie to się nie pojawia):

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)

Po prostu zmień 4326wartość CRS w obu przypadkach na wybrany identyfikator urzędu, jak pokazano na obrazku:

Opcje CRS

Joseph
źródło
1
Dziękuję za odpowiedź! Ale głównym problemem jest to, że kiedy ładuję warstwę, pojawia się okno dialogowe, w którym mogę wybrać crs. Czy można to ukryć lub wyłączyć?
Hinne123
Edytowałem mój post, kiedy uruchamiam polecenia, nie pojawia się okno dialogowe. Mam nadzieję, że ty też nie!
Joseph
2
Okno CRS pojawia się tylko wtedy, gdy CRS nie został ustawiony w kodzie. Dopóki go ustawisz, będziesz dobry.
BritishSteel
@BritishSteel - Dziękujemy za wzmiankę o tym! Nie wiedziałem, że tak jest.
Joseph
3

Po miesiącach znalazłem rozwiązanie. Powinieneś dodać dwie linie przed i na końcu skryptu, który pochodzi z @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
źródło
1

Dla mnie powyższe rozwiązanie nie działa. Może dlatego, że ładuję csv jako warstwę wektorową, a nie plik kształtu. Jedyny sposób, w jaki mogę sprawić, by działał to:

crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))
wawka
źródło
0

Ta odpowiedź opisuje, jak uniknąć tego okna dialogowego, określając CRS w adresie URL używanym do załadowania pliku do pamięci. Zamiast więc przekazywać ścieżkę Shapefile bezpośrednio do addVectorLayer(), utwórz QgsVectorLayerodpowiedni adres URL, a następnie wywołaj 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
źródło