ArcpyのreplaceDataSourceエラー


8

ここで他の回答を確認しましたが、どれもうまくいきませんでした...

これは、マップ内の名前でレイヤーを検索し、そのデータソースを変更するという「単純な」問題です。

これが私のスクリプトです:

    #-- New Source
    newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

    #-- Validation
    if arcpy.Exists(newSource):
        print "The new source exists!"
    else:
        print "Not found!"

    #-- Find the layer and change its source            
    for lyr in arcpy.mapping.ListLayers(mxd):
        if lyr.name == lyrZones:
            print "Layer found!"
            print layers.dataSource
            print "  Replacing source..."
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource)
            print lyr.dataSource

ArcGISの外部のPythonスクリプトから実行します。

ここに画像の説明を入力してください

ソースが存在し、レイヤーが見つかり、印刷することでそのデータソースにアクセスできることがわかりますが、lyr.replaceDataSourceがエラーを引き起こします(予期しないエラー...あまり役に立ちません...)

私は現在4〜5時間作業しており、試すためのソリューションが不足しています。何がクラッシュの原因になるのでしょうか?


1
一見すると、ディレクトリパスに奇妙な文字が含まれているようです。シェープファイルをのようなテストディレクトリに移動してみて、D:\test機能するかどうかを確認します。
Mintx

以前は問題がありませんでした。文字は「#」であり、古いソートトリックにすぎないため、私のプロジェクトが最初に表示されます。プロジェクトをD:/ TEMPに入れようとしましたが、うまく
いき

回答:


4

私はこれがかなり古いことを知っていますが、私はこの同じ問題に遭遇しただけで、そこに解決策がないことに驚きました。解決策はとても簡単ですが、ESRIの実質的に存在しないヘルプに基づいてそれを知る方法はありません。

シェープファイル拡張を含めないでください。...それでおしまい。

newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

読む必要があります:

newSource = os.path.join(currDir, '{}_Dep{}'.format(lyrZones, dirNum))

1
質問と回答はシェープファイルに関係しています。ただし、エンタープライズジオデータベース(別名SDE)のフィーチャクラスで同様の問題が発生しました。arcpy.Existsには完全修飾名が必要です。ただし、完全修飾名を使用する場合、layer.replaceDataSourceは失敗しますが、機能名のみを使用し、データベースと所有者名を省略した場合は機能します。
dvdhns 2015

1

デバッグが楽しい!これを試して:

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == lyrZones:
        if lyr.supports("DATASOURCE"):
            print lyr.dataSource
            print currDir
            print newSource
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource, TRUE)
            print "Did we crash yet?"
            print lyr.dataSource
        else:
            print "Layer isn't supported!"

少なくとも私はデータソースがサポートされていることを知っています。同じエラーメッセージが表示されました。「lyr.replaceDataSource(currDir、 "SHAPEFILE_WORKSPACE"、newSource、True)」でクラッシュしました。「まだクラッシュしましたか?」に到達しませんでした。イライラする...
fgcartographix

ああ、それは最低だ。あなたが達成しようとしている最終目標は何ですか?これについては別の方法があるかもしれません。
Mintx

私には5つのテンプレートがあり、それぞれ14〜50個のマップを作成します(合計128個のマップ)。それぞれに更新する2つのレイヤーがあります。最初はDefだけです。上司のように処理したクエリ;)(lyr.definitionQuery = defQueryLines)。もう1つは、段階的なカラーシンボルを持つポリゴンレイヤーですが、ファイルを変更する必要があります。各マップの出力を作成するスクリプトを作成し、ソースを更新してシンボル値を変更する必要があります(ただし、これは10.1だと思います
。10.0を使用してい

今のところ、ファイルを手動で更新します(最初のバッチには20個のマップがあるため、それほど面倒ではありません)が、次のバッチには50個のマップがあるので...
fgcartographix

ツールは.lyrファイルを処理する必要がありますか?多分私は変更できる.lyrで直接作業できますが、データソースです。シンボルvalye(フィールドはシンボル化されていますが...)を変更するためのプロパティがありません
fgcartographix

1

これが役立つかどうかはわかりませんが、レイヤーのSDEデータソースを切り替えようとしたときにこのエラーが発生しました。PyScripterから実行すると、64ビットのpython.exeプロセスがスプールされることがわかりました。ValueErrorが発生します。コマンドプロンプトから32ビットのpython.exeを使用してスクリプトを強制的に実行した場合、エラーは発生しません。それがあなたの問題に役立つかどうかはわかりませんが、試してみる価値はあります!


ありがとう。すべて32ビットなので問題にはなりませんが、64ビットのジオプロセシングを試すときは、このことを覚えておきます。
とりあえず

1

これに関するほとんどの情報はここにあります。しかし、これを解決するために、ArcCatalog内のpythonウィンドウに移動して、.replaceDataSource関数の各パラメーターのESRI定義を確認しました。

.replaceDataSource(workspace、workspace_type、dataset_name)

ワークスペース=新しいデータソースのワークスペース

workspace_type =リンクされたヘルプのreplace datasourceセクションにリストされている実際のワークスペースタイプ。

dataset_name =目次のデータセット名ではなく、ファイルタイプのないファイル名(IE:.shp)。その前のディレクトリも必要ありません。

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