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.

Jawaban:



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.


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


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)

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))

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.