È possibile impostare il progetto CRS tramite un comando Python?


10

È possibile impostare il progetto CRS di un progetto in QGIS tramite un comando Python?

Nel mio caso l'utente dovrebbe aprire QGIS, avviare il mio plugin scritto e questo plugin caricherà i dati spaziali che hanno il codice epsg 31467 (Gauss Krueger Zone 3). Sfortunatamente il CRS predefinito di QGIS è WGS84 e quindi ho problemi con le unità e la bilancia.

Il mio primo approccio è stato quello di utilizzare questo codice:

    my_crs = core.QgsCoordinateReferenceSystem(31467, core.QgsCoordinateReferenceSystem.EpsgCrsId)
    self.iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)

Questo cambia (dopo che i dati sono già visualizzati) il CRS in Gauss Krueger Zone 3. Almeno il codice espg nell'angolo in basso a destra è cambiato. Le unità sono ancora in gradi e la scala è totalmente sbagliata. 1: 5000 in Gauss Krüger è 1: 528822376 in WGS 84 (nel mio caso in QGIS). Dopo aver impostato il progetto CRS manualmente nelle proprietà, il progetto crs è davvero GK3 e la scala e le unità sono giuste.

Quindi la mia domanda è: posso impostare il progetto CRS in un modo diverso da come l'ho fatto? Voglio evitare il modo manuale.


Ho risolto il problema aggiungendo il seguente codice:

qgis.utils.iface.mapCanvas().setMapUnits(0)
qgis.utils.iface.mapCanvas().refresh()

In questo modo le unità vengono misurate e la scala viene aggiornata automaticamente. Lo 0 sta per metri, 1 è per piede, 2 è per grado e 3 per sconosciuto.

Risposte:


7

Si è possibile. Il plugin Openlayers di Sourcepole imposta automaticamente CRS su EPSG: 3857.

Dai un'occhiata a openlayers_layers.py e openlayers_plugin.py.


8

Un po 'in ritardo per rispondere, ma nel caso in cui qualcuno passi a quella pagina da google, senza aver installato il plug-in, http://www.purplelinux.co.nz fornisce buone informazioni al riguardo.

L'esempio trovato su purplelinux (che funziona bene) suggerisce quanto segue:

if iface.mapCanvas().mapRenderer().hasCrsTransformEnabled():
    my_crs = core.QgsCoordinateReferenceSystem(4326,core.QgsCoordinateReferenceSystem.EpsgCrsId)
    iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)


E potresti persino creare un CRS chiamando:

QgsCoordinateReferenceSystem("PROPERTY:ID")

quale sarebbe:

QgsCoordinateReferenceSystem("EPSG:31467")

quale IMHO rende il codice molto più leggibile.


1
Nota che il codice è per QGIS 2.X e dovresti vedere altre risposte elencate qui per il codice QGIS3
Mr Purple

4

Usa questo:

QgsProject.instance().setCrs(my_crs)

1
Funziona con QGIS3, quando my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande
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.