การเปลี่ยนเส้นทางแหล่งข้อมูลที่เกี่ยวข้องกับชุดคุณสมบัติในไฟล์ * .lyr โดยใช้ ArcPy?


11

หนึ่งจะสามารถเปลี่ยนเส้นทางข้อมูลแหล่งที่มาสำหรับทุกไฟล์เลเยอร์ในโฟลเดอร์ X โดยใช้ arcpy ได้อย่างไร

ฉันติดตามการอัปเดตและแก้ไขแหล่งข้อมูลด้วย arcpy.mappingให้ดีที่สุดเท่าที่จะทำได้ แต่สิ่งที่ฉันได้รับคือไม่ช่วยเหลือRuntime error <type 'exceptions.ValueError'>: Layer: Unexpected errorซึ่งไม่ได้บอกฉันเพียงพอที่จะแก้ไขสิ่งที่ผิดหรือขาดหายไป

นี่คือรหัส (ง่ายต่อการทดสอบไฟล์เลเยอร์เดียว):

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

และผลลัพธ์:

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

((ย้ายส่วน 'อัปเดต' ไปยังคำตอบ))


ที่Runtime error...อ้างถึงข้างต้นมาจากเปลือกหลามแบบโต้ตอบใน Arccatalog ซึ่งไม่ได้ให้การสืบค้นกลับ ผลลัพธ์ที่มีการติดตามย้อนกลับถูกคัดลอกจากเชลล์คำสั่ง
matt wilkie

1
คุณกำลังย้ายข้อมูลเข้าหรือออกจากชุดข้อมูลคุณสมบัติเช่นเดียวกับพื้นที่ทำงานหรือไม่?
geographika

@geographika: ใช่ FDS มีการเปลี่ยนแปลงเช่นเดียวกับพื้นที่ทำงาน ฉันถูกเข้าใจผิดโดยเอกสารที่ระบุว่าไม่ได้ระบุ FDS และ mxd และ lyr ไม่สนใจพวกเขา ตรวจสอบในอีกทางหนึ่งไม่ได้ละเว้นพวกเขาหรืออย่างน้อยก็ไม่สมบูรณ์ (ดูคำตอบของฉัน)
matt wilkie

คำตอบ:


7

ดูเหมือนว่าวิธีการที่ถูกต้องที่จะใช้เมื่อพื้นที่ทำงานและเปลี่ยนชุดข้อมูลคุณลักษณะlyr.replaceDataSource () นี่คือสคริปต์ทำงานของฉัน:

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

ในการทดสอบดูเหมือนว่าการตรวจสอบในวิธีนี้จะแตกต่างกันอีกครั้ง: ตรวจสอบพื้นที่ทำงานใหม่ที่ถูกต้อง แต่ไม่สนใจคลาสคุณลักษณะและชุดข้อมูลคุณลักษณะ - หมายความว่าจะไม่ส่งคืนข้อผิดพลาดหากเป้าหมาย FC ไม่อยู่ที่นั่น

ในทางตรงกันข้ามถ้าเป้าหมาย FC มีอยู่แม้ในชุดข้อมูลคุณลักษณะที่แตกต่างกันเส้นทางแหล่งข้อมูลใหม่จะถูกปรับตามลำดับโดยไม่คำนึงว่าการตรวจสอบความถูกต้องเป็นจริงหรือเท็จ

อัปเดต: ตอนนี้บน Githubเพื่ออนุญาตให้แชร์และแก้ไขได้ง่ายขึ้น


ใช้งานได้เมื่อฉันต้องการแทนที่. shr ไฟล์ shp ด้วยไฟล์ใหม่หรือไม่? ฉันได้รับ ValueError: เลเยอร์: ข้อผิดพลาดที่ไม่คาดคิด
GeorgeC

@ GeorgeC - ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ในกรณีที่ทุกคนพบสิ่งนี้ผ่านเครื่องมือค้นหาการแก้ไขข้อผิดพลาดนี้มีแนวโน้มที่จะลดลง. shp จากชื่อชุดข้อมูล ฉันหาเรื่องที่สามเพื่อแทนที่ DataSource จะต้องเป็น "newfile" ไม่ใช่ "newfile.shp"
perrygeo

6

ช่วยเหลือunexpected errorในกรณีนี้หมายถึงสิ่งที่ต้องการ"เส้นทางใหม่ไม่มี" validateพารามิเตอร์ทางเลือกดีฟอลต์เป็น True หากไม่ได้ระบุไว้ ด้วย false สคริปต์จะดำเนินการให้เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด แต่ไฟล์เลเยอร์ที่ได้จะยังคงใช้งานไม่ได้แม้ว่าจะมีเส้นทางปลายทางและคลาสคุณลักษณะอยู่ก็ตาม

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

ผลลัพธ์

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

นอกจากนี้ในตอนแรกไม่ทราบว่าการตรวจสอบเริ่มต้นเป็นจริงข้อผิดพลาดหรืออย่างน้อยพฤติกรรมที่แปลกประหลาดมากทำให้การแก้ไขปัญหานี้ยาก การอัปเดตและแก้ไขแหล่งข้อมูลด้วย arcpy.mappingพูดว่าอย่ารวมชื่อของชุดข้อมูลคุณลักษณะในเส้นทางพื้นที่ทำงาน ชุดข้อมูลคุณสมบัติเป็นส่วนหนึ่งของพื้นที่ทำงาน ถ้าคลาสคุณลักษณะถูกย้ายจากการเป็นคลาสคุณลักษณะแบบสแตนด์อะโลนไปยังชุดข้อมูลคุณลักษณะเอกสารแผนที่จะยังคงเปิดอยู่โดยไม่มีเลเยอร์ที่ขาด "และ" ถ้าเลเยอร์หรือตารางภายในเอกสารแผนที่หรือไฟล์เลเยอร์ ถูกย้ายเข้าหรือออกจากชุดข้อมูลคุณสมบัติลิงก์ของพวกเขาไม่ควรขาด "

ปรากฎว่าการตรวจสอบมีมุมแตกต่างกันเล็กน้อยในเรื่องนี้ ใช่มันไม่สำคัญว่าจะอยู่ที่ไหนในฐานข้อมูลภูมิศาสตร์ (เวิร์กสเปซ) คลาสคุณลักษณะเป้าหมายนั้นอยู่ที่ระดับบนสุดหรือในชุดข้อมูลคุณสมบัติที่แตกต่างอย่างสิ้นเชิง อย่างไรก็ตามพื้นที่ทำงานเป้าหมายจะต้องมีชุดคุณลักษณะที่มีชื่อเดียวกันหรือตรวจสอบล้มเหลว

เลเยอร์ที่เสียหายและ "คงที่" เนื่องจากมองใน Arccatalog และ Arcmap

แหล่งข้อมูล :

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.