Server / Service in jedem ArcSDE-Layer in MXD dauerhaft ersetzen / aktualisieren?

8

Wenn mit der Methode mxd.findAndReplaceWorkspacePaths und, wenn MXD aktualisiert wird und der Pfad, in den die .sde-Verbindungsdatei erneut verschoben wird, alle Datenquellen erneut unterbrochen werden.

Gibt es eine Methode zum dauerhaften Aktualisieren jeder SDE-Schicht in einem MXD-Inhaltsverzeichnis, um den SDE-Server und -Dienst dauerhaft zu speichern? Dh. Ersetzen Sie einfach SERVER und INSTANCE für jede SDE-Ebene in einer MXD mithilfe von Python oder ArcObjects in Pyhton.

MMV
quelle
Soweit ich weiß, verwendet Arcmap beispielsweise immer den Pfad zur Verbindungsdatei "Database Connections\Connection to Foobar.sde", und es gibt keine Möglichkeit, die SERVER- und SERVICE-Informationen direkt zu übergeben oder zu speichern. Ich würde mich freuen , wenn ich mich als falsch erweisen würde. Ich kann mir einen Hack vorstellen, um eine dynamisch generierte SDE-Datei im selben Verzeichnis wie das MXD oder sogar im MXD zu speichern und stattdessen darauf zu verweisen. Ich weiß allerdings nicht, wie ich es implementieren soll.
Matt Wilkie
1
@matt, ich denke nicht, dass das völlig richtig ist; ArcMap verwendet die Verbindungseigenschaften, die innerhalb des Layers erhalten bleiben. Die SDE-Verbindungsdatei wird nie wieder angezeigt, ihr Pfad besteht nur aus Metadaten. Das Problem hier scheint spezifisch für die Ersetzungsmethoden für arcpy-Datenquellen zu sein. Sie können Verbindungseigenschaften definitiv festlegen, ohne eine Verbindungsdatei mit ArcObjects zu verwenden (z. B. über die IWorkspaceName- Schnittstelle). Mit arcpy sind Sie jedoch auf die bereitgestellten Methoden beschränkt.
blah238
@matt du bist richtig. Ich verwende die Arcpy-Methoden. Ich kann die Verbindungseigenschaften nicht für jede Ebene zum Speichern speichern. Eine Abhängigkeit zum Abrufen von Verbindungseigenschaften aus dem Pfad zur Verbindungsdatei bleibt nach einem mxd.save () oder mxd.saveACopy ()
MMV

Antworten:

7

Ich habe eine Lösung gefunden, um die Abhängigkeit vom Pfad zur .sde-Verbindungsdatei mithilfe von ArcPy und der folgenden Methode aufzuheben.

So funktioniert es:

lyr.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)
table.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)

Sie können die Verbindungsdatei umbenennen oder löschen, nachdem der MXD repariert und gespeichert wurde. Es wird weiterhin ohne Probleme geöffnet, nachdem die Verbindungsdatei nicht mehr vorhanden ist.

Diese Methoden funktionieren NICHT:

mxd.findAndReplaceWorkspacePaths
lyr.findAndReplaceWorkspacePath

Sie können die Verbindungsdatei nach der Reparatur des MXD NICHT umbenennen oder löschen. Das MXD sucht bei jedem Öffnen immer am selben Speicherort nach der .sde-Verbindungsdatei.

