Mendefinisikan layer CRS dan menghindari dialog CRS di PyQGIS?

16

Ada Shapefile yang ada, yang ingin saya tambahkan.

Saat ini kode saya terlihat seperti:

self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")

Ini berfungsi dengan baik, tetapi saya ingin mendefinisikan crs dalam kode. Apa itu mungkin? Saya menemukan beberapa pertanyaan serupa seperti ini: Secara terprogram Pilih CRS di QGIS 2.4 menggunakan Python

Tetapi saya tetap tidak berhasil.

Hinne123
sumber

Jawaban:

8

Saya memecahkan masalah serupa dengan cara ini:

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
sumber
4
Namun masih meminta saya CRS dalam dialog?
Mustafa Uçar
Dialog CRS muncul!
Roberto Marzocchi
gis.stackexchange.com/a/325796/77806 - dialog tidak akan muncul, dikonfirmasi
Pavel Pereverzev
6

Berdasarkan pada posting blog ini dan jawabannya Bagaimana saya bisa menentukan CRS dari layer raster di pyqgis? , Anda dapat mencapai apa yang Anda inginkan dengan cara ini:

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 )

Catatan: Jika Anda masih menggunakan QGIS v2.x (BTW, Anda tidak boleh: P), gunakan nama variabel "/ Proyeksi / default Perilaku" sebagai gantinya.

Germán Carrillo
sumber
5

Kode berikut harus memungkinkan Anda untuk menambahkan layer vektor tanpa jendela popup CRS muncul (setidaknya itu tidak muncul untuk saya):

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)

Cukup ubah nilai 4326CRS dalam kedua kasus ke ID Otoritas pilihan Anda seperti yang ditunjukkan pada gambar:

Opsi CRS

Yusuf
sumber
1
Terima kasih atas jawaban anda! Tetapi masalah utama adalah ketika saya memuat layer muncul dialog di mana saya bisa memilih crs. Apakah mungkin menyembunyikan atau menonaktifkannya?
Hinne123
Mengedit posting saya, ketika saya menjalankan perintah saya tidak menerima jendela dialog. Semoga Anda juga tidak!
Joseph
2
Jendela CRS hanya muncul jika CRS belum diatur dalam kode. Selama Anda mengaturnya, Anda akan menjadi baik.
BritishSteel
@BritishSteel - Terima kasih telah menyebutkan itu! Saya tidak tahu itu masalahnya.
Joseph
3

Setelah berbulan-bulan kemudian saya menemukan solusi. Anda harus menambahkan dua baris sebelum dan akhir skrip yang dari @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
sumber
1

Bagi saya solusi di atas tidak berhasil. Mungkin karena saya memuat csv sebagai layer vektor, bukan file bentuk. Satu-satunya cara saya membuatnya bekerja adalah:

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

Jawaban ini menjelaskan cara menghindari dialog ini dengan menentukan CRS di URL yang digunakan untuk memuat file ke dalam memori. Jadi alih-alih meneruskan jalur Shapefile langsung ke addVectorLayer(), buat QgsVectorLayerdengan URL yang sesuai lalu panggil 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
sumber