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

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

评论

您使用的是什么版本的ArcGIS?在10.1 SP1上,arcpy.da.walk使其变得更加容易。

在开始使用python攻击旧服务器之前,先进行可视化清单并草绘设计,这永远不会伤害您。

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

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

#1 楼

使用ArcGIS 10.1 SP1中的arcpy.da.Walk函数,这对我有用:

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也可以打开文本文件,只需要提供分隔符即可。

–artwork21
2013年1月20日15:21



是的,但是Excel CSV方言可以解决所有棘手的问题,例如嵌入式引号,换行符和逗号。它也不需要通过向导即可打开文件。

–blah238
2013年1月20日15:34



thx的澄清。

–artwork21
2013年1月20日15:41

#2 楼

使用Python时,必须使用正确的模块来完成所需的操作。
例如,要查找扩展名为shp的目录中的所有文件,提供了许多更简单的解决方案,而且没有间断,这很糟糕...(这是Nathan W提出的解决方案,但是还有很多很多,只需在Internet上搜索即可)

带有相关模块的一些示例:

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

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文件?

–artwork21
2013年1月20日15:18



你试过了吗? glob.glob(“ *。shp”)最终不会返回.shp.xml文件。

–blah238
2013年1月20日15:37

@ blah238,没有,没有尝试,谢谢。

–artwork21
2013年1月20日15:40

#3 楼

感谢Artwork21和Nathan W的回复。是的,Nathen的代码使魔术成为了魔术。我要使用的PC具有很多覆盖率(arc-info文件)文件,它也可以在它们上工作吗?

评论


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

– blu_sr
13年1月20日在10:23



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

–blah238
13年1月20日在10:32

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

–内森·W
13年1月20日在11:58

如果使用with,则也不需要txt.close(),因为它将在块退出时为您执行此操作。

–内森·W
13年1月20日在11:58

#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(或更高版本)用于桌面,则这里还有另一个答案使用的arcpy.da.Walk在10.0或更早版本上不可用。

评论


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

–内森·W
13年1月20日在8:20

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

–内森·W
13年1月20日在8:29



不要以为f.find **

–内森·W
2013年1月20日9:41



其他简化方法包括使用csv模块将文件抽象化,并使用10.1 SP1的arcpy.da.walk让ArcGIS处理列出的GIS数据类型。

–blah238
13年1月20日在10:07

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

– blu_sr
13年1月20日在10:35

#5 楼

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

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

这里有一个有关如何执行此操作的视频。

我以前用过此加载项,结果是非常快。

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

评论


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

– blu_sr
13年1月21日,下午3:57

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

– Fezter♦
13年1月21日在4:26

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

–尼克桑
13年1月22日在20:55

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

– Fezter♦
13年1月22日在22:40

#6 楼

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

在第一个示例中,在同时包含地理数据库和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...]

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