Python脚本使用Windows上的shp2pgsql.exe将shapefile摄取到PostgreSQL / PostGIS数据库中

时间:2014-03-13 22:36:55

标签: python windows postgresql postgis shapefile

我有一个托管在Windows 2008 Server RT虚拟机上的PostgreSQL数据库(是的,我知道它应该托管在Linux VM上,但这正是我的组织所决定的。叹气......)

我们的GIS人员将大量的shapefile转储到存储库中。我们希望有一个自动过程作为计划任务遍历文件夹。我们想将这些添加到Postgres地理数据库中,以用于我们当前正在开发的其他一些流程

我希望遍历大量的shapefile,并将其几何和文件名加载到数据库中。

这是我到目前为止工作的摄取功能的核心部分的要点

import os, subprocess
base_dir = r"c:\shape_file_repository"
full_dir = os.walk(base_dir)
shapefile_list = []
for source, dirs, files in full_dir:
    for file_ in files:
        if file_[-3:] == 'shp':
            #print "Found Shapefile"
            shapefile_path = base_dir + '/' + file_
            shapefile_list.append(shapefile_path)
for paths in shapefile_list:  
    #This is the part where I keep running into trouble. os.system also didnt work
    temp_bat = open(r"c:\temp\temp_shp.bat", "w")
    temp_bat.write(r'start /D c:\Program Files (x86)\PostgreSQL\8.4\bin\shp2pgsql.exe' + \
                   paths + "new_shp_table | psql -d geometry_database")
    temp_bat.close()
    subprocess.Popen(r"c:\temp\temp_shp.bat")

将几何图形加载到新数据库表后,我已经有了代码设置,可以将几何图形从临时表中拉出来,并将其加上shapefile名称加载到主数据库表中。我的问题是我可以通过命令提示符执行此操作,但是通过python运行Windows命令或将它们输出到批处理文件然后运行它们似乎根本不起作用。

1 个答案:

答案 0 :(得分:4)

以下是一些应该使事情有效的修改。请注意,如果需要在任何命令失败时收到通知,则需要进一步修改。请注意,对于多个shapefile,它将失败,因为new_shp_table表已经存在,直到您有其他逻辑在其他位置移动或重命名该表,或者使用唯一名称加载它。

另外,请注意PostgreSQL 8.4将在今年晚些时候达到其使用寿命,因此您可能希望在为时已晚之前升级到更新版本。

import os, subprocess

# Choose your PostgreSQL version here
os.environ['PATH'] += r';C:\Program Files (x86)\PostgreSQL\8.4\bin'
# http://www.postgresql.org/docs/current/static/libpq-envars.html
os.environ['PGHOST'] = 'localhost'
os.environ['PGPORT'] = '5432'
os.environ['PGUSER'] = 'someuser'
os.environ['PGPASSWORD'] = 'clever password'
os.environ['PGDATABASE'] = 'geometry_database'

base_dir = r"c:\shape_file_repository"
full_dir = os.walk(base_dir)
shapefile_list = []
for source, dirs, files in full_dir:
    for file_ in files:
        if file_[-3:] == 'shp':
            shapefile_path = os.path.join(base_dir, file_)
            shapefile_list.append(shapefile_path)
for shape_path in shapefile_list:
    cmds = 'shp2pgsql "' + shape_path + '" new_shp_table | psql '
    subprocess.call(cmds, shell=True)