Shape文件批量导入File GeoDatabase

开始学习Python有几天的时间了,这些天每天对着电脑看枯燥的代码,自己都快崩溃了,终于功夫不负有心人,写出了自己的第一个批量处理工具:将文件夹中的shape文件批量导入到ArcGIS的File GeoDatabase中。工具界面如图一:

图一    Shape批量导入File GDB工具界面
图一    Shape批量导入File GDB工具界面

从图一看到,工具的界面并不复杂,只需要制定shape文件所在的文件夹和File GDB保存的路径就可以了。通过该工具,可以将指定文件夹根目录下所有的Shape文件和第一级子目录中所有的Shape文件转换到与根目录同名的File GDB数据库中,第一级子目录会转换为FileGDB中同名的Feature Dateset。此工具要求根目录及一级子目录中只能有Shape文件,子目录可以为空,但是空子目录同样会被转换为Feature Dateset。一级子目录中的Shape文件最好都具有相同的坐标系统。FileGDB存储的路径不能与输入的存储shape数据的路径相同,最好也不要放在它的子目录中。

因为是第一次制作工具,所以将代码贴出来,大家一同学习,欢迎批评指正。

import sys
import os
import arcgisscripting
gp = arcgisscripting.create(9.3)
Workspace = sys.argv[1]
gp.Workspace = Workspace
Output_GDB_Path = sys.argv[2]
gp.OverWriteOutput = 1
File_GDB = Output_GDB_Path + os.sep + \
os.path.basename(gp.Workspace) + ".gdb"
gp.CreateFileGDB(Output_GDB_Path, os.path.basename(File_GDB))
gp.AddMessage("++++++++++++++++++++++++++++")
gp.AddMessage("数据库创建成功")
Feature_Classes = gp.ListFeatureClasses()
count1 = len(Feature_Classes)
if count1 > 0:
    for Feature_Class in Feature_Classes:
        gp.CopyFeatures_management(Feature_Class,File_GDB + os.sep + \
            Feature_Class[:-4])
Folder_Lists = os.listdir(gp.Workspace)
for Folder_List in Folder_Lists:
    List_Element = gp.Workspace + os.sep + Folder_List
    if os.path.isdir(List_Element):
        gp.workspace = gp.workspace + os.sep + Folder_List
        gp.CreateFeatureDataset_management(File_GDB,Folder_List)
        gp.AddMessage("++++++++++++++++++++++++++++")
        gp.AddMessage("要素数据集" + str(Folder_List) + "创建成功!")
        Feature_Classes = gp.ListFeatureClasses()
        count2 = len(Feature_Classes)
        if count2 > 0:
            for Feature_Class in Feature_Classes:
                gp.CopyFeatures_management(Feature_Class,File_GDB + \
                    os.sep + Folder_List + os.sep + Feature_Class[:-4])
            gp.AddMessage("++++++++++++++++++++++++++++")
            gp.AddMessage(str(Folder_List) + "中所有文件复制完毕!")
            Dateset_SF = gp.describe(Feature_Class).SpatialReference
            gp.DefineProjection_management(File_GDB + os.sep + \
                Folder_List, Dateset_SF)
            gp.AddMessage("++++++++++++++++++++++++++++")
            gp.AddMessage(str(Folder_List) + "坐标系统定义成功!")
        gp.workspace = Workspace

大家可以移步本站下载区下载该ArcToolbox工具,有任何问题欢迎反馈。该工具在ArcGIS 9.3.1下测试通过。

17 comments

  1. 按照你的方法,我是了一下,还是不行!可能和我的运行环境有关系吧!再次站长的帮助

      1. 今天换了台电脑运行没有问题了!非常感谢!
        就是感觉运行速度稍微有点慢,呵呵!我想如果引用featureclass to geodatabase会不会快一点,呵呵!个人建议,没有试验过,呵呵!再次感谢站长的帮助!

  2. 这个工具很实用!本人刚刚接触python,菜鸟一个,我想请教一下:一个文件夹下有多个子文件,每个子文件中有多个shp,我想把每个子文件夹中的shp文件导入一个以子文件夹命名的mdb中!(即以子文件名创建mdb数据库,然后顺便名称(如ds等)建立数据集,我子文件中的shp导入mdb数据库的数据集(ds)中),最后就是实现了每个子文件夹中的shp文件都导入各自的mdb中,而不是把所有数据都导入一个数据库中,不知道这个代码应该怎样写?望赐教!!

      1. 非常感谢您的帮助,我刚刚试了一下,运行会提示错误
        我在arcgis9.3 sp1的运行环境运行之后,刚刚创建数据库之后,就出现999998的错误。

        下面是运行的结果!
        Executing: shape2MDB D:tts “D:New Folder”
        Start Time: Fri May 04 21:35:31 2012
        Running script shape2MDB…
        >>===============BEGIN=================
        > WorkSpace: D:ttsG48
        > Personal GeoDatabase “D:ttsG48” Create Successful!!!
        ERROR 999998: Unexpected Error.
        Failed to execute (shape2MDB).
        End Time: Fri May 04 21:35:33 2012 (Elapsed Time: 2.00 seconds)

        1. 我是在ArcGIS 9.3.1下测试的。你是直接下载的ArcToolbox工具,还是通过源代码重新编译的?

        2. 参考一下这个:http://webhelp.esri.com/arcgisdesktop/9.3/index.cfm?topicname=tool_errors_and_warnings:999998-999999

        3. 你也可以这样,把那个py文件进行编译,直接运行,而不要用Toolbox工具。修改其中的
          INPUT_fOLDER_PATH = gp.GetParameterAsText(0)
          OUTPUT_FOLDER_PATH = gp.GetParameterAsText(1)
          两行,将gp.GetParameterAsText(0)和gp.GetParameterAsText(1)改为输入和输出的文件地址,形式是这样的:r”D:ttsG48″

        4. 我在9.3.1下测试通过,下面是日志:
          Executing: shape2MDB G:progSHP2GDB G:progaaaa
          Start Time: Sat May 05 00:13:27 2012
          Running script shape2MDB…
          >>===============BEGIN=================
          > WorkSpace: G:progSHP2GDBline
          > Personal GeoDatabase “line.mdb” Create Successful!!!
          > “geol.shp” Copy to line.mdb Successful!!!
          > “geolstr5000.shp” Copy to line.mdb Successful!!!
          > “line_Create.shp” Copy to line.mdb Successful!!!
          > WorkSpace: G:progSHP2GDBpoint
          > Personal GeoDatabase “point.mdb” Create Successful!!!
          > “Export_Output_2.shp” Copy to point.mdb Successful!!!
          > WorkSpace: G:progSHP2GDBpolygon
          > Personal GeoDatabase “polygon.mdb” Create Successful!!!
          > “standb4.shp” Copy to polygon.mdb Successful!!!
          > “standb4_clip.shp” Copy to polygon.mdb Successful!!!
          > “stbuff5000.shp” Copy to polygon.mdb Successful!!!
          >>================END==================
          Completed script shape2MDB…
          Executed (shape2MDB) successfully.
          End Time: Sat May 05 00:14:24 2012 (Elapsed Time: 57.00 seconds)
          经过测试,之前的错误是因为有空文件夹的事情。

发表评论

电子邮件地址不会被公开。 必填项已用*标注