Mencari fungsi pembersihan untuk menghapus lapisan dari file qgs yang tidak ada di panel Layers dari QGIS?

8

Saya memiliki beberapa proyek QGIS yang telah saya gunakan untuk waktu yang lama, menambah dan menghapus lapisan, memperbarui referensi ke file yang dihapus atau dipindahkan dll.

Membuka file qgs dengan editor teks saya melihat bahwa itu berisi banyak referensi untuk file yang berbeda, dan referensi ini tidak ditampilkan di panel Layer tree.

Saya memiliki tiga kasus berbeda: referensi ke file yang ada, referensi ke file yang hilang, referensi ke koneksi database. Saya menyadari hal ini ketika saya membuka proyek saya di komputer lain, dan QGIS melaporkan koneksi database yang hilang ke tabel vektor yang tidak ada dalam tampilan lapisan pohon.

Menghapus referensi dari file qgs secara manual memecahkan masalah, tapi saya mengelola proyek besar dan hampir mustahil untuk secara manual memeriksa konsistensi proyek. Saya sudah mencoba plugin "Hapus lapisan kosong", tetapi yang saya coba hapus bukan lapisan kosong.

Apakah ada cara untuk 'membersihkan' file qgis?

bradypus
sumber
Apakah Anda memeriksa dengan menyimpan jalur relatif dalam file .qgs? Its at Setting--> Project Properties-->save paths-->relativeCheers N
Naresh
Bagaimana dengan "Simpan sebagai ..." ke file proyek baru?
AndreJ
1
Itu tidak berhasil! Saya akan mengirim ke mailing list pengguna QGIS file proyek GQIS yang berisi lapisan hantu, tidak ada di panel Layers.
bradypus
1
Bisakah Anda memposting file qgs di suatu tempat yang bisa kami dapatkan? Saya tidak dapat menduplikasi situasi Anda. Mungkin yang Anda butuhkan hanyalah pengurai sederhana.
Seperti
1
@ike Silakan cek di sini: lists.osgeo.org/pipermail/qgis-user/2012-September/019327.html . Anda akan menemukan di sana proyek uji yang saya kirim ke milis. Untuk memperbanyaknya, Anda harus menempatkan file tif di jalur relatif ini: ./Planimetrie/2012/plan01_2012.tif. Silakan baca juga pesan-pesan berikut untuk lebih jelasnya.
bradypus

Jawaban:

7

Layer-layer yang dimaksud ada di dalam layer registry tetapi tidak ada dalam legenda .

Skrip python berikut menghapus semua lapisan yang dimuat, tetapi tidak ditampilkan dalam legenda.

Menghapus lapisan:

registryLayers = QgsMapLayerRegistry.instance().mapLayers().keys()
legendLayers = [ layer.id() for layer in iface.legendInterface().layers() ]
layersToRemove = set( registryLayers ) - set( legendLayers )
QgsMapLayerRegistry.instance().removeMapLayers( list( layersToRemove ) )

Itu harus dijalankan dari konsol python di dalam QGIS. Setelah menerapkannya, Anda dapat memverifikasi operasi dengan memeriksa bahwa lapisan sudah hilang dari File (Project in 2.0) => Properti Proyek => Lapisan yang dapat diidentifikasi . Perubahan tidak disimpan secara otomatis

Dengan menambahkan baris berikut di akhir, perubahan juga akan disimpan secara otomatis.

iface.actionSaveProject().trigger()

Silakan buat salinan cadangan file proyek Anda (.qgs) sebelum menimpa file proyek Anda setelah menerapkan skrip ini.

Untuk QGIS 1.8, baris berikut harus dijalankan terlebih dahulu:

iface = qgis.utils.iface
Matthias Kuhn
sumber
Oke, saya mendapatkan kesalahan saat saya memasukkannya. Traceback (panggilan terakhir terakhir): File "<input>", baris 1, dalam <module> NameError: name 'legendLayerNames' tidak ditentukan
Ger
1
QGIS 1.8 membutuhkan cara lain untuk mengakses iface. Jawabannya diperbarui untuk mencerminkan ini.
Matthias Kuhn
1
Saya pikir Anda memilikinya di sini. Yah itu berhasil dalam kasus saya. Dan sebagai hasilnya, QGIS Cloud berfungsi lebih baik juga karena dapat mengunggah lapisan sekarang. Luar biasa.
Ger
0

Selain banyak fungsi bermanfaat lainnya, plugin bernama " Layer Board " (tersedia di dalam installer Plugin) memiliki tombol bawaan untuk "Remove ghost layers" yang menyelesaikan masalah ini.

Selain tombol 1-klik untuk menghapus layer ghost, ini juga memungkinkan Anda untuk melihat dan menghapus layer individual dalam GUI yang bagus yang berisi daftar setiap layer dan propertinya. Anda dapat memilih salah satu dari masing-masing lapisan ini dari tabel dan klik tombol "Hapus Lapisan" untuk menyelesaikan setiap masalah satu per satu, jika Anda memilih.

Dalam kasus saya, kemampuan untuk menghapus referensi lapisan individu sangat penting, karena saya memiliki beberapa "lapisan hantu" yang memiliki nama yang sama tetapi direferensikan 2-3 kali dalam registri. Saya menggunakan papan layer untuk menghapus entri yang benar secara individual dan kembali ke referensi lapisan tunggal yang benar.

RyanKDalton
sumber