ArcPy kullanarak * .lyr dosyalarındaki özellik veri kümesini içeren veri kaynağı yolunu değiştirme?


11

Arcpy kullanarak X klasöründeki her katman dosyası için kaynak veri yollarını nasıl değiştirebilirim?

Ben en iyi ben arcpy.mapping ile veri kaynaklarını Güncelleme ve sabitleme izledim , ama tüm aldığım yararsız Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errorya da eksik olan sorunları gidermek için yeterli söylemez yararsızdır .

Heres kodu (tek katmanlı bir dosyayı test etmek için basitleştirilmiş):

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

ve sonuçlar:

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

(('güncelleme' bölümünü bir cevaba taşıdı))


Runtime error...Bir Traceback vermez ArcCatalog'da interaktif piton kabuk gelen yukarıda alıntılanan. Geri izlemeli sonuçlar bir komut kabuğundan kopyalanır.
matt wilkie

1
Verileri bir özellik veri kümesinin yanı sıra bir çalışma alanına mı taşıyorsunuz?
geographika

@ geographika: evet FDS çalışma alanı kadar değişiyor. Ben diyor belgelere tarafından yanıltılmış yok FDS belirtin ve o MXD en ve en onları görmezden Iy. Doğrulama ise onları görmezden gelmiyor ya da en azından tam olarak değil (cevabımı gör).
matt wilkie

Yanıtlar:


7

Çalışma alanlarını değiştirirken kullanılacak doğru yönteme benziyor VE özellik veri kümeleri lyr.replaceDataSource () şeklindedir . İşte benim çalışma senaryom:

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

Testte , bu yöntemde doğrulamanın tekrar farklı olduğu görülüyor : yeni çalışma alanının geçerli olduğunu doğrular, ancak özellik sınıfını ve özellik veri kümelerini yok sayar - yani, hedef FC orada değilse hata döndürmez.

Diğer taraftan, hedef FC mevcutsa, farklı bir özellik veri kümesinin içinde bile, yeni veri kaynağı yolu, validatın doğru veya yanlış olmasına bakılmaksızın buna göre uyarlanır.

Güncelleme: artık daha kolay paylaşım ve revizyon için Github'da .


Bu .lyr source shp dosyasını yenisiyle değiştirmek istediğimde işe yarıyor mu? ValueError: Katman: Beklenmeyen bir hata alıyorum.
GeorgeC

@GeorgeC - Bu eski bir yazı olduğunu biliyorum, ancak herkes bunu arama motoru aracılığıyla bulursa, bu hatanın çözümü .shp veri kümesi adından düşmesi muhtemeldir. IOW veri kaynağı değiştirmek için üçüncü arg "newfile.shp" değil "newfile" olması gerekir
perrygeo

6

unexpected errorBu durumda yararsız olan "yeni yol yok" gibi bir anlama gelir . İsteğe bağlı validateparametre belirtilmezse varsayılan olarak True'dur. False ile, komut dosyası hatasız olarak tamamlanır, ancak hedef yol ve özellik sınıfı mevcut olsa bile, sonuçta elde edilen katman dosyaları hala kırılmıştır.

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

sonuç

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

Başlangıçta validate varsayılanı true değerinin bilinmemesine ek olarak , bir hata veya en azından bazı ilginç davranışlar sorun gidermeyi zorlaştırdı. Veri kaynaklarını arcpy.mapping ile güncelleme ve düzeltme , çalışma alanı yoluna özellik veri kümelerinin adlarını eklemeyin diyor . Özellik veri kümeleri, çalışma alanının bir parçasıdır. Örneğin, bir özellik sınıfı tek başına bir özellik sınıfı olmaktan bir özellik veri kümesine taşınırsa, bir harita belgesi katman kırılmadan yine de açılır " ve " Bir harita belgesi veya katman dosyasındaki bir katman veya tablo ise özellik veri kümesinin içine veya dışına taşınırsa, bağlantıları koparılmamalıdır. "

Doğrulamanın bu konuda biraz farklı bir açıya sahip olduğu ortaya çıktı . Evet, yeni coğrafi veritabanında (çalışma alanında) hedef özellik sınıfının en üst düzeyde veya tamamen farklı bir özellik veri kümesinde nerede olduğu önemli değildir . Ancak, hedef çalışma alanı aynı ada sahip bir özellik veri kümesi içermelidir veya doğrulama başarısız olur .

Arccatalog ve Arcmap'de göründükleri gibi kırık ve "sabit" katmanlar

Kaynaklar :

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.