使用ArcPy确定ArcMap文档版本?


21

ArcPy是否可以识别地图文档(MXD)的版本。我正在研究一种解决方案,以库存我们的MXD,并想知道文档是否为8.1、9.2、10.0等。

我当前正在使用ArcGIS 10.0,但是如果10.1中有一个更新不存在于10.0中,那么我也很高兴听到这一消息。

我看到有一个先前的问题:如何以编程方式找到ArcGIS版本?,但它引用了所有ArcObjects解决方案(我想我可以从python调用它,但我不想这样做)。


2
我认为这可能需要将只读版本属性添加到MapDocument对象的增强请求。如果您找到/创建了一个,请在此处链接到它,我将投票给它。
PolyGeo

有一个版本控制 ArcGis Idea。(好吧,3个合并为一个)
gm70560

我复制了您的脚本,针对我的环境对其进行了一些修改,然后在我的某些文件上运行了该脚本,但是即使我知道它们已保存在9.3或10.0中,但某些文件也没有返回版本。我不确定损坏的数据源是否会使您的脚本混乱。

相关:gisnuts.com/terra/blog/2014/02/24/…@danjurgell的一个很棒的发现,它是对此处已接受答案的后续问题的评论。根据该博客文章,没有100%可靠的方法来执行此操作,因为信息只是无法以可预测的方式存储在文件中。这里两个答案将工作一些时间,但并非所有的时间。
克里斯W

Answers:


23

我知道这个问题有几个月的历史了,但我会发布此问题,以防它对其他人有帮助。我开发了此合并器以解析MXD文档中的版本号。它基本上读取MXD文档的前4000个字符左右并搜索版本号。我使用MXD 9.2、9.3、10.0和10.1版进行了测试。

import re

def getMXDVersion(mxdFile):
    matchPattern = re.compile("9.2|9.3|10.0|10.1|10.2")
    with open(mxdFile, 'rb') as mxd:
        fileContents = mxd.read().decode('latin1')[1000:4500]
        removedChars = [x for x in fileContents if x not in [u'\xff',u'\x00',u'\x01',u'\t']]
        joinedChars = ''.join(removedChars)
        regexMatch = re.findall(matchPattern, joinedChars)
        if len(regexMatch) > 0:
            version = regexMatch[0]
            return version
        else:
            return 'version could not be determined for ' + mxdFile

这是扫描文件夹中的mxd文件并打印版本和名称的示例

import os
import glob
folder = r'C:\Users\Administrator\Desktop\mxd_examples'
mxdFiles = glob.glob(os.path.join(folder, '*.mxd'))
for mxdFile in mxdFiles:
    fileName = os.path.basename(mxdFile)
    version = getMXDVersion(mxdFile)
    print version, fileName

哪个返回:

>>> 
10.0 Arch_Cape_DRG.mxd
9.2 class_exercise.mxd
9.3 colored_relief2.mxd
10.1 CountyIcons.mxd
10.0 DEM_Template.mxd
9.2 ex_2.mxd
10.0 nairobimap.mxd
10.0 slope_script_example.mxd
10.1 TrailMapTemplateBetter.mxd
10.0 Wickiup_Mountain_DEM.mxd
>>>

这太酷了!很有用。现在我们也可以使用图层和地理数据库来做到这一点吗?
麦克,

这真是太棒了!
dchaboya

10.4之前的工作流程我已经用Hexa阅读器分析了mxd,版本位置已更改(它在路径之前,今天是在路径之前,然后添加“内部版本号”前缀字值,其下一个是(10.4.0.5524)。在10.3.1中,我六边值部分具有10.3.6
GeoStoneMarten '16

1
这似乎对我不起作用,请检查是否已还原为10.2.2的10.6.1 mxds(都返回“无法确定版本”)... mxd文档中是否有任何更新可集成到此脚本中?
JasonBK

14

下面的函数基于Ryan的想法,但是更加直接。ArcGIS Map文档实际上是OLE文档,可以使用该oletools模块进行解析(在pypi上提供:https ://pypi.python.org/pypi/oletools )。该函数将打开文件并读取版本字符串。经过9.0、9.3、10.1和10.3的测试,但应该可以使用任何工具(不确定3.x ...)。

from oletools.thirdparty import olefile

def mxd_version(filename):
    ofile = olefile.OleFileIO(filename)
    stream = ofile.openstream('Version')
    data = stream.read().decode('utf-16')
    version = data.split('\x00')[1]
    return version

if __name__ == '__main__':
    import sys
    print(mxd_version(sys.argv[-1]))

1
这也是一个很棒的功能。我唯一反对使用此功能的犹豫是它要求用户下载/安装第三方库(oletools),在某些组织中,用户可能无法执行。
RyanDalton

我只有一票,但是在其他答案没有的情况下,它将起作用。
DWynne 2015年

Snorfalorpagus可以在10.3之前正常运行,但对于10.4,还有另一个带有完整版本号版本的流密钥“ Mx Document Version Info”。我使用不同版本的arcgis进行了检查,最后一个版本返回10.4.0.5524
GeoStoneMarten '16

有趣。我尚未升级到10.4。您可以分享一个空白的mxd供我查看吗?
Snorfalorpagus

1
@GeoStoneMarten谢谢。我查看了您发送的文档。似乎可以使用原始代码-我看不到“ Mx文档版本信息”流吗?
Snorfalorpagus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.