¿Definir capa CRS y evitar el diálogo CRS en PyQGIS?

Respuestas:

8

Resuelvo el problema similar de esta manera:

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
fuente
44
Sin embargo, todavía me pregunta CRS en el diálogo
Mustafa Uçar
¡Aparece el cuadro de diálogo CRS!
Roberto Marzocchi
gis.stackexchange.com/a/325796/77806 - el diálogo no aparecerá, confirmado
Pavel Pereverzev
6

Basado tanto en esta publicación de blog como en la respuesta a ¿Cómo puedo especificar el CRS de una capa ráster en pyqgis? , puedes lograr lo que quieres de esta manera:

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: Si todavía está usando QGIS v2.x (por cierto, no debería: P), use el nombre de variable "/ Projections / defaultBehaviour" en su lugar.

Germán Carrillo
fuente
5

El siguiente código debería permitirle agregar una capa vectorial sin que aparezca la ventana emergente CRS (al menos no me parece):

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)

Simplemente cambie el 4326valor de CRS en ambos casos al ID de autoridad de su elección como se muestra en la imagen:

Opciones de CRS

José
fuente
1
¡Gracias por tu respuesta! Pero el problema principal es que cuando cargo la capa aparece un cuadro de diálogo donde puedo elegir el crs. ¿Es posible ocultarlo o deshabilitarlo?
Hinne123
Edité mi publicación, cuando ejecuto los comandos no recibo una ventana de diálogo. ¡Ojalá tú tampoco!
Joseph
2
La ventana CRS solo aparece si el CRS no se ha configurado en el código. Mientras lo establezca, será bueno.
BritishSteel
@BritishSteel - ¡Gracias por mencionar eso! No sabía que ese fuera el caso.
Joseph
3

Después de meses después encontré una solución. Debe agregar dos líneas antes y al final del script que es 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
fuente
1

Para mí, cualquier solución anterior no funciona. Tal vez porque estoy cargando csv como capa vectorial, no como un archivo de forma. La única forma en que puedo hacer que funcione es:

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

Esta respuesta describe cómo evitar este diálogo especificando el CRS en la URL utilizada para cargar el archivo en la memoria en primer lugar. Entonces, en lugar de pasar la ruta de Shapefile directamente a addVectorLayer(), cree un QgsVectorLayercon la URL apropiada y luego llame 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
fuente