Ändern der Datenquelle für alle Ebenen in MXD?

25

Ich habe eine MXD. Es verbindet sich mit ungefähr 30 Schichten in einer unserer SDE-Datenbanken. Ich möchte die SDE-Datenbank ändern, mit der sie verbunden sind.

Gibt es eine Möglichkeit, dies zu tun, ohne mit der rechten Maustaste auf jede Ebene klicken und diese einzeln ändern zu müssen?

brenth
quelle

Antworten:

37

Klicken Sie in ArcCatalog mit der rechten Maustaste auf "mxd", klicken Sie auf "Datenquellen festlegen" und ändern Sie die Datenmenge von dort aus. Dieses Tool warnt jedoch:

Hinweis: Dieser Dialog dient hauptsächlich zur Vorbereitung von Kartendokumenten für die Veröffentlichung. Anpassungen (VBA-Code, Benutzeroberflächensteuerelemente und benutzerdefinierte Symbolleisten), Diagramme und Eigenschaften für die Darstellung von Tabellenfenstern werden aus MXD-Dateien entfernt, wenn Sie ihre Datenquellen mithilfe dieses Dialogfelds aktualisieren. Aktualisieren Sie stattdessen die Datenquellen in ArcMap, um diese beizubehalten.

Sie können auch die Python-Bibliothek arcpy.mapping verwenden:

MapMan
quelle
Dies scheint in 10.1 nicht zu funktionieren. Die Datenquelle wird geändert, aber (zumindest bei einer SDE-Verbindung) wird die Verknüpfung zu einer "Datenbankverbindung" geändert, dh die Ebene wird nicht mehr angezeigt, wodurch die Verknüpfung unterbrochen wird.
Michael Todd
16

Wenn Sie ArcGIS 10 verwenden und Python verwenden möchten, lesen Sie die Hilfe zum Aktualisieren und Korrigieren von Datenquellen mit arcpy.mapping und die Methoden des Layer- Objekts.

Beispiel:

import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project_SDE1.mxd")
mxd.findAndReplaceWorkspacePaths(r"Database Connections\Connection to GISSDE1.sde", 
                                r"Database Connections\Connection to GISSDE2.sde")
mxd.saveACopy(r"C:\Project\Project_SDE2.mxd")
del mxd

Wenn Ihre Layer nicht alle dieselbe ursprüngliche Verbindungsdatei als Quelle haben oder der Name der Ziel-Feature-Class in der neuen SDE unterschiedlich ist, müssen Sie möglicherweise Layer.replaceDataSourcestattdessen verwenden.

blah238
quelle
Das funktioniert einwandfrei danke! Eine Sache, die hinzugefügt werden muss, ist, dass "Database Connections \ Connection to GISSDE1.sde" auch durch einen .gdb-Speicherort ersetzt werden kann.
Jack Fairfield
Wie kann ich dies nutzen, wenn ich die Datenquelle von SAME SDE, aber von Version 1 auf Version 2 wechsle?
NULL.Dude
3
  1. Stellen Sie in ArcCatalog eine Datenquellenverbindung her.
  2. Öffnen Sie die MXD, erweitern Sie die Ebene und klicken Sie auf das rote Ausrufezeichen in einer beliebigen Ebene. Dies öffnet ein Popup-Fenster mit der Datenquelle mit Datenbankverbindung.
  3. Wählen Sie die Datenbankverbindung aus, die Sie hergestellt haben, doppelklicken Sie darauf, und wechseln Sie in die Ebene, auf die Sie geklickt haben. Wählen Sie diese Ebene aus, und klicken Sie auf OK, Öffnen oder Hinzufügen.

Dadurch werden alle roten Ausrufezeichen entfernt, die Ebenen in der MXD enthalten, und es wird auf die neu erstellte Datenquelle verwiesen. Auf einmal können Sie dies tun; Sie müssen nicht jedes Mal auf das rote Ausrufezeichen klicken und auf die Datenquelle klicken und sie einstellen.

Inderjeet singh bhambra
quelle
Es ist sehr hilfreich.Bitte gehen Sie einmal durch
Inderjeet singh bhambra
3
Dies funktioniert nur, wenn die Verbindungen unterbrochen sind, andernfalls ist eine der anderen Antworten angemessener.
blah238
1

