¿Detectando Join programáticamente usando ArcPy?

10

Tengo un código Python que se inicia desde un proyecto de ArcMap. Cualquier combinación que el usuario haya creado en el proyecto debe eliminarse para que se ejecute mi código. Desafortunadamente, el código que elimina una unión ... arcpy.RemoveJoin_management ("layer1", "layer2") ... también rompe algunas de las propiedades de capa que son críticas para mi aplicación (campos resaltados, campos de solo lectura, etc.).

Si las uniones se eliminan haciendo clic con el botón derecho en la capa en ArcMap y eligiendo "Eliminar uniones", las propiedades de la capa quedan intactas.

Si puedo detectar que existe una unión desde mi código, simplemente saldré del código y mostraré un mensaje que el usuario debe eliminar manualmente sus uniones antes de intentar ejecutar el código. Entonces ... ¿Se puede detectar un Join mediante programación?

BrianPeasley
fuente
Estoy un poco perdido sobre cómo hacer que RemoveJoin a través de arcpy causa problemas. ¿Cómo va a arruinar un campo de solo lectura? Además, ¿el uso de la herramienta Eliminar unión en ArcMap causa los mismos problemas?
Nathanus
¿Quizás otra forma de abordar esto sería hacer que su código de Python sea insensible a las uniones?
Dan S.
@ Nathanus: el manual Quitar unión en ArcMap no rompe las propiedades de mi capa, la herramienta GP sí. Aquí hay una cita relevante de la Ayuda de ESRI: "Como estas herramientas realizan el procesamiento de unión real detrás de escena de manera ligeramente diferente al cuadro de diálogo Unir datos, use las herramientas si encuentra algún problema inesperado con la funcionalidad de unión en ese cuadro de diálogo. "
BrianPeasley
@ Dan S. - Estoy usando cursores de inserción y tal en mi código. No tengo idea de cómo haría para que mi código sea insensible a las uniones.
BrianPeasley
1
bueno, valió la pena preguntar. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 parece implicar que puede actualizar los valores en una tabla unida al prefijar los nombres de columna por el nombre de la tabla; tal vez también funcionaría en un inserto?
Dan S.

Respuestas:

8

Lástima que no haya una propiedad hasJoin en la clase arcpy.Layer . Sin embargo, creo que puedes probar una unión mirando los nombres de los campos. Aquí hay una prueba de concepto simple para los datos en una geodatabase de archivos:

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
Derek Swingley
fuente
¡Esto parece prometedor! No entiendo la esencia de lo que está haciendo: "if f.name.find (lyr.datasetName)> -1:" pero lo intentaré en unos días e informaré (estoy a punto de nevar adentro y pierde poder!) ... Gracias!
BrianPeasley
Encantado de ayudar. Consulte el método de búsqueda integrado para las cadenas de Python: docs.python.org/library/string.html y también el documento para los objetos de campo arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Campo / ... Yo diría que intente este código con sus datos y vea si funciona.
Derek Swingley
1
Terminé usando una función muy similar a esta y funciona muy bien ... Para cada capa en mi documento, recorro la lista de campos y uso Python para determinar si hay un "punto" en el nombre del campo.
BrianPeasley
1

Creo que descubrirá que no hay una forma a prueba de balas para hacer esto con los objetos GP, deberá usar ArcObjects y comtypes. Aquí hay una discusión de los foros de ESRI sobre las dificultades para verificar las uniones con las herramientas / objetos GP estándar: https://geonet.esri.com/thread/20317

blah238
fuente
ArcObjects y comtypes no van a ser la solución para este proyecto, son extraños para mí y este proyecto se vence ayer. ¡Gracias por señalarme a ese hilo del foro! Voy a probar la idea presentada allí: "... compruebe si alguno de los fieldname.split (".)
Daría como