使用ArcPy以编程方式检测Join?


10

我有一些从ArcMap项目中启动的Python代码。用户可能已经在项目中创建的所有联接都必须删除,以便我的代码运行。不幸的是,删除联接的代码…arcpy.RemoveJoin_management(“ layer1”,“ layer2”)…也破坏了一些对我的应用程序至关重要的图层属性(突出显示的字段,只读字段等)。

如果通过右键单击ArcMap中的图层并选择“删除连接”来删除连接,则图层属性将保持不变。

如果我可以从代码中检测到联接,则只需退出代码并显示一条消息,用户必须在尝试运行代码之前手动删除其联接。因此...可以通过编程方式检测到联接吗?


我对如何通过arcpy执行RemoveJoin引起问题有些迷惑。如何破坏只读字段?此外,在ArcMap中使用“删除联接”工具是否会导致相同的问题?
纳撒努斯2011年

解决这个问题的另一种方法是使您的python代码对连接不敏感?
Dan S.

@ Nathanus-ArcMap中的手动删除连接不会破坏图层属性,GP工具会破坏。这是ESRI帮助的相关引文:“由于这些工具执行实际的幕后联接处理的方式与“联接数据”对话框略有不同,因此,如果该对话框上的联接功能遇到任何意外问题,请使用这些工具。 ”
BrianPeasley 2011年

@ Dan S.-我在代码中使用了插入光标等。我不知道如何使我的代码对联接不敏感。
BrianPeasley 2011年

1
好吧,值得一问。;)forums.esri.com/Thread.asp?c=93&f=1729&t=293173似乎暗示您可以通过在表名前添加列名来更新连接表中的值。也许它也可以跨插入工作吗?
Dan S.

Answers:


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

这看起来很有希望!我不明白它在做什么:“如果f.name.find(lyr.datasetName)> -1:”,但是我将在几天后尝试并报告(我要下雪了在并失去力量!)...谢谢!
BrianPeasley 2011年

乐意效劳。查看python字符串的内置find方法: docs.python.org/library/string.html以及arcpy字段对象的文档: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Field /…我想说一下这段代码中的数据,看看它是否有效。
Derek Swingley 2011年

1
我最终使用了一个与此功能非常相似的功能,并且效果非常好……对于文档中的每一层,我都会遍历字段列表并使用Python确定字段名称中是否存在“点”。
BrianPeasley 2011年

1

我想您会发现,使用GP对象无法做到这一点,您需要使用ArcObjects和comtypes。这是ESRI论坛上有关使用标准GP工具/对象检查连接困难的一些讨论:https : //geonet.esri.com/thread/20317


ArcObjects和comtypes不会成为该项目的解决方案,它们对我来说是陌生的,该项目将于昨天到期。感谢您将我指向该论坛主题!我将尝试此处提出的想法:“ ...检查是否有任何fieldname.split(“。)都会导致2个部分,其中第一个部分是Join表!”
BrianPeasley
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.