MMV
quelle
Ich verwende die lyr.replaceDataSource. Es scheint jedoch, dass arcmap die neue Datenquelle nicht erkennen kann, da sie ein "!" vor dem Layer muss ich also die Datenquelle von Hand reparieren. Hier ist mein Code:
Smalis
arcpy importieren; mxd = arcpy.mapping.MapDocument (r "C: \ Benutzer \ SMALIS \ Dokumente \ ArcGIS \ pythonSwitchSource.mxd"); für lyr in arcpy.mapping.ListLayers (mxd): wenn lyr.supports ("DATASOURCE"): lyr.replaceDataSource ("C: \ Benutzer \ SMALIS \ AppData \ Roaming \ ESRI \ Desktop10.2 \ ArcCatalog \ DB1.sde") , "SDE_WORKSPACE", lyr.datasetName, False) mxd.saveACopy (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ 1.mxd"); del mxd;
Smalis
Ihr Kommentar zu den Methoden für Feature-Datasets, die NICHT FUNKTIONIEREN, hat mir viele fehlgeschlagene Versuche erspart. Ein großes Dankeschön! Ich stimme zu, dass dies auch bei mir nicht funktioniert hat. Ist es ein Fehler? Der lyr.workspacePath zeigt den Feature-Datensatz
Woodwa
1

Sie müssen verschachtelte Gruppenebenen durchlaufen und dann arcpy.CreateArcSDEConnectionFile_managementeine neue SDE mit Parametern von erstellen lyr.servicePropertiesund Parameter als servProp.getoder übergeben arcpy.GetParameterAsText(0).

Vergiss nicht zu benutzen os.remove(temp_sde) if os.path.exsists(temp_sde) else None.

for maplayer in lyr_list:
    walknestedgroups(maplayer)
    servProp = maplayer.serviceProperties
    if maplayer.serviceProperties["ServiceType"] == "SDE":
        host = servProp.get('Server','N\A')
    if host in ("MyServer"):
        remap_sde(maplayer)
Andy
quelle
0

Dies mag zu einfach sein, aber ...
Wenn Sie die alte Verbindung umbenennen und die neue mit dem alten Namen benennen, führt dies zu einem besseren Ergebnis?

Brad Nesom
quelle
Wenn Sie jede Ebene in einem MXD neu verweisen, um eine Verbindungsdatei zu verwenden, die sich unter '\\ corpshare \ sde \ corpsde.sde' befindet, funktioniert alles hervorragend. Wenn dieser Pfad jedoch nicht mehr verfügbar ist, ist jetzt jeder MXD unterbrochen. ' Ich interessiere mich mehr für die Verbindungseigenschaften SERVER und SERVICE in der Verbindungsdatei als für den Pfad dazu. Ich möchte im Wesentlichen jeden Layer SERVER und SERVICE aktualisieren. Wenn dieser Pfad nicht mehr verfügbar ist, kann der MXD weiterhin auf den Server zugreifen, ohne einen Pfad zu einer gültigen Verbindungsdatei zu haben.
MMV
@ MMV, bist du sicher? Ich habe es gerade versucht: 1) Hinzufügen einer Ebene zur Zuordnung mithilfe einer SDE-Verbindungsdatei 2) Speichern der MXD und Schließen von ArcMap 3) Löschen / Umbenennen der SDE-Verbindungsdatei 4) Öffnen der gespeicherten MXD. Die Schicht wird problemlos geladen.
blah238
@ Blah238 richtig Ich habe das gesehen - wenn die SDE-Datei weg ist, verbindet sie sich immer noch ??? Was ich dachte ist, dass, wenn Sie die Verbindungseigenschaften in einer SDE-Datei ändern (um sie auf einen anderen Server / Dienst zu verweisen, dass er sie finden würde) (so lange Sie die Links nicht zuerst öffnen und trennen. Ich werde es ausprobieren und zurück.
Brad Nesom
Lesen Sie einfach den obigen Beitrag von blah238. Das war mir nicht bewusst. weil ich zuvor Passwortprobleme hatte und diese durch Ändern der Verbindungszeichenfolgen behoben habe. Vielleicht besteht der Trick darin, es zu brechen und mit den neuen Verbindungszeichenfolgen zu reparieren. Aber um es zu brechen, müssen Sie den bestehenden Dienst beenden. ??
Brad Nesom
@ blah238 Durch manuelles Erstellen einer MXD in ArcMap, Speichern und Entfernen der Verbindungsdatei funktioniert alles weiter, nachdem der Pfad zur .sde-Datei unterbrochen wurde. Beim Aktualisieren einer bereits vorhandenen MXD mit ArcPy bleibt die Abhängigkeit vom Pfad zur Verbindungsdatei bestehen.
MMV