Mehr

Auflisten von Datenquellen in MXDs mit ArcPy?

Auflisten von Datenquellen in MXDs mit ArcPy?


Ich habe ein Tool geschrieben, das den Benutzer zur Eingabe eines Verzeichnispfads und optional eines einzelnen mxd auffordert. Es durchsucht dann das Verzeichnis für mxds (oder nur das einzelne) und schreibt einige der Eigenschaften der Layer in jedem mxd in eine csv-Datei. Das meiste davon funktioniert einwandfrei, außer dass keine der Datenquellen aufgelistet ist.

Ich habe Crawling-Verzeichnis und Auflistung aller Datenquellen mit ArcPy gesehen? kann aber nicht sehen wo ich falsch liege. Die anderen Eigenschaften sind gut geschrieben.


Die innere for-Schleife wurde etwas modifiziert, um zu sehen, was gefunden wurde. Die Linie:

arcpy.AddMessage('
dataSource ist: {0}'.format(lyr.dataSource))

zeigt die Datenquelle aller unterstützten Layer an. Habe es auf einem größeren Satz von mxds ausgeführt, mit SDE-Dateien, Shapefiles, Datei-GDB-Feature-Classes, Webservices und Verbindungen zu Servern wie USDS und unserem eigenen Server. Die einzigen Datenquellen, die in die CSV-Datei gedruckt wurden, waren Bilddateien auf den Servern. Die Verbindungen zu diesen befinden sich in ArcCatalog, von wo aus ich das Tool ausführe.

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_ 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, dialekt = 'excel')writer.writerow(['Mxd-Pfad', 'Layer Name', ' Layer Description', 'Layer Source']) für mxdpath in mxd_list: mxdname = os.path.split(mxdpath)[1] try: mxd = arcpy.mapping.MapDocument(mxdpath) dfList = arcpy.mapping.ListDataFrames(mxd) für df in dfList: für lyr in arcpy.mapping.ListLayers(mxd,", df): if lyr.supports('dataSource'): arcpy.AddMessage('
dataSource 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('
Layer {0} unterstützt dataSource nicht.'.format(lyr.longName)) außer Ausnahme wie e: arcpy .AddMessage('AUSNAHME: {0}
{1}
{2}
'.format(mxdpath, lyr.longName, e))writer.writerow([",",","]) del mxd outputcsv.close() else: arcpy.AddError('Keine ArcMap-Dokumente gefunden')

Ich habe den Fehler herausgefunden. Die dataSource wurde tatsächlich in die CSV-Datei geschrieben. In den meisten Fällen hatte die Beschreibungseigenschaft jedoch keinen Wert, obwohl sie unterstützt wurde. Anstatt ein Leerzeichen, einen Nullwert oder eine Ausnahme zu drucken, fügt der Writer einfach die dataSource in die Spalte Layer Description ein. Ich wusste nicht, dass der csvwriter dieses Verhalten hat.


Ich habe gerade Ihr Skript getestet und die Parameter durch Folgendes ersetzt:

mxddirectory = "" mxd_single = r"C:Scratchmydoc.mxd" outputcsvlocation = r"C:scratchaaa.csv"

Der Code wurde ohne Fehler ausgeführt und die erwartete Ausgabe generiert. Dies führt mich zu der Frage, sind die MXDs, die Sie nach Datenquellen durchsuchen, MXDs mit defekten Links? Ich könnte mir vorstellen, dass für die Datenquellen nichts zurückgeben würde?


Möglicherweise enthalten Ihre Ebenennamen oder Ebenenbeschreibungen Unicode-Zeichen.

Ersetzen Sie also diese Zeile:

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

mit

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

Schau das Video: ArcGIS - Morfometria - Configuração HEC-GeoHMS parte 1