Apakah mungkin untuk mengatur proyek CRS melalui perintah Python?

10

Apakah mungkin untuk menetapkan CRS proyek dari sebuah proyek di QGIS melalui perintah Python?

Dalam kasus saya pengguna harus membuka QGIS, mulai plugin tertulis saya dan plugin ini akan memuat data spasial yang memiliki kode epsg 31467 (Gauss Krueger Zone 3). Sayangnya QGIS default CRS adalah WGS84, jadi saya mendapat masalah dengan unit dan skala.

Pendekatan pertama saya adalah menggunakan kode ini:

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

Perubahan ini (setelah data sudah divisualisasikan) CRS ke Gauss Krueger Zone 3. Setidaknya kode espg di sudut kanan bawah telah berubah. Unit masih dalam derajat dan skalanya benar-benar salah. 1: 5000 di Gauss Krüger adalah 1: 528822376 di WGS 84 (dalam kasus saya di QGIS). Setelah mengatur proyek CRS secara manual di properti, proyek crs benar-benar GK3 dan skala dan unitnya benar.

Jadi pertanyaan saya adalah, dapatkah saya mengatur proyek CRS dengan cara lain daripada yang telah saya lakukan? Saya ingin menghindari cara manual.


Saya memecahkan masalah dengan menambahkan kode berikut:

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

Ini mengatur unit ke meter dan skala diperbarui secara otomatis. 0 berarti meter, 1 untuk kaki, 2 untuk derajat dan 3 untuk tidak diketahui.

kopi
sumber

Jawaban:

7

Iya itu mungkin. Plugin Openlayers oleh Sourcepole secara otomatis menetapkan CRS ke EPSG: 3857.

Lihatlah openlayers_layers.py dan openlayers_plugin.py.

AndreJ
sumber
8

Agak terlambat untuk menjawab, tetapi jika seseorang turun ke halaman itu dari google, tanpa menginstal plugin, http://www.purplelinux.co.nz memberikan informasi yang baik tentang itu.

Contoh yang ditemukan di purplelinux (yang berfungsi dengan baik) menyarankan hal berikut:

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


Dan Anda bahkan dapat membuat CRS dengan menelepon:

QgsCoordinateReferenceSystem("PROPERTY:ID")

yang akan menjadi:

QgsCoordinateReferenceSystem("EPSG:31467")

yang IMHO membuat kode lebih mudah dibaca.

Kim
sumber
1
Perhatikan kodenya untuk QGIS 2.X dan Anda akan melihat jawaban lain yang tercantum di sini untuk kode QGIS3
Tn. Purple
4

Gunakan ini:

QgsProject.instance().setCrs(my_crs)
letmaik
sumber
1
Bekerja dengan QGIS3, ketika my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande