Saya memiliki beberapa lapisan dengan simbol yang didefinisikan data yang sangat kompleks. Jika saya menggunakan legenda di komposer cetak, simbol-simbol ini tidak digambar dengan benar.
Apakah ada cara untuk mengubah simbol legenda dengan pyqgis, jadi saya dapat menggunakan gambar PNG atau SVG khusus sebagai ganti simbol legenda default untuk lapisan ini?
Saya tahu cara menambahkan Tombol ke komposer Cetak dan bagaimana menghubungkannya dengan suatu fungsi. Saya ingin menambahkan tombol ke Legenda-Pengaturan untuk memungkinkan saya mengganti ikon legenda yang dibuat secara otomatis dengan gambar khusus. Jadi yang masih saya butuhkan adalah informasi tentang bagaimana saya dapat mengakses legenda-simbol dengan pyqgis / pyqt, dan bagaimana cara menggantinya dengan QImage pada QLabel atau sesuatu seperti itu?
Maket tombol yang sangat mendasar yang digunakan untuk mengubah simbol:
Legenda yang dihasilkan secara otomatis:
Legenda dengan simbol legenda kustom:
Saya sudah menemukan cara mengakses item legenda di komposer cetak tetapi belum cara mengakses simbol itu sendiri:
import qgis
from PyQt4.QtCore import *
from PyQt4.QtGui import *
activeComposer = iface.activeComposers()
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
#print i
#print i.model()
legend = i
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
print posteleg.data()
Edit 1:
Saya juga menemukan cara Mengakses QIcon-Objects dari pohon-legenda tetapi belum dapat menukarnya:
def run(self):
activeComposer = self.iface.activeComposers()
#print(self.resolve('icon.png'))
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
legend = i
layerIcon = QIcon(os.path.join(os.path.dirname(__file__), "icon.png"))
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
posteleg.model().iconGroup().swap(layerIcon)
print posteleg.data()
Berikut adalah satu contoh kehidupan nyata di mana Anda dapat melihat simbologi yang dikombinasikan dari banyak lapisan simbol: Ini akan berakhir dalam legenda seperti ini:
Karena saya membutuhkan simbol yang tepat dalam legenda, saya ingin membuat tangkapan layar simbol saya, memotongnya dan menggunakannya sebagai gambar dalam legenda saya.
Saya tahu saya hanya bisa overlay gambar terpisah di atas legenda saya yang mencakup simbol yang dibuat secara otomatis tetapi saya ingin memiliki solusi "bersih" yang memungkinkan saya untuk mengganti simbol dalam legenda dengan gambar khusus.
Edit 2:
Sementara itu saya telah menemukan cara lain untuk mendapatkan akses ke entri legenda:
from qgis.core import QgsLegendRenderer, QgsComposerLegendStyle
compDict = {}
for comp in iface.activeComposers():
# workaround to get name: read it from window title
compDict[comp.composerWindow().windowTitle()] = comp.composition()
if "mycomposername" in compDict:
itemLlegend = compDict["mycomposername"].getComposerItemById("mylegend_id")
if itemLlegend:
print itemLlegend
tree_layer_layer = itemLlegend.modelV2().rootGroup().children()
for item in tree_layer_layer:
if item.layerName()=="MyLayername":
print "match"
QgsLegendRenderer.setNodeLegendStyle(item, QgsComposerLegendStyle.Group)
Ini memungkinkan saya untuk mengakses objek QgsLayerTreeLayer dan saya bisa mengganti Style legenda (Grup, Subkelompok, Tersembunyi). Tapi saya masih belum tahu bagaimana mengakses simbol-legenda. Ada ide?
Jawaban:
Karena topik ini mencakup banyak argumen, saya hanya akan fokus pada layer simbol SVG, berharap bahwa saya telah memahami dengan baik apa yang Anda cari (saya tidak menyadari panjangnya jawaban saat menulis, jadi saya minta maaf untuk tapi saya harap ini akan menambah kejelasan).
Konteks
1) Kelas lapisan simbol
Kelas lapisan simbol berikut tersedia untuk format SVG:
Pendekatan umum untuk membuat layer simbol menginisialisasi dengan kamus properti.
Anda dapat menginisialisasi lapisan simbol baru dan melihat properti default dengan cara ini:
Anda akan mendapatkan semua properti yang disimpan di dalamnya:
Jika Anda ingin mengedit properti, Anda dapat menggunakan metode, yang dapat dipanggil dari bantuan kelas (misalnya dijalankan
help(QgsSvgMarkerSymbolLayerV2)
di Konsol Python). Anda akan melihat nanti contoh cara menggunakan metode.Demi kelengkapan, Anda juga dapat menginisialisasi lapisan simbol dengan kamus properti (misalnya, lihat di sini ), tetapi saya dengan tulus lebih memilih pendekatan pertama dan saya akan menggunakannya.
2) Membuat renderer
Untuk menggunakan layer simbol setelah Anda membuatnya (dan akhirnya diedit), Anda perlu membuat renderer yang sesuai dan kemudian menetapkan renderer itu ke layer peta Anda.
Untuk mengakses renderer layer yang ada:
Untuk mendapatkan daftar jenis renderer yang tersedia, gunakan:
Untuk kasus Anda, kami harus berurusan dengan renderer simbol Categorized . Seperti yang saya katakan sebelumnya, Anda perlu membuat renderer dan kemudian menetapkannya ke layer:
3) Mengubah layer simbol
Beberapa simbol renderer simbol Categorized dapat dipanggil melalui
symbols()
(mengembalikan daftar):Jika Anda ingin mengganti layer simbol yang diberikan dalam yang
symbol
ditentukan sebelumnya, Anda hanya perlu mengetahui indeksnya dan kemudian kirim ke renderer dengan cara ini:di mana
[0]
menunjukkan item pertama dari grup yang dikategorikan.Larutan
Akhirnya, mari kita terapkan apa yang baru saja kita pelajari!
Dengan asumsi bekerja pada lapisan poligon ini, yang menyimpan penggunaan lahan yang telah kita tentukan sebelumnya:
Jika Anda ingin mengubah pola default untuk penggunaan lahan pertanian (mereka memiliki posisi No. 1 di grup 'landuse') dengan gambar SVG tertentu, Anda dapat menjalankan kode ini (baca di sini untuk mengetahui cara menambahkan SVG khusus jalan):
Ini akan menjadi hasilnya:
Kode di atas sangat kasar tetapi, karena saya tidak tahu apakah Anda menginginkan solusi spesifik untuk contoh Anda atau penjelasan yang lebih umum, saya lebih suka memusatkan perhatian pada alat yang tersedia daripada memperbaiki kode itu sendiri (saya yakin Anda dapat sedikit mengeditnya sesuai dengan kebutuhan spesifik Anda!).
sumber
Atau, dan tanpa pengkodean Python, saya menyelesaikan ini dengan membuat grup layer baru yang didedikasikan untuk pembuatan legenda, di mana saya dapat meletakkan apa pun yang saya suka, dengan ukuran dan warna yang saya inginkan. Seperti ini di komposer cetak saya baru saja menghapus dari item legenda layer data aktual dan hanya menyimpan grup layer legenda.
Secara khusus praktis ketika membutuhkan untuk membuat legenda yang dapat mewakili kasus tidak terjadi di peta cetak yang sebenarnya.
Sunting: dan tentang suntingan kedua Anda, dengan simbol yang dikomposisikan tidak ditampilkan dengan benar, apakah Anda memiliki beberapa variabel yang mendefinisikan simbol Anda, seperti "C" ou "G" sebenarnya relatif terhadap bidang, atau orientasinya? Jika ini masalahnya, QGIS tidak dapat menebak apa yang ingin Anda tampilkan, maka semuanya ditampilkan dengan menampilkan segala sesuatu tanpa nilai untuk parameter ini. Solusinya adalah simpply menyimpan simbol dengan beberapa nilai tetap di tempat variabel. Dengan cara ini saya dapat mengganti item legenda tampilan default ini: dengan yang ini sesuai dengan kebutuhan saya
sumber