3 votos

Tratando de orígenes de datos de lista en MGDS

He escrito una herramienta que se pide al usuario una ruta de directorio, y, opcionalmente, una sola mxd. Luego se arrastra el directorio para el mxds (o solo el uno) y escribe algunas de las propiedades de las capas en cada mxd a un archivo csv. La mayoría de esto funciona bien, excepto que ninguna de las fuentes de datos que se enumeran. He visto la pregunta aquí, pero no puede ver donde la mina que está mal. El resto de propiedades se escriben muy bien. Gracias por la ayuda.

Editar: Modificado el interior de bucle un poco, sólo para ver lo que había encontrado. La línea:

arcpy.AddMessage('\ndataSource is: {0}'.format(lyr.dataSource))

no mostrar el origen de datos de todas las capas. Corrí en un conjunto más grande de mxds, con sde archivos shapefiles, archivo gdb clases de entidad, los servicios web y las conexiones a los servidores, tales como DÓLARES y nuestro propio servidor. Las únicas fuentes de datos que se imprimió a la csv fueron para los archivos de imagen en los servidores. Las conexiones de estos están en ArcCatalog, que es donde estoy ejecutando la herramienta de. Si eso ayuda.

import arcpy, os, fnmatch, csv

mxddirectory = arcpy.GetParameterAsText(0)
mxd_single = arcpy.GetParameterAsText(1)
outputcsvlocation = arcpy.GetParameterAsText(2)

mxd_list = []

if len(mxd_single) > 0:
    mxd_list.append(mxd_single)
else:
    for dirpath in os.walk(mxddirectory):
        for filename in dirpath[2]:
            if fnmatch.fnmatch(filename, '*.mxd'):
                mxd_list.append(os.path.join(dirpath[0], filename))

if len(mxd_list) > 0:
    outputcsv = open(outputcsvlocation, 'wb')
    writer = csv.writer(outputcsv, dialect = 'excel')

    writer.writerow(['Mxd path', 'Layer Name', 'Layer Description', 'Layer Source'])

    for mxdpath in mxd_list:
        mxdname = os.path.split(mxdpath)[1]

        try:
            mxd = arcpy.mapping.MapDocument(mxdpath)

            dfList = arcpy.mapping.ListDataFrames(mxd)

            for df in dfList:
            for lyr in arcpy.mapping.ListLayers(mxd, '', df):
                if lyr.supports('dataSource'):
                    arcpy.AddMessage('\ndataSource is: {0}'.format(lyr.dataSource))
                    layerattributes = [mxdpath.encode('utf8'), lyr.longName.encode('utf8'), lyr.description.encode('utf8'), lyr.dataSource.encode('utf8')]
                    writer.writerow(layerattributes)
                else:
                    arcpy.AddMessage('\nLayer {0} does not support dataSource.'.format(lyr.longName))

        except Exception as e:
            arcpy.AddMessage('EXCEPTION: {0}\n{1}\n{2}\n'.format(mxdpath, lyr.longName, e))

        writer.writerow(['', '', '', ''])

        del mxd

    outputcsv.close()

else:
    arcpy.AddError('No ArcMap documents found')

1voto

Andrew Shepherd Puntos 339

He descubierto el error. De hecho, el dataSource se estaba escribiendo en el csv. Pero en la mayoría de los casos, la propiedad de descripción, aunque soportada, no tenía ningún valor. En lugar de imprimir un espacio vacío, un valor nulo o una excepción, el escritor simplemente ponía el dataSource en la columna Descripción de la capa. No me di cuenta de que el csvwriter tenía este comportamiento.

0voto

John Kramlich Puntos 286

Acabo de probar tu script sustituyendo los parámetros por los siguientes:

mxddirectory = ""
mxd_single = r"C:\Scratch\mydoc.mxd"
outputcsvlocation = r"C:\scratch\aaa.csv"

El código se ejecutó sin errores y generó la salida esperada. Así que esto me lleva a preguntar ¿son los MXD's que está buscando las fuentes de datos MXD's con enlaces rotos? Me imagino que eso no devolverá nada para las fuentes de datos.

0 votos

No, no hay enlaces rotos. Identifica correctamente los tipos de datos no admitidos, como la anotación. El campo lyr.description parece tener la ruta de la fuente de datos, pero ¿por qué no hay dataSource?

0voto

Farid Cher Puntos 5306

Puede tener caracteres unicode en los nombres de las capas o en las descripciones de las mismas.

Así que reemplaza esta línea:

layerattributes = [mxdpath, lyr.longName, lyr.description, lyr.dataSource]

con

layerattributes = [mxdpath.encode('utf8'), lyr.longName.encode('utf8'), lyr.description.encode('utf8'), lyr.dataSource.encode('utf8')]

0 votos

No, buena idea, pero no hay diferencia en la salida.

0 votos

¿Qué error obtiene?

0 votos

No hay error. Simplemente no escribe la fuente de datos.

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