如何制作GIS库存?


21

我的办公室的GIS部分将发生巨大变化。该部分自1980年代以来一直可操作,并且具有大量的GIS数据(即shapefile,栅格文件,数据等),但从未经过任何清单。现在它将发生。

是否有任何自动方式可以将PC上有关GIS数据的所有信息(即shapefile,arc-info coverage,图层文件,*。mxd,gdb,栅格文件等)提取出来?该信息可能包括创建日期,最后编辑日期,文件夹或容器名称等。


3
您使用的是什么版本的ArcGIS?在10.1 SP1中,通过可以轻松得多arcpy.da.walk
blah238

1
在开始使用python攻击旧服务器之前,从视觉上盘点并草绘设计开始就不会有任何伤害。
罗伊

作为对@Roy的回应-您可以考虑从免费下载开始:voyagergis.com
Czed 2013年

您可能还会考虑元数据搜索门户,例如Esri的免费Geoportal Server
Stephen Lead

Answers:


18

使用arcpy.da.WalkArcGIS 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 2013年

thx的澄清。
艺术品

10

使用Python时,必须使用正确的模块来执行所需的操作。例如,要查找扩展名为shp的目录中的所有文件,提供了许多简单的解决方案,而没有间断,这真是太糟糕了……(就像Nathan W提出的解决方案一样,但是还有很多很多其他解决方案,在互联网上搜索)

有关模块的一些示例:

1)使用glob模块:

仅shapefile:

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

shapefile和地理数据库:

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和list理解(两行)->结果列表

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 2013年

@ blah238,没有,没有尝试,谢谢。
艺术品

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具有很多coverage(arc-info文件)文件,它也可以在它们上工作吗?


至于我的软件版本,我使用的是AG 10.1 SP1,但其他PC使用的则是ESRI软件的各种版本-主要是Arc info。
blu_sr

我实际上不确定是否arcpy.da.walk会列出coverage,但是我猜不会,因为它未在dataType或type过滤器中列出。
blah238

这是代码的较短版本:gist.github.com/4577289。由于shp,lyr和img的逻辑相同,因此我们只需在一条if语句中进行操作即可。
内森·W

2
txt.close()如果您正在使用,也不需要,with因为当块退出时,它将为您执行此操作。
内森·W

4

如果您拥有ArcGIS Desktop 10.0(或其任何Service Pack),我认为最好的办法就是编写一个python脚本,该脚本使用os.walk来浏览已定义的GIS目录并搜索通用的GIS文件扩展名,例如.shp,。 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(或更高版本)的Desktop,则此处还有另一个使用arcpy.da.Walk的答案,该答案在10.0或更早版本中不可用。


您可能需要检查代码。只有先找到形状,它才会搜索gdb。压痕似乎一团糟。
内森·W

我也没有f.find是这里的正确用法。最好这样写:gist.github.com/4577289当然未经测试。
内森·W

不要认为f.find **
Nathan W

其他简化方法包括使用该csv模块对文件进行抽象写入,以及使用arcpy.da.walk10.1 SP1来让ArcGIS处理列出的GIS数据类型。
blah238 2013年

谢谢!我正在努力从那个古老的数据库中提取尽可能多的信息。
blu_sr

0

如果要避免编程,这可能是最简单,最快的方法。

Excel中有一个名为ASAP Utilities的附加程序。有90天的免费试用期,但在此之后,商务用途的费用为49美元。它是免费的,供学生或个人使用。该插件增加了许多有用的功能。其中之一是在文件夹结构中创建文件列表。它还提供文件属性。如果需要,可以按文件类型限制结果。

这是有关如何执行此操作的视频

我以前使用过此加载项,结果很快。

请注意,我与该软件公司无关。


1
Thnx Fezter,但我认为它不会像以前那样获取GIS文件类型。.shp不仅仅是.shp,它还有许多其他文件。
blu_sr

它可以获取文件夹中的所有文件类型。
Fezter

2
@Fetzer除非它知道如何从文件和个人地理数据库中读取GIS数据集,否则如果它能在这里工作,我会感到很惊讶,因为每个文件和每个数据集之间都没有真正的相关性
nicksan

哦,是的,你是对的。我想念您拥有地理数据库。这对您不起作用。对于那个很抱歉。但是,无论如何这都是一个很好的插件。
Fezter

0

我无法获得其他答案才能充分发挥作用。

在第一个示例中,在同时包含地理数据库和shapefile的目录中,我只获得了地理数据库中要素类的列表,但是当我注释掉脚本的地理数据库部分时,便获得了shapefile列表。

在第二个示例中,地理数据库部分根本不起作用,因此我在第一个示例的地理数据库部分中进行了复制。同样,我得到了仅地理数据库的列表。

然后让我大吃一惊:先读取地理数据库,然后再读取shapefile,然后脚本停止在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...]

当我这样做的时候,我得到了完整的清单。

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.