使用ArcPy更改* .lyr文件中涉及要素数据集的数据源路径?


11

如何使用arcpy更改文件夹X中每个图层文件的源数据路径?

我已尽可能地使用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中的交互式Python外壳,这并没有给回溯。带回溯的结果是从命令外壳复制的。
马特·威尔基2011年

1
您要将数据移入或移出要素数据集以及工作空间吗?
geographika'3

@geographika:是的,FDS和工作空间都在变化。我被它说的文档误导指定FDS,而MXD的和LYR的忽略它们。另一方面,验证不会忽略它们,或者至少不会完全忽略它们(请参阅我的答案)。
马特·威尔基2011年

Answers:


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,即使在其他要素数据集中,也将相应地适应新的数据源路径,而不管validate是true还是false。

更新:现在在Github上,可以更轻松地共享和修订。


当我想用新文件替换.lyr源shp文件时,这行得通吗?我收到ValueError:图层:意外错误。
GeorgeC

@GeorgeC-我知道这是一个旧帖子,但是如果有人通过搜索引擎找到了此帖子,则针对此错误的解决方案很可能会从数据集名称中删除.shp。IOW的第三个参数replaceDataSource必须是“ newfile”而不是“ newfile.shp”
perrygeo 2014年

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

除了最初不知道validate默认为true外,还存在一个错误或至少一些非常古怪的行为,这使排除故障变得很困难。使用arcpy.mapping更新和修复数据源不要在工作空间路径中包括要素数据集的名称。要素数据集是工作空间的一部分。例如,如果要素类从独立的要素类移入要素数据集,则地图文档仍将打开而不会破坏图层”“如果地图文档或图层文件中的图层或表移入或移出要素数据集,它们的链接不应断开。”

事实证明,validate对此有一个稍微不同的角度。是的,目标要素类位于顶层,完全不同的要素数据集中在新的地理数据库(工作区)中并不重要但是,目标工作空间必须包含具有相同名称的要素数据集,否则验证失败

在Arccatalog和Arcmap中看起来像是断层和“固定”层

资料来源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.