Changer la source de données pour toutes les couches dans MXD?

25

J'ai un MXD. Il se connecte à environ 30 couches dans l'une de nos bases de données SDE. Je souhaite modifier la base de données SDE à laquelle ils se connectent.

Existe-t-il un moyen de le faire sans avoir à cliquer avec le bouton droit sur chaque calque et à le modifier individuellement?

brenth
la source

Réponses:

37

Cliquez avec le bouton droit sur le mxd dans ArcCatalog, cliquez sur Définir les sources de données et modifiez en bloc à partir de là. Cependant, cet outil met en garde:

Remarque: cette boîte de dialogue est principalement destinée à la préparation de documents cartographiques pour publication. Les personnalisations (code VBA, contrôles d'interface utilisateur et barres d'outils personnalisées), les graphiques et les propriétés d'apparence des fenêtres de tableau sont supprimés des fichiers .mxd lorsque vous mettez à jour leurs sources de données à l'aide de cette boîte de dialogue. Pour les conserver, mettez plutôt à jour les sources de données dans ArcMap.

Vous pouvez également utiliser la bibliothèque python arcpy.mapping :

MapMan
la source
Cela semble ne pas fonctionner dans 10.1. La source de données est modifiée, mais (au moins dans le cas d'une connexion SDE), le lien est remplacé par une "connexion à la base de données", c'est-à-dire que la couche n'est plus pointée vers ce qui rompt le lien.
Michael Todd
16

Si vous utilisez ArcGIS 10 et souhaitez utiliser Python, consultez l'aide sur la mise à jour et la réparation des sources de données avec arcpy.mapping et les méthodes de l' objet Layer .

Exemple:

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

Si vos couches ne source pas toutes le même fichier de connexion d'origine ou si le nom de la classe d'entités de destination est différent sur le nouveau SDE, vous devrez peut-être utiliser à la Layer.replaceDataSourceplace.

blah238
la source
Cela fonctionne parfaitement merci! Une chose à ajouter est que "Database Connections \ Connection to GISSDE1.sde" peut également être remplacé par un emplacement .gdb.
Jack Fairfield
Comment pourrais-je utiliser cela en changeant la source de données du SAME SDE mais de la version 1 à la version 2?
NULL.Dude
3
  1. Établissez une connexion à une source de données dans ArcCatalog.
  2. Ouvrez le MXD et développez le calque et cliquez sur le point d'exclamation rouge dans n'importe quel calque. Cela ouvrira une fenêtre contextuelle contenant la source de données avec une connexion à la base de données.
  3. Sélectionnez la connexion à la base de données que vous avez établie, double-cliquez dessus et allez à l'intérieur du calque sur lequel vous avez cliqué et sélectionnez ce calque et appuyez sur OK, Ouvrir ou Ajouter.

Cela supprimera tous les points d'exclamation rouges contenant des couches dans le MXD et pointera vers la nouvelle source de données créée. En une seule fois, vous pouvez le faire; pas besoin d'aller cliquer à chaque fois sur le point d'exclamation rouge et de cliquer et de définir la source de données.

Inderjeet singh bhambra
la source
Son très utile.Veuillez aller à travers cette fois
Inderjeet singh bhambra
3
Cela ne fonctionnera que si les connexions sont rompues, sinon l'une des autres réponses est plus appropriée.
blah238
1

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

Le lien est vers un ancien Arcscript appelé outils GDK, qui peut être obtenu sur d'autres sites. Le programme crée une barre d'outils dans arcmap où vous pouvez changer la source sur les couches sélectionnées (n'importe quelle couche que vous voulez. Cela fonctionne entre les connexions SDE ou SDE vers la géodatabase fichier locale (qui ne peut pas être modifiée dans Arccatalog, car le nom dans SDE commence par l'utilisateur SDE, puis dot.

c'est très utile, mais peut-être seulement dans arcgis 9.3

jonaktiv
la source
1
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change.
BradHards
J'ai modifié!
jonaktiv
1

Si vous avez déjà ouvert le fichier .mxd, faites ce que @ blah238 a fait, mais utilisez 'CURRENT'plutôt le chemin complet. N'oubliez pas que la recherche et le remplacement ne doivent pas nécessairement être la chaîne complète:

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

Vous devrez ensuite enregistrer et rouvrir le fichier .mxd de toute façon.

jazzabeanie
la source
1

Pour un mxd, les outils ESRI par défaut peuvent suffire. Mais réparer plusieurs mxds avec des liens rompus peut être un cauchemar. Essayez mon outil UpdateLayerRefs pour corriger un nombre illimité de MXD en quelques secondes: https://github.com/jswagger/UpdateLayerRefs Fournissez simplement les noms de vos MXD d'entrée sous forme de liste ["Name1.mxd", "Name2.mxd", "Name3.mxd "]

Jeremy Swagger
la source
Bien partager votre code :) Pouvez-vous nous expliquer un peu comment l'utiliser?
gisnside
Absolument: 1. Remplissez le fichier de configuration JSON:
Jeremy Swagger
Première étape, j'ai deviné! Mais je me pose des questions après - Il semble que votre commentaire n'ait pas touché le sol pour le reste du message. Vous devriez peut-être modifier votre réponse à la place :) :)
gisnside
1
Désolé, je me suis fait quelque chose. Mise à jour du fichier Lisezmoi maintenant ....
Jeremy Swagger
1
C'est exact. L'exécution de python UpdateLayerRefs.py --config "update_layer_refs.config.json" vous permet de l'exécuter dans n'importe quel dossier.
Jeremy Swagger
0

Il semble que ce post soit ancien, mais je ne peux pas le faire fonctionner: le code est le suivant:

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
la source
Bienvenue dans GIS SE. Si vous ne l'avez pas encore fait, veuillez faire le tour pour en savoir plus sur ce format de questions / réponses. Il est préférable de publier à nouveau votre réponse en tant que question propre. Assurez-vous d'inclure tous les messages d'erreur que vous avez reçus lorsque vous avez exécuté le code!
Andy