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シェルからのものであり、トレースバックを提供しません。トレースバックを使用した結果は、コマンドシェルからコピーされます。
マットウィルキー

1
ワークスペースだけでなく、フィーチャデータセットの内外にデータを移動していますか?
geographika

@geographika:はい、FDSはワークスペースと同様に変化しています。FDSを指定せず、mxdとlyrはそれらを無視するというドキュメントに惑わされました。一方、検証はそれらを無視しませんし、少なくとも完全ではありません(私の答えを見てください)。
マットウィルキー

回答:


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が存在する場合、異なるフィーチャデータセット内であっても、検証がtrueかfalseかに関係なく、新しいデータソースパスはそれに応じて適応されます。

更新:Githubで、共有と改訂が容易になりました。


これは、.lyrソースshpファイルを新しいファイルに置き換えたいときに機能しますか?ValueError:Layer:Unexpected errorが発生します。
GeorgeC

@GeorgeC-私はこれが古い投稿であることを知っていますが、誰かが検索エンジンでこれを見つけた場合、このエラーの解決策はデータセット名から.shpを削除する可能性があります。IOW replaceDataSourceへの第三引数は、「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

検証がデフォルトでtrueに設定されていることを最初は知らなかっただけでなく、バグ、または少なくともいくつかの非常に奇妙な動作により、トラブルシューティングが困難になりました。更新とarcpy.mappingでデータソースを固定は言うDOは、ワークスペースパスにフィーチャデータセットの名前が含まれていません。フィーチャデータセットはワークスペースの一部です。たとえば、フィーチャクラスをスタンドアロンフィーチャクラスからフィーチャデータセットに移動した場合レイヤーが破損することなくマップドキュメントが開かれます」および「マップドキュメントまたはレイヤーファイル内のレイヤーまたはテーブルフィーチャデータセットに移動したり、フィーチャデータセットから移動したりしても、リンクが壊れてはいけません。」

これは、validateの角度がわずかに異なることが判明しています。はい、新しいジオデータベース(ワークスペース)のどこにターゲットフィーチャクラスが存在するか、トップレベル、または完全に異なるフィーチャデータセットのどこでもかまいませんただし、ターゲットワークスペースには同じ名前のフィーチャデータセットが含まれている必要があります。そうでない場合、検証は失敗します

ArccatalogおよびArcmapで表示される壊れた「修正済み」レイヤー

ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.