http://arcscripts.esri.com/details.asp?dbid=14922

Der Link verweist auf ein altes Arcscript namens GDK-Tools, das auf anderen Websites erhältlich ist. Das Programm erstellt in arcmap eine Symbolleiste, in der Sie die Quelle auf ausgewählten Ebenen ändern können (jede gewünschte Ebene. Dies funktioniert zwischen SDE-Verbindungen oder SDE zur lokalen File-Geodatabase (die die Quelle in Arccatalog nicht ändern kann, da der Name in SDE mit beginnt) der SDE-Benutzer und dann Punkt.

das ist sehr hilfreich, aber vielleicht nur in arcgis 9.3

jonaktiv
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
BradHards
Ich habe geändert!
Jonaktiv
1

Wenn Sie die .mxd bereits geöffnet haben, tun Sie das, was @ blah238 getan hat, aber verwenden Sie 'CURRENT'anstelle des vollständigen Pfads. Vergessen Sie nicht, dass das Suchen und Ersetzen nicht die vollständige Zeichenfolge sein muss:

import arcpy
mxd = arcpy.mapping.MapDocument('CURRENT')
mxd.findAndReplaceWorkspacePaths(r"scratch", 
                                r"project/draft")

Dann müssen Sie die .mxd-Datei trotzdem speichern und erneut öffnen.

Jazzabeanie
quelle
1

Für einen mxd können Standard-ESRI-Tools ausreichen. Aber das Reparieren mehrerer Mxds mit defekten Links kann ein Albtraum sein. Probieren Sie mein UpdateLayerRefs-Tool aus, um eine unbegrenzte Anzahl von MXDs in Sekunden zu reparieren: https://github.com/jswagger/UpdateLayerRefs Geben Sie einfach die Namen Ihrer Eingangs-MXDs als Liste an ["Name1.mxd", "Name2.mxd", "Name3.mxd" "]

Jeremy Swagger
quelle
Nizza teilen Sie Ihren Code :) Können Sie ein wenig ausarbeiten, wie man es verwenden kann?
gisnside
Absolut: 1. Füllen Sie die JSON-Konfigurationsdatei aus:
Jeremy Swagger
Erster Schritt, denke ich! Aber ich frage mich, ob Ihr Kommentar den Rest der Nachricht nicht beantwortet hat. Du solltest stattdessen vielleicht deine Antwort bearbeiten :) :)
gisnside
1
Tut mir leid, ich bin auf etwas gestoßen. Aktualisieren Sie die Readme-Datei jetzt ....
Jeremy Swagger
1
Das ist richtig. Wenn Sie python UpdateLayerRefs.py --config "update_layer_refs.config.json" ausführen, können Sie es in einem beliebigen Ordner ausführen.
Jeremy Swagger
0

Scheint, als wäre dieser Beitrag alt, aber ich kann ihn nicht zum Laufen bringen: Der Code lautet wie folgt:

import arcpy, glob

#specify MXD location to change source data
mxd = arcpy.mapping.MapDocument(r"C:\\Users\\jrender\\Documents\\LandbaseEditing PreProd Pub Check.mxd")
workspaceCurrent = r"Database Connections\Connection to PP_GISLand_Landbase.sde"
workspaceTarget = r"Database Connections\Connection to PP_Publication_GISLand.sde" 

mxd.findAndReplaceWorkspacePaths(workspaceCurrent, workspaceTarget)

#save a new copy of MXD
mxd.saveACopy(r"C:\Users\jrender\Documents\LandbaseEditing PreProd Pub Check Repathed.mxd")
EgmontDeVos
quelle
Willkommen bei der GIS SE. Wenn Sie dies nicht getan haben, nehmen Sie bitte an der Tour teil , um mehr über dieses Q & A-Format zu erfahren. Ihre Antwort kann am besten als eine Frage für sich selbst neu gepostet werden. Achten Sie darauf, alle Fehlermeldungen einzuschließen, die Sie beim Ausführen des Codes erhalten haben!
Andy