กำลังตรวจจับเข้าร่วมโดยใช้โปรแกรมโดยใช้ ArcPy?


10

ฉันมีรหัส Python ที่เปิดตัวจากภายในโครงการ ArcMap การรวมใด ๆ ที่ผู้ใช้อาจสร้างขึ้นในโครงการจะต้องถูกลบออกเพื่อให้รหัสของฉันทำงาน น่าเสียดายที่รหัสที่ลบการเข้าร่วม… arcpy.RemoveJoin_management ("layer1", "layer2") ... ยังแบ่งคุณสมบัติเลเยอร์บางส่วนที่สำคัญต่อแอปพลิเคชันของฉัน (ฟิลด์ที่เน้นฟิลด์แบบอ่านอย่างเดียวและอื่น ๆ )

หากการรวมถูกลบออกโดยการคลิกขวาที่เลเยอร์ใน ArcMap และเลือก“ ลบการรวม” คุณสมบัติของเลเยอร์จะไม่เปลี่ยนแปลง

หากฉันสามารถตรวจพบว่ามีการเข้าร่วมอยู่ภายในรหัสของฉันฉันจะออกจากรหัสและแสดงข้อความที่ผู้ใช้จะต้องลบการรวมของพวกเขาด้วยตนเองก่อนที่จะพยายามเรียกใช้รหัส ดังนั้น ... สามารถตรวจพบการเข้าร่วมโดยทางโปรแกรมได้หรือไม่


ฉันหลงทางเล็กน้อยเกี่ยวกับวิธีการใช้ RemoveJoin ผ่าน arcpy ทำให้เกิดปัญหา มันจะทำลายสนามแบบอ่านอย่างเดียวได้อย่างไร นอกจากนี้การใช้เครื่องมือ Remove Join ใน ArcMap ทำให้เกิดปัญหาเดียวกันหรือไม่
นาธานุส

บางทีวิธีอื่นในการแก้ไขปัญหานี้ก็คือการทำให้รหัสไพ ธ อนของคุณไม่มีความรู้สึกต่อการเข้าร่วม?
Dan S.

@ Nathanus - คู่มือลบเข้าร่วมใน ArcMap ไม่ทำลายคุณสมบัติเลเยอร์ของฉันเครื่องมือ GP ทำ นี่คือคำพูดที่เกี่ยวข้องจากความช่วยเหลือของ ESRI: "เนื่องจากเครื่องมือเหล่านี้ดำเนินการเข้าร่วมการประมวลผลที่เกิดขึ้นจริงเบื้องหลังแตกต่างจากกล่องโต้ตอบเข้าร่วมข้อมูลเล็กน้อยให้ใช้เครื่องมือหากคุณพบปัญหาที่ไม่คาดคิดกับฟังก์ชันการเข้าร่วมในกล่องโต้ตอบนั้น "
BrianPeasley

@ Dan S. - ฉันใช้เคอร์เซอร์แทรกและในรหัสของฉัน ฉันไม่รู้ว่าจะทำยังไงให้โค้ดของฉันไม่ไวต่อการเข้าร่วม
BrianPeasley

1
มันก็คุ้มค่าที่จะถาม ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173ดูเหมือนจะบอกเป็นนัยว่าคุณอาจสามารถอัปเดตค่าในตารางที่เข้าร่วมโดยใช้คำนำหน้าชื่อคอลัมน์ตามชื่อตารางอย่างไรก็ตาม บางทีมันอาจจะทำงานข้ามส่วนแทรกได้เช่นกัน?
Dan S.

คำตอบ:


8

เสียดายที่มีไม่คุณสมบัติ hasJoin ในระดับ arcpy.Layer ฉันคิดว่าคุณสามารถทดสอบการเข้าร่วมได้โดยดูที่ชื่อฟิลด์ ต่อไปนี้เป็นข้อพิสูจน์แนวคิดที่เรียบง่ายสำหรับข้อมูลในฐานข้อมูลไฟล์:

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

มันดูมีแนวโน้ม! ฉันไม่เข้าใจเนื้อของสิ่งที่กำลังทำ: "ถ้า f.name.find (lyr.datasetName)> -1:" แต่ฉันจะลองใหม่ในสองสามวันและรายงานกลับมา (ฉันกำลังจะได้รับหิมะ ใน & เสียพลัง!) ... ขอบคุณ!
BrianPeasley

ดีใจที่ได้ช่วยเหลือ ลองใช้วิธีการค้นหาแบบสตริงบิวด์ : docs.python.org/library/string.html บิวด์อินและ doc สำหรับวัตถุฟิลด์arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Field / …ฉันว่าให้ใช้โค้ดนี้กับข้อมูลของคุณและดูว่ามันใช้งานได้หรือไม่
Derek Swingley

1
ฉันลงเอยด้วยการใช้ฟังก์ชั่นที่คล้ายกับอันนี้มากและใช้งานได้ดี ... สำหรับแต่ละเลเยอร์ในเอกสารของฉันฉันวนลูปผ่านรายการฟิลด์และใช้ Python เพื่อตรวจสอบว่ามี "จุด" ในชื่อฟิลด์หรือไม่
BrianPeasley

1

ฉันคิดว่าคุณจะพบว่าไม่มีวิธีกันกระสุนในการทำเช่นนี้กับวัตถุ GP คุณจะต้องใช้ ArcObjects และ comtypes นี่คือการสนทนาบางส่วนจากฟอรัม ESRI เกี่ยวกับปัญหาในการตรวจสอบการเข้าร่วมกับเครื่องมือ / วัตถุ GP มาตรฐาน: https://geonet.esri.com/thread/20317


ArcObjects และ comtypes จะไม่เป็นทางออกสำหรับโครงการนี้พวกเขาต่างกับฉันและโครงการนี้จะครบกำหนดเมื่อวานนี้ ขอบคุณที่ชี้นำฉันไปที่กระทู้ในฟอรัม! ฉันจะลองนำเสนอความคิดที่นั่น: "... ตรวจสอบว่า fieldname.split (" ใด ๆ ) จะส่งผลใน 2 ส่วนซึ่งแรกจะเป็นตารางเข้าร่วม! "
BrianPeasley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.