19 votos

¿Lista de clases de características con dominios activos?

Tengo una geodatabase de archivos Esri con dominios de atributos definido. Necesito eliminar algunos de los dominios de atributos pero no puedo porque "El dominio es utilizado por una regla de atributo". . ¿Cómo puedo saber qué clase o clases de características utilizan los dominios?

Executing: DeleteDomain R:\v5\YT_Canvec.gdb Permanency
Start Time: Thu May 19 11:01:02 2011
ERROR 999999: Error executing function.
The domain is used by an attribute rule.
Failed to execute (DeleteDomain).
Failed at Thu May 19 11:01:02 2011 (Elapsed Time: 0.00 seconds)

Hay más de cien clases de características en la geodatabase, por lo que consultar interactivamente las propiedades de los campos FC de cada una de ellas no es tarea fácil. La gdb es demasiado grande para convertirla en una gdb personal y entrar por la puerta de atrás con ms-access (un método dudoso de todos modos).


(2011-May-26): Otra forma de expresarlo es "¿qué Feature Class utiliza el dominio X?".

3voto

Justin Puntos 1169

Para responder a la pregunta de manejar clases de características con subtipos, es posible con arcpy (10.1+).

arcpy.env.workspace = your_gdb

for FC in arcpy.ListFeatureClasses():
    for stcode, stdict in list(arcpy.da.ListSubtypes(FC).items()):
        for stkey in list(stdict.keys()):
            if stkey == 'FieldValues':
                for field, fieldvals in list(stdict[stkey].items()):
                    if fieldvals[1] is not None:
                        print(
                            "{},{},{},{}".format(FC,
                                                 'None' if stcode == 0 else stdict['Name'],
                                                 field,
                                                 fieldvals[1].name))

El código de subtipo, stcode, será cero si no hay subtipos, por lo que el código imprime "Ninguno".

En diccionario de subtipos tiene algo más, así que inspecciónalo en código.

0voto

Greg Puntos 1756

Esri: PREGUNTAS FRECUENTES: ¿Cómo puedo encontrar todos los lugares en los que se hace referencia a dominios en mi geodatabase? . " Funciones de Python que pueden listar las propiedades de estas estructuras en una geodatabase. Entre las propiedades se encuentran los dominios referenciados. Se proporciona un script de ejemplo y un archivo de geodatabase que demuestran cómo se pueden utilizar las funciones de Python para listar los dominios y otras propiedades de las clases y tablas de características. Los dominios pueden asociarse a campos de una clase de característica o tabla; además, pueden establecerse para campos categorizados por un subtipo."

Los resultados son ruidosos para esta pregunta, que va más allá de los dominios en uso, pero es una plataforma más amplia para empezar.

Executing: ParseDomainReferences [...]

fc at root level: Pt1
  fld OBJECTID
  fld SHAPE
  fld Field_Text, domain [Pets]
  fld Field_Long
  fld Field_Short, domain [Counts]
  fld Field_Double, domain [Ratios]
[...]
Subtype Code: 1
subCode: ('Default', False)
subCode: ('Name', u'One')
subCode: ('SubtypeField', u'Field_Long')
FieldValues
fldName: Field_Double, default: [no default], domain: Ratios
fldName: OBJECTID, default: [no default], domain: [no domain]
fldName: Field_Long, default: [no default], domain: [no domain]
fldName: Field_Short, default: 1, domain: Counts
fldName: SHAPE, default: [no default], domain: [no domain]
fldName: Field_Text, default: N, domain: [no domain]
[...etc]

Extracto del código, editado en aras de la brevedad:

def ParseFieldList (fc, fcPath):
...
      for fld in fldList:
        if fld.domain != None:
          if fld.domain != "":
...
        arcpy.AddMessage ("  fld " + fld.name + s)

      # get subtype list
      subDict = arcpy.da.ListSubtypes (fcPath)
      if len (subDict) > 0:
        for stCode in subDict.iteritems():
...
          valkey, vallist = stCode
          arcpy.AddMessage ("Subtype Code: {0}".format(valkey))
          i = 0
          for subCode in vallist.iteritems():
            i += 1
            if i < 4:
              arcpy.AddMessage ("subCode: {0}".format(subCode))
            else:
              fldkey, fldlist = subCode
              arcpy.AddMessage (fldkey)
              for fld in fldlist.iteritems():
...
                if dom != None:
                  s2 = dom.name
                arcpy.AddMessage ("fldName: " + fldName + ", default: " + s1 + ", domain: " + s2)
...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X