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?

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 :


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.


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.


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


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.


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 "]


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")

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.