GISインベントリを作成する方法は?


21

私のオフィスでは、GISセクションに大きな変化が見られます。このセクションは1980年代から運用されており、GISデータ(シェープファイル、ラスターファイル、データなど)の膨大なコレクションがありますが、インベントリを介したことはありません。今それが起こります。

GISデータに関するすべての情報(シェイプファイル、アーク情報カバレッジ、レイヤーファイル、*。mxd、gdb、ラスターファイルなど)をPCからExcelファイルに自動的に抽出する方法はありますか?情報には、作成日、最終編集日、フォルダまたはコンテナ名などが含まれます。


3
ArcGISのバージョンは何ですか?10.1 SP1では、これはによりは​​るかに簡単になりましたarcpy.da.walk
blah238

1
pythonを使用して古いサーバーを攻撃する前に、視覚的なインベントリを取得して設計をスケッチすることから始めることは決して痛いことはありません。
ロイ

@Royへの応答として、この無料ダウンロードから始めることを検討してください。voyagergis.com
Czed

あなたはまた、ESRIの自由などのメタデータ検索ポータル、検討するかもしれないGeoportalサーバーを
スティーブン・鉛

回答:


18

これはarcpy.da.Walk、ArcGIS 10.1 SP1の機能を使用して機能します。

import arcpy, csv, os

workspace = r"c:\GISData"
output = r"C:\temp\test.csv"

with open(output, 'wb') as csvfile:
    csvwriter = csv.writer(csvfile)
    for dirpath, dirnames, filenames in arcpy.da.Walk(workspace):
        for filename in filenames:
            desc = arcpy.Describe(os.path.join(dirpath, filename))
            csvwriter.writerow([desc.catalogPath, desc.name, desc.dataType])

このcsvモジュールは、出力ファイルの書き込みを簡素化するためにも使用されます。ExcelはCSVファイルを開くことができるため、スプレッドシートとして表示できます。

arcpy.Describe出力に含めることができる追加のプロパティについては、関数を参照してください。

実際のメタデータから情報を解析する場合は、この回答のスクリプトを参照してください。ファイルジオデータベース内のすべてのファイル名(および場合によってはメタデータ)を含むテーブルの作成


@ blah239、Excelはテキストファイルも開くことができます。デリミネータを提供するだけです。
アートワーク

4
確かに、Excel CSV方言は、埋め込まれた引用符、改行、コンマなどのトリッキーな問題をすべて処理します。また、ファイルを開くためにウィザードを使用する必要もありません。
blah238

明確化のためのthx。
アートワーク

10

Pythonを使用する場合、正しいモジュールを使用して必要なことを行う必要があります。たとえば、拡張子がshpのディレクトリ内のすべてのファイルを見つけるには、途切れることなく提示されたはるかに単純なソリューションがあります。これはひどいものです...インターネットで検索)

関連モジュールのいくつかの例:

1)globモジュールの場合:

シェープファイルのみ:

import glob
import os
os.chdir("mydir")
for files in glob.glob("*.shp"):
    print files

シェープファイルとジオデータベース:

import glob
types = ('*.shp', '*.gbd') # the tuple of file types
files_grabbed = []
for files in types:
     files_grabbed.extend(glob.glob(files)) #files_grabbed = the list of shp and gbd files

サブディレクトリも検索する場合:

import glob
for f in glob.iglob("/mydir/*/*.shp"): #search immediate subdirectories 
    print f

2)os.listdirおよびリスト内包表記(2行)->結果リスト

path = 'mydir'
shape_files = [f for f in os.listdir(path) if f.endswith('.shp')]
gdb_files = [f for f in os.listdir(path) if f.endswith('.gdb')]

3)fnmatchモジュールの場合:

import fnmatch
for file in os.listdir('path'):
    if fnmatch.fnmatch(file, '*.shp'):
        print file

他の多くのソリューション、再帰的など。


「* .shp」メソッドを使用して.shp.xmlファイルをどのように無視しますか?
アートワーク

1
やってみた?glob.glob( "*。shp")は、私の側では.shp.xmlファイルを返しません。
blah238

@ blah238、試行しなかった、thx。
アートワーク

5

回答してくれたartwork21とNathan Wに感謝します。そして、はい、Nathenのコードが魔法を作りました。

import os, arcpy

