Mendeteksi Gabung secara terprogram menggunakan ArcPy?

10

Saya memiliki beberapa kode Python yang diluncurkan dari dalam proyek ArcMap. Setiap gabungan yang mungkin dibuat pengguna dalam proyek harus dihapus agar kode saya dapat berjalan. Sayangnya, kode yang menghapus join… arcpy.RemoveJoin_management ("layer1", "layer2") ... juga memecah beberapa properti layer yang sangat penting untuk aplikasi saya (bidang yang disorot, bidang yang hanya dapat dibaca, dll).

Jika bergabung dihapus dengan mengklik kanan layer di ArcMap dan memilih "Hapus Bergabung" properti layer dibiarkan utuh.

Jika saya dapat mendeteksi adanya gabungan dari dalam kode saya, saya hanya akan keluar dari kode dan menampilkan pesan bahwa pengguna harus secara manual menghapus gabungan mereka sebelum mencoba menjalankan kode. Jadi ... Bisakah Bergabung terdeteksi secara program?

BrianPeasley
sumber
Saya agak bingung bagaimana melakukan RemoveJoin via arcpy menyebabkan masalah. Bagaimana cara merusak bidang baca-saja? Juga, apakah menggunakan alat Hapus Gabung di ArcMap menyebabkan masalah yang sama?
Nathanus
Mungkin cara lain untuk mengatasi ini adalah dengan membuat kode python Anda tidak sensitif untuk bergabung?
Dan S.
@ Nathanus - Panduan Hapus Gabung di ArcMap tidak merusak properti layer saya, alat GP tidak. Berikut ini adalah kutipan yang relevan dari Bantuan ESRI: "Karena alat ini melakukan pemrosesan gabung di belakang layar yang sebenarnya sedikit berbeda dari kotak dialog Gabung Data, gunakan alat jika Anda menemukan masalah yang tidak terduga dengan fungsi gabung pada kotak dialog itu. "
BrianPeasley
@ Dan S. - Saya menggunakan kursor insert dan semacamnya dalam kode saya. Saya tidak tahu bagaimana cara membuat kode saya tidak sensitif untuk bergabung.
BrianPeasley
1
baik, itu pantas ditanyakan. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 tampaknya menyiratkan bahwa Anda mungkin dapat memperbarui nilai dalam tabel gabungan dengan mengawali nama kolom dengan nama tabel, meskipun; mungkin itu akan berhasil di insert juga?
Dan S.

Jawaban:

8

Sayang sekali tidak ada properti hasJoin di kelas arcpy.Layer . Saya pikir Anda dapat menguji untuk bergabung dengan melihat nama bidang. Berikut bukti konsep sederhana untuk data dalam file geodatabase:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName
Derek Swingley
sumber
Ini terlihat menjanjikan! Saya tidak mengerti apa yang dilakukannya: "jika f.name.find (lyr.datasetName)> -1:" tetapi saya akan mencobanya dalam beberapa hari dan melaporkan kembali (saya akan turun salju dalam & kehilangan daya!) ... Terima kasih!
BrianPeasley
Senang untuk membantu. Lihatlah metode find in built untuk string python: docs.python.org/library/string.html dan juga doc untuk objek bidang arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Bidang / ... Saya katakan memberi kode ini suntikan dengan data Anda dan lihat apakah itu berfungsi.
Derek Swingley
1
Saya akhirnya menggunakan fungsi yang sangat mirip dengan ini dan itu berfungsi dengan baik ... Untuk setiap lapisan dalam dokumen saya, saya loop melalui daftar bidang dan menggunakan Python untuk menentukan apakah ada "titik" dalam nama bidang.
BrianPeasley
1

Saya pikir Anda akan menemukan bahwa tidak ada cara antipeluru untuk melakukan ini dengan objek GP, Anda harus menggunakan ArcObjects dan comtypes. Berikut ini beberapa diskusi dari forum ESRI tentang kesulitan dalam memeriksa bergabung dengan alat / objek GP standar: https://geonet.esri.com/thread/20317

blah238
sumber
ArcObjects dan comtypes tidak akan menjadi solusi untuk proyek ini, mereka asing bagi saya dan proyek ini jatuh tempo kemarin. Terima kasih telah mengarahkan saya ke utas forum itu! Saya akan mencoba ide yang disajikan di sana: "... periksa apakah ada fieldname.split (".) Akan menghasilkan 2 bagian di mana yang pertama adalah tabel Join! "
BrianPeasley