Mengubah gaya label (font, warna, ukuran, dll.) Menggunakan ArcPy?

9

Saya mencoba untuk menulis makro python untuk ArcGIS 10.2 yang akan mengotomatiskan proses pelabelan poin dalam lapisan berdasarkan berbagai jenis apartemen. Misalnya, satu gaya apartemen akan memiliki kotak biru dengan teks tebal putih sebagai satu label; yang lain akan memiliki kotak merah muda dengan teks tebal hitam; yang lain akan memiliki kotak merah dengan teks tebal putih, dll.

Ekspresi atau fungsi apa yang akan Anda gunakan di arcpy untuk mengubah gaya label ini?

Saat ini, skrip memberi label apartemen dengan kode peta dan mengubah namanya di TOC menjadi apartemen, sebagaimana mestinya.

masukkan deskripsi gambar di sini

Sekarang saya ingin mengubah font, grafik, dan ukuran label agar terlihat membuat label unik untuk masing-masing, dan kemudian membuat tombol untuk menekan dan hanya mengotomatiskan proses kapan saja kita harus melakukan salah satu dari lapisan ini.

Apakah ada cara font, label, dan grafik dapat diubah dengan menggunakan skrip Python (ArcPy, IDLE, dll.)?


Saya memutuskan untuk mengedit posting ini untuk memberikan deskripsi akhir tentang apa yang akan saya lakukan di sini sehingga tidak ada kebingungan. Pada dasarnya, titik-titik pada peta akan berubah dari seperti gambar di atas menjadi ini:

masukkan deskripsi gambar di sini


Saya telah mencoba menggunakan lblClass.expressionfungsinya, namun kode yang saya coba gunakan tidak berfungsi. Saya pikir itu mungkin langkah ke arah yang benar. Di bawah ini adalah beberapa kode yang saya coba gunakan hanya untuk mendapatkan labelClass.expression untuk mengubah font label.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Tyler Spears
sumber

Jawaban:

7

API arcpy.mapping hanya menyediakan akses ke sejumlah properti layer yang dapat dimodifikasi secara langsung tetapi semua properti yang ditemukan di kotak dialog Layer Properties dapat dimodifikasi menggunakan fungsi UpdateLayer. Informasi ini diekstraksi dari lapisan sumber dan diterapkan ke lapisan dalam dokumen peta yang perlu diperbarui. Source_layer dapat berupa file layer (.lyr) atau layer dalam dokumen peta. UpdateLayer adalah fungsi yang kuat karena dapat digunakan dalam beberapa cara berbeda untuk menghasilkan hasil yang berbeda.

Anda perlu membuat simbologi / label seperti yang Anda inginkan, dan menyimpannya ke file layer. Kemudian muat file lapisan itu menggunakan arcpy.mapping.UpdateLayer () .

Jika beberapa orang perlu menjalankan add-in python, maka Anda perlu membuat file layer dapat diakses oleh semua orang, seperti drive jaringan publik.


Saya akhirnya membuat kotak peralatan Pembaruan Properti Lapisan kustom . Ini memungkinkan Anda untuk memilih layer di ArcMap TOC, dan kemudian memilih file layer input. Kemudian memperbarui layer dengan semua properti di dalam file layer, dan kembali sumber ke kelas fitur asli. Ini akan bekerja dengan data yang ada di gdb, mdb, shp, atau sde.

Lihat Kode Sumber

Tolong beri tahu saya jika Anda memiliki pertanyaan.

masukkan deskripsi gambar di sini

ianbroad
sumber
Saya membuat file layer terpisah dari layer data berbasis poin lain dengan semua yang telah diatur (simbologi dan label), dijalankan, tetapi semua yang tampaknya dilakukan adalah sepenuhnya mengganti file apartemen yang tidak berlabel dan tidak ditandai (mana yang saya pilih untuk ditambahkan) dengan file apartemen sourceLayer. Saya berasumsi ini karena False di bagian "perbarui simbologi saja". Apakah ada cara agar ini dapat dieksekusi sehingga hanya akan menerapkan simbologi dan label tetapi tidak memindahkan poin ke lokasi yang berbeda?
Tyler Spears
Fungsi apa yang akan saya cari untuk melakukan itu? Saya tidak terlalu terbiasa dengan re-sourcing. Saya menghargai bantuan Anda sejauh ini.
Tyler Spears
Saya mencoba menyesuaikan ini agar sesuai dengan kode saya. Ini berfungsi melalui fungsi UpdateLayer, tetapi pada baris 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]ia mengeluarkan kesalahan yang mengatakan bahwa indeks berada di luar jangkauan.
Tyler Spears
Itu berarti bahwa arcpy.mapping.ListLayersmetode ini tidak menemukan lapisan dalam mxd saat ini dengan nama yang sama dengan Anda input_layer_file(indeks [0]pengembalian indeks di luar jangkauan berarti tidak ada item dalam daftar).
XIY
Saya lakukan, dan saya merasa ini sangat dekat, tetapi masalahnya adalah, setelah bagian UpdateLayer selesai, ia melempar kesalahan berikut: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears
6

Pilihan lain adalah mengatur ekspresi label kustom pada layer (mengubah ukuran dan warna..etc) menggunakan python:

misalnya

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Membangun ekspresi label

Mereka dapat diatur melalui:

LabelClass (arcpy.mapping)

EDIT:

Coba ini:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Anda dapat menghapus pernyataan baris Anda yang lain (untuk loop, labClass, dan panggilan ke fungsi). Juga, fungsi tersebut perlu disebut FindLabel.

artwork21
sumber
Saya mencoba memanfaatkan sesuatu yang mirip dengan fungsi seperti ini. Saya membuat definisi yang dipanggil def getLabel (Code, Type)dan kemudian setelah menyiapkan pernyataan if-else untuk kode peta berbeda yang saya gunakan, saya kemudian mengatur 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', yang baru saja mengembalikan kesalahan TypeError: unsupported operand type(s) for &: 'str' and 'str'pada dasarnya saya mengikuti contoh situs web Esri. Jika saya dapat membuktikan bahwa saya dapat mengubah font, saya kemudian dapat melanjutkan untuk menyesuaikan aspek yang lebih sulit (seperti bentuk, latar belakang dan warna label).
Tyler Spears
@ Tyler Spears, Coba hapus tanda kutip ganda di sekitar nama bidang.
artwork21
Ketika saya melakukan itu, dikatakan bahwa parameter tidak ditentukan.
Tyler Spears
@ Tyler Spears, Bisakah Anda memposting kode Anda dalam pertanyaan Anda? Anda memiliki kutipan tunggal di luar tanda kurung fungsi.
artwork21
Tentu saja, saya telah memperbarui pertanyaan saya untuk menunjukkan kode saya.
Tyler Spears