Ist es möglich, das Projekt CRS über einen Python-Befehl festzulegen?

10

Ist es möglich, das Projekt-CRS eines Projekts in QGIS über einen Python-Befehl festzulegen?

In meinem Fall sollte der Benutzer QGIS öffnen, mein geschriebenes Plugin starten und dieses Plugin lädt räumliche Daten mit dem Epsg-Code 31467 (Gauss Krueger Zone 3). Leider ist QGIS Standard CRS WGS84 und ich bekomme Probleme mit den Einheiten und der Waage.

Mein erster Ansatz war die Verwendung dieses Codes:

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

Dies ändert (nachdem die Daten bereits visualisiert wurden) das CRS in Gauss Krueger Zone 3. Zumindest der Espg-Code in der unteren rechten Ecke hat sich geändert. Die Einheiten sind immer noch in Grad und die Skala ist völlig falsch. 1: 5000 in Gauß Krüger ist 1: 528822376 in WGS 84 (in meinem Fall in QGIS). Nach dem manuellen Einstellen des Projekt-CRS in den Eigenschaften ist das Projekt-CRS wirklich GK3 und der Maßstab und die Einheiten stimmen.

Meine Frage ist also, kann ich das Projekt CRS anders einstellen, als ich es getan habe? Ich möchte den manuellen Weg vermeiden.


Ich habe das Problem durch Hinzufügen des folgenden Codes gelöst:

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

Dadurch werden die Einheiten auf Meter eingestellt und die Waage wird automatisch aktualisiert. Die 0 steht für Meter, 1 für Fuß, 2 für Grad und 3 für Unbekannt.

kopi
quelle

Antworten:

7

Ja es ist möglich. Das Openlayers-Plugin von Sourcepole setzt CRS automatisch auf EPSG: 3857.

Schauen Sie sich openlayers_layers.py und openlayers_plugin.py an.

AndreJ
quelle
8

Eine etwas späte Antwort, aber falls jemand von Google auf diese Seite wechselt, ohne das Plugin installiert zu haben, bietet http://www.purplelinux.co.nz gute Informationen dazu.

Das Beispiel für Purplelinux (das gut funktioniert) legt Folgendes nahe:

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


Sie können sogar ein CRS erstellen, indem Sie Folgendes aufrufen:

QgsCoordinateReferenceSystem("PROPERTY:ID")

welches sein würde:

QgsCoordinateReferenceSystem("EPSG:31467")

was meiner Meinung nach den Code viel lesbarer macht.

Kim
quelle
1
Beachten Sie, dass der Code für QGIS 2.X ist und Sie andere Antworten hier für QGIS3-Code sehen sollten
Mr Purple
4

Benutze das:

QgsProject.instance().setCrs(my_crs)
letmaik
quelle
1
Funktioniert mit QGIS3, wenn my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande