ArcGIS Python脚本二之查找和修复丢失的数据链接
目录
当对GIS的数据源进行移动、格式转换或删除等操作时,往往会导致地图文档或图层文件中的数据丢失链接,这时将无法显示地图数据。
如果使用arcpy.mapping模块编写脚本,则无需打开地图文档就可以自动查找和修复丢失的数据源。
相关术语的定义:
- 工作空间 —— 工作空间是一种数据容器,它可以是一个文件夹(就shapefile而言)、个人地理数据库、文件地理数据库或ArcSDE连接等。工作空间确定了该工作空间的系统路径。对于文件地理数据库来说,工作空间的系统路径包括该地理数据库的名称
- 数据集 —— 数据集是工作空间中的要素类或表。
- 数据源 —— 数据源是工作空间和数据集的组合
一、查找地图文档和图层文件中丢失的数据源
arcpy.mapping模块中的ListBrokenDataSources()函数,可以返回一个图层列表,列表中的对象是地图文档或图层文件中已经丢失了数据链接的图层。
代码示例:
import arcpy.mapping as mapping # 导入arcpy.mapping模块
mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd") # 引用KeLaMaYi.mxd地图文档文件
listBrokenDS = mapping.ListBrokenDataSources(mxd) # 获取丢失了数据源的图层列表
""" 迭代列表,输出图层名称"""
for layer in listBrokenDS:
print(layer.name)
结果输出丢失了数据源的各个图层的名称列表:
二、使用MapDocument.findAndReplaceWorkspacePaths()方法修复丢失的数据源
MapDocument.findAndReplaceWorkspacePaths()方法用于执行全局查找,并替换地图文档中图层和表的工作空间路径。
它还可以同时替换多种工作空间类型的路径,例如可以同时替换个人地理数据库和文件地理数据库两种工作空间类型。
MapDocument.findAndReplaceWorkspacePaths()方法接受两个参数:
- 旧工作空间路径
- 新工作空间路径
代码示例:
import arcpy.mapping as mapping # 导入制图模块
mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd") # 引用KeLaMaYi.mxd地图文档文件
""" 修复地图文档中数据源的路径 """
""" MapDocument.findAndReplaceWorkspacePaths()方法中,第1个参数是原路径,第2个参数是新路径 """
mxd.findAndReplaceWorkspacePaths(r"E:\work\KeLaMaYi.gdb", r"E:\work\ansoData\serverData\KeLaMaYi\onlineData\KeLaMaYi.gdb")
""" 修复数据源并不会在当前地图文档中体现出来 """
""" 所以将已经修复数据源的结果保存到新的.mxd文件中"""
mxd.saveACopy(r"E:\work\KeLaMaYiFixed.mxd")
Layer和TableView对象也有findAndReplaceWorkspacePaths()方法,可以执行相同的操作。
不同之处在于,Layer和TableView对象中的findAndReplaceWorkspacePaths()方法只能用来修复单个丢失的数据源,不能进行全局查找并替换地图文档中所有丢失的数据源。
三、使用MapDocument.replaceWorkspaces()方法修复丢失的数据源
使用MapDocument.replaceWorkspaces()方法可以将数据集自动更新到不同类型的工作空间中。
MapDocument.replaceWorkspaces()方法的参数包括:
- 原始工作空间路径
- 原始工作空间类型
- 新工作空间路径
- 新工作空间类型
必须确保提供的工作空间类型与相应的数据集相匹配。
表示工作空间类型的参数是以字符串关键字的形式传递给该方法的,有效的工作空间类型如下所示:
- ACCESS_WORKSPACE —— 个人地理数据库或Access工作空间
- ARCINFO_WORKSPACE —— ArcInfo coverage工作空间
- CAD_WORKSPACE —— CAD文件工作空间
- EXCEL_WORKSPACE —— Excel文件工作空间
- FILEGDB_WORKSPACE —— 文件地理数据库工作空间
- OLEDB_WORKSPACE —— OLE数据库工作空间
- PCCOVERAGE_WORKSPACE —— PCARC/INFO Coverage工作空间
- RASTER_WORKSPACE —— 栅格工作空间
- SDE_WORKSPACE —— SDE地理数据库工作空间
- SHAPEFILE_WORKSPACE —— shapefile工作空间
- TEXT_WORKSPACE —— 文本文件工作空间
- TIN_WORKSPACE —— TIN工作空间
- VPF_WORKSPACE —— VPF工作空间
示例:
import arcpy.mapping as mapping
mxd = mapping.MapDocument(r"E:\work\KeLaMaYi.mxd")
mxd.replaceWorkspaces(r"E:\work\KeLaMaYi.gdb", "FILEGDB_WORKSPACE", r"E:\work\temp", "SHAPEFILE_WORKSPACE")
mxd.saveACopy("E:\work\KeLaMaYi_DataLinksUpdated.mxd")
四、使用replaceDataSource()方法修复单个图层和表对象
Layer和TableView类都有replaceDataSource()方法,该方法可以改变单个图层或表的工作空间路径、工作空间类型和数据集名称。
replaceDataSource()方法接受四个参数:
- 新工作空间的路径
- 新工作空间类型
- 新数据集名称 (可选)
- 布尔值,如果设置为True,只有当新工作空间路径的值是有效的工作空间时,工作空间才会进行更新。
示例:
import arcpy.mapping as mapping # 导入arcpy站点包
mxd = mapping.MapDocument(r"C:\ArcpyBook\Ch3\Crime_DataLinksLayer.mxd") # 引用地图文档
df = mapping.ListDataFrames(mxd, "Crime")[0] # 引用对应数据框
lyr = mapping.ListLayers(mxd, "Burglary", df)[0] # 引用需要改变数据源的图层
""" 改变图层的数据源 """
""" replaceDataSource()方法参数分别为新工作空间路径、新工作空间类型、新数据集名称"""
lyr.replaceDataSource(r"C:\ArcpyBook\data", "SHAPEFILE_WORKSPACE", "Burglaries_2009")
""" 将结果保存到新的地图文档文件中 """
mxd.saveACopy(r"C:\ArcpyBook\Ch3\Crime_DataLinksNewLayer.mxd")
Layer和TableView类也有findAndReplaceWorkspacePath()方法,它与MapDocument.findAndReplaceWorkspacePaths()方法非常相似。
唯一不同的是,该方法只处理单个Layer或TableView类,而不是迭代全部地图文档或地图文件。
五、查找文件夹中所有地图文档内丢失的数据源
可以使用ArcGIS python脚本的循环结构来搜索文件夹中的地图文档文件,查找这些地图文档中丢失的数据源,并将丢失数据链接的图层名称写入一个文本文件中。
这里需要用到os.walk()方法,os.walk()方法是一个简单、易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
os.walk()方法语法格式如下:
参数:
top —— 要遍历的目录的地址,返回的是一个三元组(root,dirs,files)
- root —— 当前正在遍历的这个文件夹的本身的地址
- dirs —— dirs是一个列表,内容是该文件夹中所有的目录的名字
- files —— 同样是列表,内容是该文件夹中所有的文件
其他的参数就不列出来了。
示例:
import arcpy.mapping as mapping, os # 导入arcpy模块和os模块
f = open('BrokenDataList.txt', 'w')
""" 创建for循环并使用os.walk()方法来遍历目录树,os.walk()方法的参数为要遍历文件夹的路径。"""
for root, dirs, files in os.walk("C:\ArcpyBook"):
for name in files: # 遍历所有返回的文件
filename = os.path.join(root, name) # 将根目录路径和文件路径合并
if ".mxd" in filename: # 判断文件扩展名以确定文件是否为地图文档文件
mxd = mapping.MapDocument(filename) # 引用地图文档
f.write("MXD: " + filename + "\n") # 写入对应的地图文档文件的文件名
brknList = mapping.ListBrokenDataSources(mxd) # 返回地图文档中丢失数据源的图层的列表
for brknItem in brknList: # 遍历丢失数据源图层的列表
print("Broken data item: " + brknItem.name + " in " + filename)
f.write("\t" + brknItem.name + "\n") # 写入丢失数据源图层的名称
""" 添加print语句,用来表明工作完成,然后关闭文件 """
print("All done")
f.close()
转载自:https://blog.csdn.net/qq_35732147/article/details/84987209