Mengubah jalur sumber data yang melibatkan dataset fitur dalam file * .lyr menggunakan ArcPy?

11

Bagaimana cara mengubah jalur data sumber untuk setiap file lapisan di folder X menggunakan arcpy?

Saya telah mengikuti Memperbarui dan memperbaiki sumber data dengan arcpy.mapping sebaik mungkin, namun yang saya dapatkan adalah tidak membantu Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected erroryang tidak cukup memberi tahu saya untuk memecahkan masalah apa yang salah atau hilang.

Inilah kode (disederhanakan untuk menguji satu file lapisan):

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

dan hasilnya:

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

((memindahkan 'perbarui' bagian ke dalam jawaban))

matt wilkie
sumber
yang Runtime error...dikutip di atas adalah dari shell python interaktif di Arccatalog, yang tidak memberikan traceback. Hasil dengan traceback disalin dari shell perintah.
matt wilkie
1
Apakah Anda memindahkan data masuk atau keluar dari dataset fitur serta ruang kerja?
geografi
@geographika: ya FDS berubah serta ruang kerja. Saya disesatkan oleh dokumentasi yang mengatakan tidak menentukan FDS, dan mxd dan lyr mengabaikannya. Validasi di sisi lain tidak mengabaikannya, atau setidaknya tidak sepenuhnya (lihat jawaban saya).
matt wilkie

Jawaban:

7

Sepertinya metode yang benar untuk digunakan ketika berpindah ruang kerja DAN kumpulan fitur fitur adalah lyr.replaceDataSource () . Ini skrip kerja saya:

''' 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

Dalam pengujian tampaknya memvalidasi dalam metode ini berbeda lagi: itu memverifikasi ruang kerja baru valid, tetapi mengabaikan kelas fitur dan kumpulan data fitur - yang berarti itu tidak akan mengembalikan kesalahan jika target FC tidak ada.

Di sisi lain jika target FC hadir, bahkan di dalam dataset fitur yang berbeda, jalur sumber data baru disesuaikan sesuai terlepas dari apakah validasi benar atau salah.

Perbarui: sekarang di Github untuk memudahkan berbagi dan revisi.

matt wilkie
sumber
Apakah ini berfungsi ketika saya ingin mengganti file .lyr sumber shp dengan yang baru? Saya mendapatkan ValueError: Layer: Kesalahan tidak terduga.
GeorgeC
@ GeorgeC - Saya tahu ini adalah posting lama tetapi kalau-kalau ada yang menemukan ini melalui mesin pencari, solusi untuk kesalahan ini cenderung untuk menjatuhkan .shp dari nama dataset. TKI argumen ketiga untuk mengganti DataSource harus "newfile" bukan "
newfile.shp
6

Tidak membantu unexpected errordalam hal ini berarti sesuatu seperti "jalur baru tidak ada" . validateParameter opsional default ke True jika tidak ditentukan. Dengan false, skrip selesai tanpa kesalahan tetapi file layer yang dihasilkan masih rusak meskipun jalur tujuan dan kelas fitur ada.

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

hasil

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

Selain awalnya tidak mengetahui validasi default ke true, bug, atau setidaknya beberapa perilaku yang sangat aneh membuat pemecahan masalah ini menjadi sulit. Memperbarui dan memperbaiki sumber data dengan arcpy.mapping mengatakan Jangan sertakan nama dataset fitur dalam jalur ruang kerja. Kumpulan data fitur adalah bagian dari ruang kerja. Jika kelas fitur, misalnya, dipindahkan dari kelas fitur yang berdiri sendiri ke dalam dataset fitur, dokumen peta akan tetap terbuka tanpa lapisannya pecah " , dan " Jika lapisan atau tabel dalam dokumen peta atau file lapisan dipindahkan ke dalam atau keluar dari dataset fitur, tautannya tidak boleh rusak. "

Ternyata memvalidasi memiliki sudut pandang yang sedikit berbeda. Ya itu tidak masalah di mana di geodatabase baru (ruang kerja) kelas fitur target berada , di tingkat atas atau dalam dataset fitur yang sama sekali berbeda. Namun ruang kerja target harus berisi dataset fitur dengan nama yang sama atau validasi gagal .

Lapisan yang rusak dan "tetap", seperti terlihat di Arccatalog dan Arcmap

Sumber :

matt wilkie
sumber