Python脚本在Windows上利用shp2pgsql.exe将shapefile导入到PostgreSQL / PostGIS数据库中

我有一个托pipe在Windows 2008 Server RT虚拟机上的PostgreSQL数据库(是的,我知道它应该托pipe在Linux虚拟机上,但是这是我的组织所要求的,叹息…)

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

我正在寻找通过大量的shapefile文件,并将其几何和文件名称加载到数据库中。

这是我迄今为止工作的摄取function核心部分的要点

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命令或输出到batch file,然后运行它们似乎并没有工作。

Solutions Collecting From Web of "Python脚本在Windows上利用shp2pgsql.exe将shapefile导入到PostgreSQL / PostGIS数据库中"

这里有一些应该使事情工作的修改。 请注意,如果任何命令失败时需要通知,则需要进一步修改。 请注意,它将失败多个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)