我有一个MXD。它连接到我们的SDE数据库之一中的大约30层。我想更改他们连接到的SDE数据库。

是否有一种方法可以不必右键单击每个图层并单独更改它?

#1 楼

右键单击ArcCatalog中的mxd,单击“设置数据源”,然后从此处批量更改。但是,此工具会警告:


注意:此对话框主要用于准备要发布的地图文档。使用此对话框更新其数据源时,将从.mxd文件中删除自定义项(VBA代码,UI控件和自定义工具栏),图形和表格窗口外观属性。要保留这些内容,请改用ArcMap中的数据源。


还可以使用arcpy.mapping python库:

评论


在10.1中似乎不起作用。数据源已更改,但是(至少在SDE连接的情况下)链接更改为“数据库连接”,即该层不再指向该链接,从而断开了该链接。

–迈克尔·托德(Michael Todd)
2012年9月6日15:28

#2 楼

如果您使用的是ArcGIS 10并且对使用Python感兴趣,请查看有关使用arcpy.mapping更新和修复数据源以及Layer对象的方法的帮助。

示例:

 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
 


如果您的图层并非全部源同一个原始连接文件,或者目标要素类名称为在新的SDE上有所不同,您可能需要改用Layer.replaceDataSource

评论


这非常完美,谢谢!要添加的一件事是“ Database Connections \到GISSDE1.sde的连接”也可以替换为.gdb位置。

–杰克·费尔菲尔德
17年1月4日,19:41



从SAME SDE但从版本1切换到版本2,我将如何使用它呢?

–NULL.Dude
17年4月6日在12:32

#3 楼


在ArcCatalog中建立数据源连接。
打开MXD并展开图层,然后单击任意图层中的红色感叹号。这将打开一个弹出窗口,其中包含带有数据库连接的数据源。
选择您已建立的数据库连接,双击它,然后将其放入您单击的层中,然后选择该层并按OK。 ,打开或添加。

这将删除MXD中所有包含红色惊叹号的图层,并指向新创建的数据源。您可以一口气做到这一点;无需每次都单击红色感叹号并单击并设置数据源。

评论


这非常有帮助。请仔细阅读

– Inderjeet Singh Bhambra
2012年12月20日下午6:13

仅当连接断开时,此方法才有效,否则,其他答案之一更合适。

–blah238
2012年12月20日下午6:29

#4 楼

http://arcscripts.esri.com/details.asp?dbid=14922
该程序在arcmap中创建一个工具栏,您可以在其中更改选定图层(所需的任何图层上的源。这在SDE连接或SDE与本地文件地理数据库之间起作用(由于SDE中的名称以SDE开头,因此Arccatalog中的更改源无法处理)用户,然后点。

这非常有帮助,但可能仅在arcgis 9.3中有效

评论


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。

– BradHards
14年2月14日在10:01

我已经修改了!

– jonaktiv
14年2月14日在12:57

#5 楼

如果您已经打开.mxd,请执行@ blah238的操作,但请使用'CURRENT'而不是完整路径。不要忘记搜索和替换不必是完整的字符串:

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


然后,您仍然必须保存并重新打开.mxd文件。

#6 楼

对于一个mxd,默认的ESRI工具就足够了。但是用断开的链接修复多个mxds可能是一场噩梦。尝试使用我的UpdateLayerRefs工具在几秒钟内修复无限的MXD:https://github.com/jswagger/UpdateLayerRefs
只需将输入MXD的名称作为列表提供
[“ Name1.mxd”,“ Name2 .mxd”,“ Name3.mxd”]

评论


很好地共享您的代码:)您能否详细说明如何使用它?

–gisnside
17年8月28日在17:27



绝对:1.填写JSON配置文件:

– Jeremy Swagger
17年8月29日在20:46

我猜第一步!但是我想知道之后-似乎您的评论在其余的信息中没有引起关注。您也许应该编辑答案:) :)

–gisnside
17年8月29日在20:53



抱歉,遇到了麻烦。正在更新自述文件。

– Jeremy Swagger
17年8月29日在21:06

那是对的。运行python UpdateLayerRefs.py --config“ update_layer_refs.config.json”允许您在任何文件夹中运行它。

– Jeremy Swagger
17年8月29日在21:20

#7 楼

似乎这篇文章很旧,但是我无法使它正常工作:代码如下:

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


评论


欢迎使用GIS SE。如果您尚未这样做,请参观以了解此问答格式。最好将您的答案重新发布为一个独立的问题。确保包含运行代码时收到的所有错误消息!

–安迪
18-10-11在17:33