Estoy tratando de combinar ListDataframes, ListLayers y ListFields en un código ArcPy.
Puedo hacerlo uno por uno (primero listar las capas en un código, y luego listar los campos en el segundo código), pero estoy tratando de hacerlo en un solo código. Así que, básicamente, quiero listar todos los marcos de datos, las capas, todas las capas con su proyección y obtener información de campo en esas capas (nombre de campo, tipo de campo). Código por código no es un problema, pero la combinación de dos códigos es.
Hasta ahora, tengo un trozo de código, pero no obtengo los resultados que quiero. Obtengo el nombre y el tipo de campo, pero no los nombres de las capas ni los marcos de datos. Sé que también tengo que incluir la herramienta Describe para la referencia espacial, pero no estoy seguro de dónde. Este es mi código hasta ahora. Funciona, pero no como se esperaba.
import arcpy
mxd = arcpy.mapping.MapDocument(r"CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrList = arcpy.mapping.ListLayers(mxd, "", df)
for lyr in lyrList:
if lyr.supports("dataSource"):
for field in arcpy.ListFields(lyr.dataSource):
print (field.type, field.name, field.aliasName)
for lyr in arcpy.mapping.ListLayers(mxd, df):
name = lyr.name
print name
del mxd
Como ya he dicho, este es el resultado de un trozo de mi código, y consigo esto:
00_BASE
SUBGROUP
shore_polygon
shore_polyline
sea
En esta lista, me gustaría tener este aspecto:
00_BASE (This is layer name)
SUBGROUP (This is subgroup name)
shore_polygon (FID, Shape, ID) (ObjectID, Shape, Long)
shore_polyline (FID, Shape, ID) (ObjectID, Shape, Short)
sea (FID, Shape, Name) (ObjectID, Shape, Text)
EDIT 1: Este código funciona para imprimir el nombre de la capa, el nombre del campo y el tipo de campo. Todavía no se puede imprimir los nombres de las capas de grupo y subgrupo.
import arcpy
mxd = arcpy.mapping.MapDocument(r"CURRENT")
df = arcpy.mapping.ListDataFrames(mxd, "Main Map")
lyrList = arcpy.mapping.ListLayers(mxd, "", df)
for lyr in lyrList:
if lyr.supports("dataSource"):
for field in arcpy.ListFields(lyr.dataSource):
print (lyr.name, field.name, field.type)
del mxd
Y el resultado es así:
(u'shore_polygon', u'FID', u'OID')
(u'shore_polygon', u'Shape', u'Geometry')
(u'shore_polygon', u'Id', u'Integer')
(u'shore_polyline', u'FID', u'OID')
Todavía quiero que los nombres de las capas de los grupos y subgrupos tengan este aspecto:
GROUP LAYER NAME
SUBGROUP NAME
(u'shore_polygon', u'FID', u'OID')
(u'shore_polygon', u'Shape', u'Geometry')
(u'shore_polygon', u'Id', u'Integer')
(u'shore_polyline', u'FID', u'OID')