Mengatur deskripsi simbol legenda tata letak ArcMap dari tabel?


Jawaban:


7

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.

import arcpy

vegDescList = []
vegCodes = arcpy.SearchCursor(r"C:\temp\test.gdb\LookupTable")
for vegCode in vegCodes:
    vegDescList.append(vegCode.Description)

mxd = arcpy.mapping.MapDocument(r"C:\temp\test.mxd")
lyr = arcpy.mapping.ListLayers(mxd,"testFC")[0]
if lyr.symbologyType == "UNIQUE_VALUES":
    lyr.symbology.classDescriptions = vegDescList
mxd.save()

del mxd

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 matches
    for symbol in lyr.symbology.classValues:
      desclist.append(descriptions[symbol])    

    # assign the descriptions
    lyr.symbology.classDescriptions = desclist

mxd.saveACopy(output_map)
del mxd
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.