Arcpy's replaceDataSource-Fehler


8

Ich habe die anderen Antworten hier überprüft und keine der Antworten hat für mich funktioniert ...

Es ist eine "einfache" Angelegenheit, einen Layer anhand seines Namens in einer Karte zu finden und seine Datenquelle zu ändern.

Hier ist mein Skript:

    #-- New Source
    newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

    #-- Validation
    if arcpy.Exists(newSource):
        print "The new source exists!"
    else:
        print "Not found!"

    #-- Find the layer and change its source            
    for lyr in arcpy.mapping.ListLayers(mxd):
        if lyr.name == lyrZones:
            print "Layer found!"
            print layers.dataSource
            print "  Replacing source..."
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource)
            print lyr.dataSource

Ich führe es über ein Python-Skript außerhalb von ArcGIS aus.

Geben Sie hier die Bildbeschreibung ein

Sie können sehen, dass die Quelle vorhanden ist, die Ebene gefunden wurde, ich kann durch Drucken auf die Datenquelle zugreifen, aber die lyr.replaceDataSource verursacht einen Fehler (Unerwarteter Fehler ... hilft nicht viel ...)

Ich arbeite jetzt seit 4-5 Stunden daran und es fehlen mir die Lösungen, um es zu versuchen. Irgendeine Idee, was den Absturz verursachen kann?


1
Auf den ersten Blick sieht es so aus, als hätten Sie einige seltsame Zeichen in Ihrem Verzeichnispfad. Versuchen Sie, das Shapefile in ein Testverzeichnis wie zu verschieben, D:\testund prüfen Sie, ob dies funktioniert.
Mintx

Hatte noch nie ein Problem damit. Das Zeichen ist "#" und es ist nur ein alter Sortiertrick, sodass meine Projekte zuerst angezeigt werden. Ich habe versucht, mein Projekt in D: / TEMP zu setzen, aber es hat nicht funktioniert ...
fgcartographix

Antworten:


4

Ich weiß, dass dies ziemlich alt ist, aber ich bin gerade auf dasselbe Problem gestoßen und war überrascht über den Mangel an Lösungen da draußen. Die Lösung ist so einfach, aber Sie hätten keine Möglichkeit, sie anhand der praktisch nicht vorhandenen Hilfe von ESRI zu ermitteln:

Schließen Sie die Shapefile-Erweiterung nicht ein. ...Das ist es.

newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

Sollte lesen:

newSource = os.path.join(currDir, '{}_Dep{}'.format(lyrZones, dirNum))

1
Die Frage und Antwort betrifft Shapefiles. Ich habe jedoch ein ähnliches Problem mit einer Feature-Class in einer Enterprise Geodatabase (auch bekannt als SDE) festgestellt. Es stellt sich heraus, dass arcpy.Exists einen vollständig qualifizierten Namen erfordert. Die Ebene.replaceDataSource schlägt jedoch fehl, wenn Sie einen vollständig qualifizierten Namen verwenden. Sie funktioniert jedoch, wenn Sie nur den Funktionsnamen verwenden und die Datenbank und den Eigentümernamen weglassen.
dvdhns

1

Spaß beim Debuggen! Versuche dies:

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == lyrZones:
        if lyr.supports("DATASOURCE"):
            print lyr.dataSource
            print currDir
            print newSource
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource, TRUE)
            print "Did we crash yet?"
            print lyr.dataSource
        else:
            print "Layer isn't supported!"

Zumindest weiß ich, dass Datasource unterstützt wird. Ich habe die gleiche Fehlermeldung erhalten. Absturz bei "lyr.replaceDataSource (currDir," SHAPEFILE_WORKSPACE ", newSource, True)". Ich bin nicht zu "Sind wir schon abgestürzt?" Frustrierend ...
fgcartographix

Argh, das ist scheiße. Was ist das Endziel, das Sie erreichen möchten? Vielleicht gibt es noch einen anderen Weg.
Mintx

Ich habe 5 Vorlagen und zwischen 14 und 50 Karten zu erledigen (insgesamt 128 Karten). Ich muss jeweils zwei Ebenen aktualisieren. Der erste ist nur ein Def. Abfrage, die ich wie ein Chef behandelt habe;) (lyr.definitionQuery = defQueryLines). Die andere ist eine Polygonebene mit einer abgestuften Farbsymbologie, aber die Datei muss geändert werden. Ich habe ein Skript geschrieben, das eine Ausgabe für jede Map erstellt, und ich muss die Quelle aktualisieren und den Symbologiewert ändern (aber ich denke, es ist 10.1, das das tut. Ich habe 10.0), damit ich die Symbologie behalten kann ...
fgcartographix

Im
Moment

Muss das Tool mit einer .lyr-Datei arbeiten? Vielleicht könnte ich direkt an einer .lyr arbeiten, wo ich die Datenquelle ändern könnte. Ich sehe keine Eigenschaften, um die Symbologie valye zu ändern (das Feld symbolisiert obwohl ...)
fgcartographix

1

Ich weiß nicht, ob dies Ihnen hilft oder nicht, aber ich habe diesen Fehler beim Wechsel der SDE-Datenquellen für eine Schicht festgestellt. Was ich fand, war, dass wenn ich von PyScripter aus laufen würde, es einen 64-Bit-Prozess python.exe aufspulen würde. Ich würde den ValueError bekommen. Wenn ich das Skript zwingen würde, über die Eingabeaufforderung die 32-Bit-Datei python.exe auszuführen, würde ich den Fehler nicht erhalten. Ich weiß nicht, ob das Ihrem Problem helfen würde oder nicht, aber es ist einen Versuch wert!


Vielen Dank. Es ist alles 32-Bit, also kann es nicht das Problem sein, aber ich werde das berücksichtigen, wenn ich 64-Bit-Geoverarbeitung versuche. Im
Moment

1

Die meisten Infos dazu gibt es hier . Um dies zu lösen, ging ich in das Python-Fenster in ArcCatalog, um die ESRI-Definitionen der einzelnen Parameter in der Funktion .replaceDataSource zu überprüfen.

.replaceDataSource (Arbeitsbereich, Arbeitsbereichstyp, Datensatzname)

Arbeitsbereich = Arbeitsbereich der neuen Datenquelle

workspace_type = Der tatsächliche Arbeitsbereichstyp, der im Abschnitt zum Ersetzen der Datenquelle der verknüpften Hilfe aufgeführt ist.

Dataset-Name = Dateiname ohne Dateityp (IE: .shp), nicht der Dataset-Name im Inhaltsverzeichnis. Das Verzeichnis davor ist ebenfalls nicht erforderlich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.