Definire il livello CRS ed evitare la finestra di dialogo CRS in PyQGIS?


16

Esiste uno Shapefile esistente, che desidero aggiungere.

Al momento il mio codice è simile a:

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

Funziona bene, ma voglio definire i CR all'interno del codice. È possibile? Ho trovato alcune domande simili come questa: selezionare a livello di programmazione un CRS in QGIS 2.4 usando Python

Ma comunque non riesco a farlo funzionare.

Risposte:


8

Risolvo il problema simile in questo modo:

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)

4
Tuttavia mi chiede ancora CRS nella finestra di dialogo?
Mustafa Uçar,

Viene visualizzata la finestra di dialogo CRS!
Roberto Marzocchi,

gis.stackexchange.com/a/325796/77806 - la finestra di dialogo non verrà visualizzata, confermata
Pavel Pereverzev

6

Basato sia su questo post del blog sia sulla risposta a Come posso specificare il CRS di un livello raster in pyqgis? , puoi ottenere ciò che desideri in questo modo:

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 stai ancora usando QGIS v2.x (BTW, non dovresti: P), usa invece il nome della variabile "/ Proiezioni / defaultBehaviour".


5

Il codice seguente dovrebbe consentire di aggiungere un livello vettoriale senza che venga visualizzata la finestra popup CRS (almeno non appare per me):

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)

Cambia semplicemente il 4326valore CRS in entrambi i casi nell'ID autorità di tua scelta come mostrato nell'immagine:

Opzioni CRS


1
Grazie per la tua risposta! Ma il problema principale è che quando carico il layer appare una finestra di dialogo in cui potrei scegliere il CRS. È possibile nasconderlo o disabilitarlo?
Hinne123,

Modificato il mio post, quando eseguo i comandi non ricevo una finestra di dialogo. Spero che neanche tu!
Joseph,

2
La finestra CRS appare solo se CRS non è stato impostato nel codice. Finché lo imposterai sarai bravo.
BritishSteel,

@BritishSteel - Grazie per averlo menzionato! Non sapevo che fosse così.
Joseph,

3

Dopo mesi ho trovato una soluzione. Dovresti aggiungere due righe prima e alla fine dello script che proviene da @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)

1

Per me qualsiasi soluzione di cui sopra non funziona. Forse perché sto caricando csv come layer vettoriale, non come file di forma. L'unico modo in cui posso farlo funzionare è:

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

0

Questa risposta descrive come evitare questa finestra di dialogo specificando innanzitutto il CRS nell'URL utilizzato per caricare il file in memoria. Quindi, invece di passare direttamente il percorso Shapefile a addVectorLayer(), crea un QgsVectorLayercon l'URL appropriato e poi chiama 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.