ArcPyを使用してプログラムでJoinを検出していますか?


10

ArcMapプロジェクト内から起動されるPythonコードがいくつかあります。ユーザーがプロジェクトで作成した可能性のある結合は、コードを実行するために削除する必要があります。残念ながら、結合を削除するコード…arcpy.RemoveJoin_management( "layer1"、 "layer2")…は、アプリケーションに重要ないくつかのレイヤープロパティ(強調表示されたフィールド、読み取り専用フィールドなど)も壊します。

ArcMapでレイヤーを右クリックし、[結合の削除]を選択して結合を削除した場合、レイヤーのプロパティはそのまま残ります。

コード内から結合が存在することを検出できる場合は、コードを終了し、ユーザーがコードを実行する前に手動で結合を削除する必要があるというメッセージを表示します。では、プログラムで結合を検出できますか?


Arcpyを介してRemoveJoinを実行すると問題が発生するので、少し迷っています。読み取り専用フィールドを台無しにするのはどうですか?また、ArcMapで[結合の削除]ツールを使用しても同じ問題が発生しますか?
Nathanus

多分これに取り組む別の方法は、あなたのpythonコードを結合に鈍感にすることでしょうか?
Dan S.

@ Nathanus-ArcMapで手動で[結合を削除]を実行しても、レイヤープロパティが破損しませんが、GPツールでは破損します。ESRIヘルプの関連する引用は次のとおりです。「これらのツールは、実際の舞台裏の結合処理を[データの結合]ダイアログボックスとは少し異なる方法で実行するため、そのダイアログボックスの結合機能で予期しない問題が発生した場合は、ツールを使用してください。 」
BrianPeasley

@ Dan S.-私はコードで挿入カーソルなどを使用しています。私は自分のコードを結合の影響を受けないようにする方法を知りません。
BrianPeasley 2011年

1
まあ、それは尋ねる価値があった。;)forums.esri.com/Thread.asp?c=93&f=1729&t=293173は、列名の前にテーブル名を付けることで、結合されたテーブルの値を更新できる可能性があることを示しているようです。多分それは挿入全体でも機能しますか?
ダンS.

回答:


8

残念ですが、arcpy.Layerクラスに hasJoinプロパティがありません。ただし、フィールド名を見れば結合をテストできると思います。次に、ファイルジオデータベースのデータの簡単な概念実証を示します。

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

これは有望に見えます!「if f.name.find(lyr.datasetName)> -1:」の意味がわかりませんが、数日後に試して報告します(雪が降りそうですパワーを失う!)...ありがとう!
BrianPeasley '25年

お役に立ててうれしいです。python文字列の組み込みのfindメソッドを確認してください: docs.python.org/library/string.htmlとarcpyフィールドオブジェクトのドキュメント: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/フィールド/…私はこのコードにあなたのデータを試してみて、それが機能するかどうかを確認します。
Derek Swingley、2011年

1
私はこれと非常によく似た関数を使用してしまい、それはうまく機能します...ドキュメントの各レイヤーについて、フィールドリストをループし、Pythonを使用してフィールド名に「ドット」があるかどうかを判断します。
BrianPeasley 2011年

1

GPオブジェクトでこれを行う完全な方法はないことがわかると思います。ArcObjectsとcomtypeを使用する必要があります。ここでは、標準のGPツール/オブジェクトとの結合を確認する際の困難さについて、ESRIフォーラムからのディスカッションをいくつか紹介します。https//geonet.esri.com/thread/20317


ArcObjectsとcomtypesは、このプロジェクトのソリューションにはなりません。それらは私にとっては外部のものであり、このプロジェクトは昨日締め切ります。フォーラムのスレッドを教えてくれてありがとう!そこで提示されたアイデアを試してみましょう。「... fieldname.split( "。)のいずれかが2つの部分になり、最初の部分が結合テーブルになるかどうかを確認してください!」
BrianPeasley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.