Reparieren von Datenquellen in mehreren MXDs mit ArcPy?

14

Ich habe ungefähr 50 mxd mit allen defekten Schichten, die ich durchgemacht und manuell zurückgesetzt habe.

Die Daten wurden von einem anderen Computer verschoben und die Ordnerstruktur wurde geändert, sodass es sich nicht nur um einen einfachen Änderungsvorgang handelt (Beispiel):

"F: \ Data \ Rivers.shp" bis "C: \ Data \ Rivers.shp"

es ist eher wie:

"F: \ Data \ Rivers.shp" bis C: \ Data \ Park \ Water \ Rivers.shp

und so weiter für alle Arten von Daten (Grenzen, Gemüsebeet, Straßen usw.), jeweils in einem eigenen Unterordner.

Ich möchte ein Skript erstellen, das ich wiederholt ausführen kann, wenn ich eine dieser MxDs öffne, mit dem zumindest einige der häufigeren Ebenen repariert werden, die in den meisten meiner MxDs zu finden sind. Den Rest kann ich dann manuell reparieren. So kann ich mir wenigstens etwas Zeit sparen .

Ich benutze etwas in der Art von:

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Die Idee wäre dann, auf irgendeine Weise mehrere "Ersetzen" -Skripte für andere allgemeine Ebenen hinzuzufügen, die sich in meinen MXDs befinden.

Das obige Skript repariert jedoch nicht einmal die Rivers-Ebene.

Wie kann ich es zum Laufen bringen und auch andere zu reparierende Ebenen hinzufügen, die andere Dateipfade haben?

Chaz
quelle

Antworten:

14

Sie sind mit Ihrem Skript auf dem richtigen Weg. Es sieht so aus, als ob Ihr Problem darin besteht, wie Sie das LayerObjekt mit dem Namen von Layerim Inhaltsverzeichnis vergleichen .

Wenn Sie die ListLayers- Funktion verwenden, wird ein LayerObjekt zurückgegeben. Sie können dies dann nicht mit einem vergleichen, text stringum festzustellen, ob sie gleich sind. Sie müssen stattdessen auf den Namen von zugreifen Layer.

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Um weitere Selektoren hinzuzufügen, erweitern Sie einfach den if/thenTeil des Codes, um nach verschiedenen Ebenennamen zu suchen.

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
    elif lyr.name.lower() == "streets":
        lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")

Ändern Sie den nameSelektor einfach weiter, um einen bestimmten Layer in Ihrem zu finden .mxd, und fügen Sie eine entsprechende replaceDataSourceFunktion hinzu. Bitte beachten Sie, dass ich die lowerFunktion beim Testen auf den Namen verwendet habe. Dies wird auch von ESRI in den Hilfedokumenten verwendet. Dies beseitigt wahrscheinlich die Möglichkeit von Inkonsistenzen bei der Groß- und Kleinschreibung und führt zu einer Nichtübereinstimmung im Ebenennamen.

Hier finden Sie den ESRI- Hilfeartikel zum Aktualisieren und Korrigieren von Datenquellen mit Arcpy Mapping

Die Hilfedateien für ArcGIS sind im Allgemeinen sehr nützlich, da sie klare Erklärungen und viele Python-Codebeispiele enthalten, die Sie einfach kopieren / einfügen und an Ihre speziellen Anforderungen anpassen können.

Holen Sie sich Spatial
quelle