ArcPyを使用してArcMapドキュメントのバージョンを確認しますか?


21

ArcPyを使用して、マップドキュメント(MXD)のバージョンを識別する方法はありますか。MXDのインベントリ作成するソリューションに取り組んでおり、ドキュメントが8.1、9.2、10.0などであるかどうかを知りたい

現在ArcGIS 10.0を使用していますが、10.1に存在しないアップデートが10.1にある場合は、それも聞いていただければ幸いです。

ArcGISのバージョンをプログラムで見つけるにどうすればよいかという以前の質問があります。、しかし、すべてのArcObjectsソリューションを参照します(これはpythonから呼び出すことができると思いますが、そうしない方がいいでしょう)。


2
これには、MapDocumentオブジェクトに読み取り専用バージョンプロパティを追加するための拡張リクエストが必要になると思います。あなたがそれを見つけ/作成したら、ここにリンクしてください。私は投票します。
PolyGeo

あるバージョンコントロールのArcGISアイデア。(まあ、3が1にマージ)
gm70560

スクリプトをコピーし、環境に合わせてわずかに変更し、一部のファイルで実行しましたが、9.3または10.0で保存されていることがわかっていても、一部のファイルはバージョンを返しませんでした。壊れたデータソースがスクリプトを台無しにするかどうかはわかりません。

関連:gisnuts.com/terra/blog/2014/02/24/…ここで受け入れられた答えへのフォローアップの質問に対するコメントで@danjurgellによる優れた発見。そのブログ投稿に基づいて、情報が予測可能な方法でファイルに保存されていないため、これを行うための100%信頼できる方法はありません。ここでの両方の答えは、いつかは機能しますが、常に機能するわけではありません。
クリスW

回答:


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の前に作業を開始しましたヘキサリーダーでmxdを分析し、バージョンの位置に変更があります(以前のパスの後、今日はパスの前であり、「ビルド番号」プレフィックスワード値を追加します(10.4.0.5524)。ヘキサ値部分に10.3.6がある
-GeoStoneMarten

1
10.2.2に再保存された10.6.1 mxdsを確認する(すべての 'バージョンを特定できません'を返します)...このスクリプトに統合するmxdドキュメントの更新はありますか?
JasonBK

14

以下の関数は、Ryanのアイデアに基づいていますが、もう少し直接的です。ArcGISマップドキュメントは、実際には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
それも素晴らしい機能です。この機能を使用することに抵抗する唯一のheは、一部の組織ではユーザーが実行できないサードパーティライブラリ(oletools)をダウンロード/インストールする必要があることです。
ライアンダルトン

私は1票しか得られませんが、これは他の答えが得られない場合に機能します。
ドウィン

Snorfalorpagusは10.3までうまく動作しますが、10.4にはフルビルド番号バージョンの別のストリームキー「Mx Document Version Info」があります。私は別のArcGISのバージョンと私の最後のバージョンの復帰10.4.0.5524で確認
GeoStoneMarten

面白い。まだ10.4にアップグレードしていません。空のmxdを共有してください。
-Snorfalorpagus

1
@GeoStoneMartenありがとう。あなたが送った文書を見ました。元のコードで動作するようです-「Mx Document Version Info」ストリームが表示されませんか?
-Snorfalorpagus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.