Czy można ustawić CRS projektu za pomocą komendy Python?

10

Czy można ustawić CRS projektu w QGIS za pomocą komendy Python?

W moim przypadku użytkownik powinien otworzyć QGIS, uruchomić moją pisemną wtyczkę, a ta wtyczka załaduje dane przestrzenne, które mają kod epsg 31467 (Gauss Krueger Zone 3). Niestety domyślnym CRS QGIS jest WGS84, więc mam kłopoty z jednostkami i skalą.

Moje pierwsze podejście polegało na użyciu tego kodu:

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

Zmienia się (po wizualizacji danych) CRS na Gauss Krueger Zone 3. Przynajmniej kod espg w prawym dolnym rogu się zmienił. Jednostki są nadal w stopniach, a skala jest całkowicie błędna. 1: 5000 w Gaussu Krügerze to 1: 528822376 w WGS 84 (w moim przypadku w QGIS). Po ręcznym ustawieniu CRS projektu we właściwościach crs projektu to tak naprawdę GK3, a skala i jednostki mają rację.

Więc moje pytanie brzmi: czy mogę ustawić projekt CRS w inny sposób niż to zrobiłem? Chcę uniknąć sposobu ręcznego.


Rozwiązałem problem, dodając następujący kod:

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

Spowoduje to ustawienie jednostek na metry, a waga zostanie automatycznie zaktualizowana. 0 oznacza metry, 1 oznacza stopę, 2 oznacza stopień, a 3 - nieznany.

kopi
źródło

Odpowiedzi:

7

Tak, to możliwe. Wtyczka Openlayers firmy Sourcepole automatycznie ustawia CRS na EPSG: 3857.

Spójrz na openlayers_layers.py i openlayers_plugin.py.

AndreJ
źródło
8

Trochę późno na odpowiedź, ale na wypadek, gdyby ktoś wpadł na tę stronę z google, bez zainstalowanej wtyczki, http://www.purplelinux.co.nz zapewnia dobre informacje na ten temat.

Przykład znaleziony na purplelinux (który działa dobrze) sugeruje, co następuje:

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


Możesz nawet stworzyć CRS, dzwoniąc:

QgsCoordinateReferenceSystem("PROPERTY:ID")

co byłoby:

QgsCoordinateReferenceSystem("EPSG:31467")

który IMHO sprawia, że ​​kod jest znacznie bardziej czytelny.

Kim
źródło
1
Uwaga: kod dotyczy QGIS 2.X i powinieneś zobaczyć inne odpowiedzi wymienione tutaj dla kodu QGIS3
Mr Purple
4

Użyj tego:

QgsProject.instance().setCrs(my_crs)
letmaik
źródło
1
Działa z QGIS3, kiedy my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande