Mengatur deskripsi simbol legenda tata letak ArcMap dari tabel?
9
ArcMap memiliki kemampuan untuk menampilkan deskripsi yang diperluas untuk setiap item dalam daftar simbol. Bagaimana saya bisa mengisi properti itu dari sebuah tabel? Tujuannya adalah untuk menghindari mengedit setiap simbol satu per satu untuk menambahkan deskripsi .
Daripada mencoba menggunakan aplikasi ArcMap sendirian, saya telah membawa ArcPy ke dalam gambar.
Saya baru saja menguji dan mencapai apa yang Anda gambarkan menggunakan kelas UniqueValuesSymbology (arcpy.mapping) yang memiliki properti classDescription yang dapat ditulis yang dapat diatur ke:
Daftar string atau angka yang mewakili deskripsi untuk setiap nilai unik yang secara opsional dapat muncul dalam legenda dokumen peta. Nilai-nilai ini hanya dapat diakses di antarmuka pengguna ArcMap dengan mengklik kanan simbol yang ditampilkan dalam tab Simbologi di kotak dialog Layer Properties dan memilih Edit Deskripsi. Daftar classDescription perlu memiliki jumlah elemen yang sama dan disusun dalam urutan yang sama dengan properti classValues.
Kode menggunakan kursor pencarian untuk membaca tabel pencarian ke dalam daftar , dan kemudian menulis daftar itu ke properti classDescription dari kelas simbologi layer. Perhatikan bahwa tabel pencarian HARUS memiliki jumlah baris yang sama dan berada dalam urutan yang sama dengan nilai klasifikasi simbologi yang unik . Kode saya perlu ditingkatkan ke akun yang tidak menjadi kasus tetapi memastikan pesanan itu secara manual mudah dalam kasus pengujian saya.
Saya mengumpulkan beberapa kode uji untuk melihat apakah ini akan berhasil dan meskipun tidak ada kesalahan yang dihasilkan, deskripsi yang diperbarui tidak membuatnya kembali ke lapisan. Saya baru mengenal arcpy dalam pemetaan sehingga mungkin sesuatu yang saya lakukan salah.
Michael Stimson
Apakah itu bekerja? Saya mendapatkan hal yang sama kecuali saya menggunakan MapDocument ("saat ini") dan RefreshActiveView () / RefreshTOC () tetapi tidak ada yang diperbarui.
Michael Stimson
1
@ MichaelMiles-Stimson Ya - ini diperbarui sebagaimana dimaksud - Saya menduga bahwa yang Anda lewatkan adalah bukan TOC yang menunjukkan nilai Deskripsi tetapi Elemen Tata Letak Legenda. Masukkan salah satu dari mereka dan pilih Gaya Item Legenda yang menampilkan Deskripsi dan saya pikir akan menjadi jelas bahwa itu berfungsi.
PolyGeo
@Polygeo terima kasih! Tepat seperti itu! Itu melakukan itu selama ini saya hanya melihat di tempat yang salah.
Michael Stimson
Saya memecahkan masalah karena harus membuat deskripsi dan kode pencarian cocok, lihat jawaban saya.
matt wilkie
1
Bisakah Anda mengklasifikasikan simbol Anda dengan "Nilai Unik Banyak Bidang" dan memilih satu bidang untuk kode dan yang kedua untuk deskripsi yang lebih panjang? Itu harus memberi label setiap item dengan string dalam bentuk "[Field1], [Field2]"
Ini bekerja dengan bidang yang lebih kecil, saya membayangkan akan dengan string yang lebih panjang, kecuali ada batasan yang saya tidak kenal.
Satu-satunya bagian yang mengganggu adalah bahwa Anda mungkin harus melalui dan menghapus nilai kode dari awal nilai label, tetapi itu tidak akan menjadi hal terburuk yang pernah terjadi.
Gagasan menarik yang mungkin berhasil dalam beberapa situasi. Ini tidak akan bekerja di sini karena tabel deskripsi hanya sebuah tabel, tidak ada geometri. Seseorang dapat bergabung dengan geometri dan deskripsi, tetapi saya tidak tertarik dengan pekerjaan tambahan atau kinerja yang baik untuk proyek ini.
matt wilkie
1
Bekerja dari kode PolyGeo , inilah yang saya temukan untuk mengatasi masalah harus memiliki jumlah item yang tepat dan kecocokan urutan identik antara nilai pencarian dan deskripsi. Script yang berfungsi penuh ada di sini .
# name and path of the lookup table
lookup_table = r"..\default.gdb\vegMajorComm_Lookup"# change these to match the relevant field names in the lookup table
code ='VegCode'
description ='Description'##...snip...# build the descriptions dictionary
descriptions ={}
rows = arcpy.SearchCursor(lookup_table)for item in rows:#print item.getValue(code), item.getValue(description)
descriptions[item.getValue(code)]= item.getValue(description)# lyr.symbology requires the classValues and classDescriptions to have# same number of rows and be in same order. So extract only matching # elements from the description dictionary
desclist =[]if lyr.symbologyType =="UNIQUE_VALUES":#extract matchesfor symbol in lyr.symbology.classValues:
desclist.append(descriptions[symbol])# assign the descriptions
lyr.symbology.classDescriptions = desclist
mxd.saveACopy(output_map)del mxd
Bisakah Anda mengklasifikasikan simbol Anda dengan "Nilai Unik Banyak Bidang" dan memilih satu bidang untuk kode dan yang kedua untuk deskripsi yang lebih panjang? Itu harus memberi label setiap item dengan string dalam bentuk "[Field1], [Field2]"
Ini bekerja dengan bidang yang lebih kecil, saya membayangkan akan dengan string yang lebih panjang, kecuali ada batasan yang saya tidak kenal.
Satu-satunya bagian yang mengganggu adalah bahwa Anda mungkin harus melalui dan menghapus nilai kode dari awal nilai label, tetapi itu tidak akan menjadi hal terburuk yang pernah terjadi.
sumber
Bekerja dari kode PolyGeo , inilah yang saya temukan untuk mengatasi masalah harus memiliki jumlah item yang tepat dan kecocokan urutan identik antara nilai pencarian dan deskripsi. Script yang berfungsi penuh ada di sini .
sumber