#create blank text file
with open("C:\\Temp\\GISlayers.txt", "w") as txt:
for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:
        #look for shapefiles
        if f.endswith('.shp'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        if f.endswith('.gdb'):
            desc = arcpy.Describe(root)
            for child in desc.children:
                #write info to text file
                txt.write(child.name + "," + child.path + "\n")

        #look for layer files
        if f.endswith('.lyr'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for img file
        if f.endswith('.img'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

ファイル名と場所のみ。使用するPCには多くのカバレッジ(arc-infoファイル)ファイルがありますが、それらも動作しますか?


私のソフトウェアのバージョンに関しては、AG 10.1 SP1を使用していますが、他のPCはESRIソフトウェアのさまざまなバージョンを使用しています。ほとんどはArc infoです。
blu_sr

実際にarcpy.da.walkカバレッジをリストするかどうかはわかりませんが、dataTypeまたはtypeフィルターにリストされていないので、そうではないと思います。
blah238

コードの短縮版は次のとおりです:gist.github.com/4577289 shp、lyr、imgのロジックは同じなので、1つのifステートメントでそれらを実行するだけです。
ネイサンW

2
また、txt.close()使用withしている場合は、ブロックの終了時に自動的に実行されるため、必要ありません。
ネイサンW

4

ArcGIS Desktop 10.0(またはそのサービスパック)を使用している場合、os.walkを使用して定義済みのGISディレクトリを調べ、.shpなどの一般的なGISファイル拡張子を検索するpythonスクリプトを記述するのが最善の策だと思います。 gdb、.mdbなど。結果をコンマ区切りのテキストファイルに書き込みます。その後、テキストファイルをExcelに取り込むことができます。以下のコード例を参照してください。

import os, arcpy

#create blank text file
txt = open("C:\\Temp\\GISlayers.txt", "w")

for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:

        #look for shapefiles
        foundSHP = f.find(".shp")
        if foundSHP >0:
            checkEXT = f[-3:]
                if checkEXT <> "xml":
                    desc = arcpy.Describe(root + "\\" + f)
                    #write info to text file
                    txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        foundGDB = f.find(".gdb")
        if foundGDB >0:
            desc = arcpy.Describe(root)
            for child in desc.children:
            #write info to text file
            txt.write(child.name + "," + child.path + "\n")
        break
txt.close()

ArcGIS 10.1(以降)をデスクトップに使用している場合、10.0以前では利用できなかったarcpy.da.Walkを使用する別の回答がここにあります。


あなたのコードをチェックしたいかもしれません。最初に形状を見つけた場合にのみgdbを検索します。インデントがすべて乱れているようです。
ネイサンW

また、f.findが正しい使用法ではありません。これは次のように書かれた方が良いでしょう:gist.github.com/4577289もちろんテストされていません。
ネイサンW

f.find **とは思わない
ネイサンW

他の単純化には、csvモジュールを使用してファイルを少し抽象化すること、およびarcpy.da.walk10.1 SP1でArcGISがGISデータタイプのリストを処理できるようにすることが含まれます。
blah238

ありがとう!私はその古いデータベースからできるだけ多くの情報を抽出することに取り組んでいます。
blu_sr

0

プログラミングを避けたい場合、これが最も簡単で最速の方法かもしれません。

ASAP Utilitiesと呼ばれるExcel用のアドオンがあります。90日間の無料試用版がありますが、その後、ビジネスでの使用には49米ドルです。学生または個人の使用は無料です。アドオンは多くの便利な機能を追加します。その1つは、フォルダー構造にファイルのリストを作成することです。また、ファイルのプロパティも提供します。必要に応じて、ファイルタイプごとに結果を制限できます。

これを行う方法のビデオを次に示します。

以前にこのアドオンを使用したことがありますが、結果は非常に高速です。

注、私はこのソフトウェア会社と提携していません。


1
Thnx Fezter、しかし以前のようにGISファイルタイプを取得するとは思わない。.shpは単なる.shpではなく、他の多くのファイルが含まれています。
blu_sr

フォルダー内のすべてのファイルタイプを取得できます。
フェスター

2
それはファイルやパーソナルジオデータベースのうち、GISデータセットを読み込む方法を知っている場合を除き、各ファイルと各データセット間の真の相関関係が存在しないので、それはここで働いならば、私は驚かれると思います@Fetzer
nicksan

そうそう、あなたは正しい。あなたがジオデータベースを持っていなかったのを逃しました。これはうまくいきません。ごめんなさい しかし、それはとにかく良いプラグインです。
フェスター

0

他の答えを完全に得ることができませんでした。

最初の例では、ジオデータベースとシェープファイルの両方があるディレクトリで、ジオデータベースのフィーチャクラスのリストしか取得できませんでしたが、スクリプトのジオデータベース部分をコメントアウトすると、シェープファイルのリストが取得されました。

2番目の例では、ジオデータベース部分がまったく機能しなかったため、最初の例のジオデータベース部分をコピーしました。繰り返しますが、ジオデータベースのみのリストを取得しました。

それから私は、ジオデータベースがシェープファイルの前に読み込まれ、スクリプトがbreakジオデータベースの部分で停止することに気付きました。

Pythonの初心者でbreakあるため、なぜ必要なのかわかりませんが、それなしではスクリプトは無限ループに入るようbreakですタイプがリストされ、問題を解決します:

#create blank text file with open("C:\\Temp\\GISlayers.txt", "w") as txt: for root, dirs, files in os.walk("C:\\Temp\\temp"): for f in files: #look for shapefiles, etc. [code...] for f in files: #look for geodatabases [code...]

私がそれをしたとき、私は完全なリストを得ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.