3 votos

ArcPy - Lista de capas y lista de campos en un solo código

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')

4voto

nitinsavant Puntos 6
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"):  
        fields = arcpy.ListFields(lyr.dataSource)
        print("{} {}, {}".format(lyr.name, [f.name for f in fields], [f.type for f in fields]))
    else: print(lyr.name)

enter image description here

Resultado de la estructura de las capas de la muestra en la imagen

group
subgroup
layer1 [u'OBJECTID_12', u'Shape', u'Shape_Length', u'Shape_Area'], [u'OID', u'Geometry', u'Double', u'Double']
layer2 [u'OBJECTID_12', u'Shape', u'Shape_Leng', u'F_NAME', u'Shape_Length'], [u'OID', u'Geometry', u'Double', u'String', u'Double']

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